본문 바로가기

etc

WSL에서 GPU를 쓰면 우분투보다 느려질까?

반응형

WSL 2랑 우분투에서 https://github.com/pytorch/benchmark 이 곳의 코드를 돌린 결과 비교글입니다. 환경 통제를 정확히 한게 아니라 성능 차이가 있긴 하구나 정도로 봐주세요. 결과만 보려면 바로 스크롤 내리시면 됩니다.

잡설

GPU를 사용해서 딥러닝 학습 환경을 구축 한다면 기본은 리눅스를 사용한다. 그것도 보통 ubuntu에서 진행할 것이다.

이게 마음에 안들어도 어쩔 수 없다. CUDA와 cuDNN 버전에 쳐맞고 드라이버 버전에 쳐맞고 하다보면 도커를 찾게 되며, GPU와 도커를 같이 쓰려면 리눅스 네이티브를 써야했다.

이런 상황에 WSL 2에서 GPU를 지원하고 심지어 도커랑 물려서 사용이 가능해졌다. 지원을 시작한지 아직 2년도 안됐던거 같다. 윈도우에서 이 세팅을 5월쯤 하고 로컬에서 배치사이즈 작게 해서 학습 잘 돌아가는지만 확인하고 본격적인 클라우드에서 학습 돌리는 방식으로 사용했다.

지금 사용중인 PC는 ASUS ROG STRIX SCAR ||로 2019년 초에 산 게이밍 노트북이다. 딥러닝 돌려볼거라고 RTX 2070 달려있는걸 비싼 돈 주고 샀다. 데스크탑 살 상황이 아니었지만 지금 생각하면 돈이 아깝다. 아무튼 이 랩탑을 살 때는 딥러닝 돌릴거면 다른 선택지가 없이 리눅스를 써야 했다. 그래서 듀얼부팅을 설정해두고 썼다.

돈을 벌게 되니까 데스크탑 맞출 생각부터 들었는데 굳이 로컬에 우분투 설치가 필요할까 생각이 들었다. 어차피 본격적인 학습은 로컬에서 못돌리는데 말이다. 그래서 WSL에서 토치 돌리는거랑 우분투에서 돌리는거랑 속도 비교를 해봐야겠단 생각이 들었다.

실험환경

실험 장비의 스펙은 아래와 같다.

ASUS ROG STRIX SCAR || GL504 (링크)

CPU : Intel Core i7-8750H

GPU : RTX 2070 8GB

RAM : 32GB

두 환경 모두 SSD를 사용했으며 도커 컨테이너 안에서 벤치마크를 돌렸다. 사용한 이미지는 이 파일로 빌드했다.

다만, 드라이버 버전은 서로 다르다. 윈도우에서는 최신 드라이버(510 이상)을 사용했으며 우분투에서는 420번대의 드라이버였을 거다.

torch의 benchmark 레포를 사용했으며 python test_bench.py --benchmark-autosave --cuda_only로 테스트를 돌렸던 거 같다.

결과

코드 결과로 나온 json이다.

ubuntu.json
0.24MB
windows.json
0.25MB

벤치마크는 여러 모델을 돌려서 시간을 측정하게 되는데 train, eval로 또 구분된다. 그리고 실패한 테스트도 있는데 전부 OOM으로 죽었다.

간단하게 말하자면 우분투가 대부분의 경우에서 더 빨랐다. 수행시간의 평균으로 비교했을 때, 10퍼센트 이상 차이가 나는 경우는 32개의 케이스가 있었고, 5퍼센트 이상 차이가 나는 케이스는 58개였다. 중요한 것은 이런 케이스의 대부분이 eval일 때였다.

따라서, train 시에는 그렇게 큰 차이가 난다고 할 수 없었다.

결론

Ubuntu의 실험환경이 꽤 outdate 됐다고는 하나 train 시에는 큰 차이를 볼 수 없었다. batch를 크게 잡거나 하게 되면 이 차이는 더 줄어들 거라고 생각한다.

아래는 10퍼센트 이상 차이나는 케이스들이다.

