CUDA - GPU로 push, synchronize, 병렬처리 등.. 대해 알아보자
CUDA(computed unified device architecture)는 GPU에서 수행하는 병렬 처리 알고리즘을 C 프로그래밍 언어 등을 사용해서 작성할 수 있도록 하는 nvidia에서 개발 중인 GPGPU 기술이다.
1. 메인 메모리를 GPU 메모리로 복사 --> 2. CPU가 GPU에 프로세스 지시
3. GPU가 각 코어에 병렬 수행 --> 4. GPU 메모리부터 결과물을 메인 메모리로 다시 복사
(위 설명은 wiki 출처)
- 데이터 GPU로 push하기
데이터를 GPU 메모리로 push하기 위해서는 data = data.to('cuda')를 사용하면 되고, print(data.device)를 통해 push한 device를 확인할 수 있다.
data = data.to('cuda')
print(data.device)
- CUDA synchronize
CUDA operations은 asynchronous하게 (비동기적으로) 동작하기 때문에, DataLoader가 CUDA operation이 끝나길 기다려야 하고, 잘못된 결과를 낼 수도 있다.
따라서 모델의 forward, backward 전후에 torch.cuda.synchronize() 을 사용해주어 수동적으로 동기화해주는 것이 좋다.
병렬처리
- nn.DataParallel
nn.DataParallel은 forward pass에서 각 GPU 디바이스에 모델을 복제하고, batch 차원(dim0)에서 데이터 tensor를 분할하고, 분할된 데이터 덩어리를 각 디바이스에 전달한다.
- nn.DistributedDataParallel
각 프로세스는 데이터의 subset을 load할 수 있다. DataPrallel과 DistributedDataparallel(DDP)를 비교했을 때는 DDP가 더 빠르다고 한다. 두 개에 대한 더 자세한 설명과 차이점은 앞으로 알아볼 예정
-계속 추가중-
참고 사이트:
https://ko.wikipedia.org/wiki/CUDA
https://discuss.pytorch.org/t/how-to-load-all-data-into-gpu-for-training/27609/18
'python' 카테고리의 다른 글
torch.tensor mul_ (0) | 2022.07.21 |
---|---|
[pycharm] 단축키 정리 (0) | 2022.06.22 |
[warning] Leaking Caffe2 thread-pool after fork 해결하기 (0) | 2022.05.27 |
[python] Logger class, timezone Seoul (0) | 2022.05.27 |
[pycharm] debugger- collecting data 에러 (0) | 2022.05.27 |