- GPU 효율적인 코드의 핵심은 CPU-GPU 스트림 동기화를 최소화하는 것입니다. 불필요한 대기 시간을 줄여 GPU 활용도를 극대화할 수 있습니다. 💡
- 텐서 생성 시
device='cuda'파라미터를 사용하여 CPU를 거치지 않고 GPU 메모리에 직접 할당함으로써 불필요한 데이터 복사와 강제 동기화를 방지하고 병렬성을 높입니다. 🚀 - 런타임에 상수값 텐서를 생성하는 대신, 모듈 초기화 시
register_buffer를 이용해 GPU에 미리 올려두면 매 이터레이션마다 발생하는 복사 및 동기화 오버헤드를 제거할 수 있습니다. 💾 - CPU에 존재하는 정적 마스크나 가중치를 포워드 패스에서 사용하는 경우, 이 역시
register_buffer를 통해 GPU에 미리 계산하여 옮겨두면 효율적인 연산이 가능합니다. 🎭 - 동적 인덱싱(예:
tensor[tensor > value])은 GPU의 셰이프 추론을 어렵게 하여 CPU 복사 및 동기화를 유발하므로, 대신 벡터-행렬 곱셈과 같은 고정된 셰이프의 연산으로 대체하여 GPU에서 직접 처리하도록 합니다. ✖️ DataLoader의pin_memory=True옵션을 올바르게 활용하고, 데이터를 CPU에서 처리하기 전에non_blocking=True와 함께 즉시 GPU로 전송하여 추가 복사 없이 비동기 처리를 가능하게 합니다. 📌DistributedDataParallel의find_unused_parameters=True와 같은 디버깅 목적의 옵션은 매 이터레이션마다 불필요한 오버헤드를 발생시키므로, 프로덕션 환경에서는 끄는 것이 학습 속도에 유리합니다. ⚙️- GPU 최적화는 복잡한 엔지니어링 기술보다는 CPU와 GPU의 동작 방식에 대한 이해를 바탕으로 한 간단한 코딩 습관 개선에서 시작됩니다. ✨