test_eval[detectron2_fasterrcnn_r_50_fpn-cuda-eager] {'WSL2': 0.04645707142827589, 'Ubuntu': 0.04151197491299409, 'percent': '11.91%', 'win': 'Ubuntu'}
test_eval[detectron2_fcos_r_50_fpn-cuda-eager] {'WSL2': 0.04521637619126566, 'Ubuntu': 0.04096692670843064, 'percent': '10.37%', 'win': 'Ubuntu'}
test_eval[detectron2_maskrcnn-cuda-eager] {'WSL2': 10.156810279999627, 'Ubuntu': 9.035051056599878, 'percent': '12.42%', 'win': 'Ubuntu'}
test_eval[detectron2_maskrcnn_r_101_fpn-cuda-eager] {'WSL2': 0.06813275333212611, 'Ubuntu': 0.06108461517653589, 'percent': '11.54%', 'win': 'Ubuntu'}
test_eval[detectron2_maskrcnn_r_50_fpn-cuda-eager] {'WSL2': 0.05463711052557061, 'Ubuntu': 0.04731256673685972, 'percent': '15.48%', 'win': 'Ubuntu'}
test_eval[dlrm-cuda-eager] {'WSL2': 0.005161353669666265, 'Ubuntu': 0.004158504618338066, 'percent': '24.12%', 'win': 'Ubuntu'}
test_train[drq-cuda-eager] {'WSL2': 0.5286967399995774, 'Ubuntu': 0.24641466179964483, 'percent': '114.56%', 'win': 'Ubuntu'}
test_eval[drq-cuda-eager] {'WSL2': 0.0032228156628241918, 'Ubuntu': 0.001705147208565632, 'percent': '89.01%', 'win': 'Ubuntu'}
test_eval[fastNLP_Bert-cuda-eager] {'WSL2': 0.12246411111199348, 'Ubuntu': 0.10971954029973859, 'percent': '11.62%', 'win': 'Ubuntu'}
test_eval[hf_Albert-cuda-eager] {'WSL2': 0.013057085294028237, 'Ubuntu': 0.011592933594575033, 'percent': '12.63%', 'win': 'Ubuntu'}
test_eval[hf_Bart-cuda-eager] {'WSL2': 0.02074344651123812, 'Ubuntu': 0.015578861403862622, 'percent': '33.15%', 'win': 'Ubuntu'}
test_eval[hf_DistilBert-cuda-eager] {'WSL2': 0.007546502542489611, 'Ubuntu': 0.0065393792594810665, 'percent': '15.40%', 'win': 'Ubuntu'}
test_eval[hf_Reformer-cuda-eager] {'WSL2': 0.018933691666916275, 'Ubuntu': 0.016075776607132348, 'percent': '17.78%', 'win': 'Ubuntu'}
test_eval[hf_T5-cuda-eager] {'WSL2': 0.11817782222270681, 'Ubuntu': 0.10335496679999778, 'percent': '14.34%', 'win': 'Ubuntu'}
test_train[maml-cuda-eager] {'WSL2': 0.7840183999986039, 'Ubuntu': 0.5365911262000737, 'percent': '46.11%', 'win': 'Ubuntu'}
test_eval[maml-cuda-eager] {'WSL2': 0.7779575799999293, 'Ubuntu': 0.5489399125997807, 'percent': '41.72%', 'win': 'Ubuntu'}
test_train[maml_omniglot-cuda-eager] {'WSL2': 4.03127996000112, 'Ubuntu': 3.0495684593997794, 'percent': '32.19%', 'win': 'Ubuntu'}
test_eval[maml_omniglot-cuda-eager] {'WSL2': 0.0010878152172944797, 'Ubuntu': 0.0007031760892907967, 'percent': '54.70%', 'win': 'Ubuntu'}
test_eval[mobilenet_v2-cuda-jit] {'WSL2': 0.007697550648885368, 'Ubuntu': 0.006310126371054768, 'percent': '21.99%', 'win': 'Ubuntu'}
test_eval[mobilenet_v2-cuda-eager] {'WSL2': 0.009010422608496257, 'Ubuntu': 0.006672460286827399, 'percent': '35.04%', 'win': 'Ubuntu'}
test_eval[opacus_cifar10-cuda-eager] {'WSL2': 0.005407065317987577, 'Ubuntu': 0.0038632479356370754, 'percent': '39.96%', 'win': 'Ubuntu'}
test_eval[pyhpc_isoneutral_mixing-cuda-eager] {'WSL2': 0.041509386957762254, 'Ubuntu': 0.034404054666588815, 'percent': '20.65%', 'win': 'Ubuntu'}
test_eval[pyhpc_turbulent_kinetic_energy-cuda-jit] {'WSL2': 0.015188459648670048, 'Ubuntu': 0.011865412328987938, 'percent': '28.01%', 'win': 'Ubuntu'}
test_eval[pyhpc_turbulent_kinetic_energy-cuda-eager] {'WSL2': 0.021513075000422596, 'Ubuntu': 0.018819850879790465, 'percent': '14.31%', 'win': 'Ubuntu'}
test_eval[resnet18-cuda-jit] {'WSL2': 0.003966877251100435, 'Ubuntu': 0.0034646870323928377, 'percent': '14.49%', 'win': 'Ubuntu'}
test_eval[resnet18-cuda-eager] {'WSL2': 0.00498439414862313, 'Ubuntu': 0.003883360546284267, 'percent': '28.35%', 'win': 'Ubuntu'}
test_train[soft_actor_critic-cuda-eager] {'WSL2': 0.013988881081073684, 'Ubuntu': 0.008753777258632533, 'percent': '59.80%', 'win': 'Ubuntu'}
test_eval[soft_actor_critic-cuda-eager] {'WSL2': 0.01165423626390383, 'Ubuntu': 0.005718114399985227, 'percent': '103.81%', 'win': 'Ubuntu'}
test_eval[speech_transformer-cuda-eager] {'WSL2': 4.763753560002078, 'Ubuntu': 3.0903575931999514, 'percent': '54.15%', 'win': 'Ubuntu'}
test_eval[squeezenet1_1-cuda-jit] {'WSL2': 0.003818807763525404, 'Ubuntu': 0.0033209176297754562, 'percent': '14.99%', 'win': 'Ubuntu'}
test_eval[squeezenet1_1-cuda-eager] {'WSL2': 0.005281200000058287, 'Ubuntu': 0.004529447619028187, 'percent': '16.60%', 'win': 'Ubuntu'}
test_eval[vision_maskrcnn-cuda-eager] {'WSL2': 0.674352939997334, 'Ubuntu': 0.5504744331998154, 'percent': '22.50%', 'win': 'Ubuntu'}
반응형

'etc' 카테고리의 다른 글

맥북에어 M1 코딩용 사용기  (11) 2021.06.08