2020년 9월 12일 토요일

CUDA on WSL2

딥러닝 맛 좀 보겠다고 GPU 달린 랩탑에 Windows / Ubuntu dual boot도 구성해놨건만, 생각보다 안 쓰게 된다.

일단 회사에서 '개발하는 사장' 직책을 맡고 있어 개발만 붙잡고 있을 순 없는지라... 결국 대부분의 시간을 Windows에서 보내게 되고 어지간한 개발일은 WSL에 의존할 수 밖에 없더라. 물론 최근에는 IAR 사용할 일도 많아서 결국 Ubuntu Linux는 가끔 들어가서 업데이트만 해주는 정도...

500GB 정도 되는 하드를 반씩 파티션 나눠 놨는데, 시간이 흘러 흘러 Windows용 파티션이 이제 50GB 밖에 안남게 되었다. 그래서 다시 dual boot를 없애는 걸 진지하게 고민하게 되었고, CUDA만 WSL에서 된다면 실행하지 못할 이유가 없다는 결론에 도달하였다.

몇달 전에 이미 NVIDIA에서 WSL2에서 CUDA를 쓸 수 있다고 발표도 했고 튜토리얼도 공개했기에 검색해보고 따라해봤다.

해보니 잘 되긴 했는데, 글을 쓰고 있는 현재에는 Windows를 초기화했다.ㅠㅠ

몇가지 느낀 점을 정리하자면...

CUDA 기능만 놓고 본다면 잘 된다.

뭐, 딱히 설명이 필요없다. 대부분 잘 된다. nvidia-smi 빼고... (Known Limitations 3번)

근데, 내가 원했던 것은 WSL2와 '완벽'한 호환이었다. 마치 진짜 Linux를 쓰는 것 같은... 여기서 '완벽'한 WSL2와의 호환이라 함은 가히 Docker Desktop WSL2 Backend의 지원이었다.

Docker를 지원하기는 한다. 그러나 아쉽게도 WSL2 backend는 아니다.

아쉬운대로 WSL로 별도 배포판을 돌려 하나는 WSL2 backend 방식의 Docker 컨테이너들을 돌리고, 다른 하나는 CUDA container를 돌려보려 했건만 결론은 잘 안된다.

Docker Desktop이 실행되고 있는 동안 CUDA container를 돌리려 하면 다음과 같은 에러 메시지가 출력되면서 실행이 되지 않는다.

cgroups: cannot find cgroup mount destination

왜 저런 에러가 발생하는지 모르겠지만 한가지 확실한 것은 Docker Desktop이 중단된 상태에서 실행하면 저런 에러가 발생하지 않는다.

어쩔 수 없이 Docker Desktop WSL2 backend를 사용하지 않고 개발을 해보려고 했으나 이번엔 docker-compose가 말썽이다.

The command 'docker-compose' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.

See https://docs.docker.com/docker-for-windows/wsl/ for details.

Docker Desktop에서 WSL2 integration을 꺼도, Docker Desktop을 꺼도, docker-compose는 무조건 WSL2 backend만 지원하는 것 같았다.

결국 CUDA container까지 포기하고 그냥 개발을 진행하려 했으나...

Windows Insider Dev Channel의 경고는 무시하면 안됐다.

이상하게 부팅될 때마다 WSL이 제대로 실행되지 않거나, 딜레이가 심해진다거나, 무선랜이 자주 끊기거나, CPU가 쉼없이 돈다거나 등등등 여러가지 부작용이 튀어나왔다. 결국 어느샌가 개발은 못하고 삽질만 하고 있는 내 자신을 발견하고 결국 초기화를 할 수밖에 없었다.

CUDA on WSL2는 Windows 10 stable build에서 지원할 때까지 기다리는걸로...

이제 남은 옵션은 (1) 기존처럼 GPU 사용할 때만 듀얼부트로 Ubuntu Linux 들어가서 하거나, (2) 서버에서 하거나, (3) Windows 10에 native CUDA를 설치해서 하거나... 셋 중 하나일 꺼 같았는데... (AHCI를 RAID로 변경하는 통에) Windows 초기화 중에 듀얼부트는 날라갔다.

뭘로 하지...? 이성적으로는 (2)번을 선택해야 진도를 뺄 수 있을 것 같은데... (3)번은 어떨지 궁금하긴 하네...