딥러닝 주니어 성능 최적화 기술면접
새 면접Q. 딥러닝 모델 학습 시 GPU 사용률이 30%에 머물러 있고 학습 속도가 매우 느립니다. 어떤 원인들을 먼저 확인해야 하며, 어떻게 개선할 수 있을까요?
데이터 로딩 파이프라인과 배치 사이즈를 중심으로 생각해보세요.
먼저 데이터 로딩이 병목인지 확인해야 합니다. DataLoader의 num_workers를 증가시켜 멀티프로세싱으로 데이터를 병렬 로드하면 CPU-GPU 간 데이터 전송 대기 시간을 줄일 수 있습니다. 배치 사이즈를 GPU 메모리가 허용하는 범위 내에서 증가시키면 GPU 활용률을 높일 수 있습니다. pin_memory=True 옵션을 사용하면 CPU에서 GPU로 데이터 전송 속도가 빨라집니다. 또한 데이터 전처리를 GPU에서 수행하거나, 전처리된 데이터를 미리 캐싱하는 방법도 효과적입니다.
- • DataLoader의 num_workers 증가로 병렬 데이터 로딩
- • GPU 메모리 범위 내에서 배치 사이즈 증가
- • pin_memory 옵션으로 데이터 전송 속도 개선
대용량 이미지 데이터셋으로 모델을 학습할 때 GPU는 놀고 데이터 로딩만 기다리는 상황을 개선할 때 사용합니다.
num_workers를 무한정 늘리면 항상 성능이 좋아질까요? 적정 값은 어떻게 결정하나요?
Q. 학습 중 Out of Memory 에러가 발생했습니다. 모델 구조는 변경하지 않고 학습을 진행하려면 어떤 최적화 기법들을 적용할 수 있을까요?
배치 사이즈, 그래디언트 처리 방식, 정밀도 등을 고려해보세요.
배치 사이즈를 줄이는 것이 가장 직접적인 방법이지만, Gradient Accumulation을 사용하면 작은 배치를 여러 번 forward-backward한 후 그래디언트를 누적해 큰 배치 효과를 낼 수 있습니다. Mixed Precision Training(FP16)을 적용하면 메모리 사용량을 절반으로 줄이면서도 성능은 유지할 수 있습니다. Gradient Checkpointing을 사용하면 중간 활성화 값을 저장하지 않고 필요할 때 재계산해 메모리를 절약합니다. 또한 optimizer의 상태를 관리하거나, 불필요한 변수의 그래디언트 계산을 비활성화하는 방법도 있습니다.
- • Gradient Accumulation으로 작은 배치로 큰 배치 효과 구현
- • Mixed Precision Training으로 메모리 사용량 절반 감소
- • Gradient Checkpointing으로 중간 활성화 값 메모리 절약
대형 Transformer 모델이나 고해상도 이미지 모델을 제한된 GPU 메모리에서 학습할 때 필수적으로 사용됩니다.
Mixed Precision Training 사용 시 주의해야 할 점이나 발생할 수 있는 문제는 무엇인가요?
Q. 학습된 딥러닝 모델을 실서비스에 배포했는데 추론 속도가 너무 느려 사용자 대기 시간이 길어지고 있습니다. 추론 속도를 개선할 수 있는 방법들을 설명해주세요.
모델 경량화, 배치 처리, 하드웨어 최적화 관점에서 생각해보세요.
model.eval()과 torch.no_grad()를 사용해 그래디언트 계산을 비활성화하면 메모리와 연산량을 줄일 수 있습니다. 여러 요청을 배치로 묶어 처리하면 GPU 활용률이 높아져 전체 처리량이 증가합니다. 모델 양자화(Quantization)를 적용해 FP32를 INT8로 변환하면 모델 크기와 연산량이 크게 감소합니다. TorchScript나 ONNX로 모델을 변환하면 Python 오버헤드를 제거하고 최적화된 추론이 가능합니다. TensorRT 같은 추론 엔진을 사용하면 하드웨어에 최적화된 연산을 수행할 수 있습니다.
- • torch.no_grad()로 그래디언트 계산 비활성화
- • 배치 추론으로 GPU 활용률 향상
- • 모델 양자화와 TorchScript/ONNX 변환으로 최적화
실시간 객체 탐지 API나 챗봇 서비스에서 응답 시간을 줄이기 위해 추론 최적화를 적용합니다.
모델 양자화 시 정확도 손실을 최소화하려면 어떤 방법을 사용할 수 있나요?
Q. 딥러닝 학습 파이프라인에서 성능 병목을 찾기 위해 어떤 도구나 방법을 사용할 수 있나요? 각각 무엇을 측정하는지 설명해주세요.
프로파일링 도구와 모니터링 지표를 중심으로 생각해보세요.
PyTorch Profiler를 사용하면 각 연산의 실행 시간과 메모리 사용량을 상세히 분석할 수 있습니다. nvidia-smi 명령어로 GPU 사용률, 메모리 사용량, 온도 등을 실시간으로 모니터링할 수 있습니다. time 모듈이나 CUDA Event를 사용해 특정 코드 구간의 실행 시간을 직접 측정할 수 있습니다. TensorBoard의 Profiler 플러그인을 활용하면 시각화된 성능 분석 결과를 확인할 수 있습니다. 학습 로그에서 step당 시간, 데이터 로딩 시간 등을 기록해 추세를 파악하는 것도 중요합니다.
- • PyTorch Profiler로 연산별 시간과 메모리 분석
- • nvidia-smi로 GPU 리소스 실시간 모니터링
- • TensorBoard Profiler로 시각화된 성능 분석
학습이 예상보다 오래 걸릴 때 어느 부분이 문제인지 정확히 파악하여 효율적으로 개선하기 위해 사용합니다.
프로파일링 결과를 보고 데이터 로딩과 모델 연산 중 어느 쪽이 병목인지 어떻게 판단하나요?
Q. 단일 GPU로 학습하던 모델을 여러 GPU로 확장하려고 합니다. DataParallel과 DistributedDataParallel의 차이점과 어떤 상황에서 각각을 사용해야 하는지 설명해주세요.
통신 방식과 성능 차이를 중심으로 비교해보세요.
DataParallel은 단일 프로세스에서 멀티스레딩 방식으로 동작하며 구현이 간단하지만, GIL 문제와 GPU 0번에 부하가 집중되는 불균형이 있습니다. DistributedDataParallel은 멀티프로세싱 방식으로 각 GPU마다 독립적인 프로세스가 동작하며, 그래디언트를 효율적으로 동기화해 성능이 훨씬 우수합니다. DDP는 All-Reduce 연산으로 그래디언트를 평균화하며, 단일 노드 다중 GPU뿐 아니라 여러 노드에 걸친 분산 학습도 지원합니다. 프로토타입이나 간단한 실험에는 DataParallel을, 본격적인 학습이나 성능이 중요한 경우에는 DistributedDataParallel을 사용해야 합니다.
- • DataParallel은 멀티스레딩, DDP는 멀티프로세싱 방식
- • DDP가 All-Reduce로 효율적인 그래디언트 동기화 수행
- • 성능이 중요한 실제 학습에는 DDP 사용 권장
대규모 데이터셋으로 ResNet이나 BERT 같은 모델을 학습할 때 여러 GPU를 활용해 학습 시간을 단축합니다.
DistributedDataParallel 사용 시 배치 사이즈는 어떻게 설정해야 하나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!