본 문서에서는 Fresh Windows 10 (or 11)에 WSL2 > Debian > Docker > NVIDIA CUDA를 설치하는 법을 순서대로 설명한다. # WSL2 설치 Ref: https://learn.microsoft.com/ko-kr/windows/wsl/install ## 1. 새로운 Windows에 WSL을 설치하는 경우 Powershell (관리자로 실행) ```Powershell wsl --install ``` ## 2. WSL 리눅스 배포판 설치 Powershell (관리자로 실행) ```Powershell wsl --install -d Debian ``` - 다른 배포판을 설치할 수도 있지만 Debian이 제일 근본이다. ## 3. Windows Terminal 설치 https://apps.microsoft.com/detail/9n0dx20hk701?hl=en-US&gl=US - 현대적인 디자인으로 CMD, powershell, Debian Bash 각각 탭으로 켤수 있다. # Docker 설치 ## 4. WSL에 docker 설치 - `docker daemon`을 실행하려면 `systemd`가 켜져있어야 한다. - 정상적인 linux는 이미 systemd가 실행되어 있지만 wsl에서는 기본적으로 꺼져있다. Debian Bash ```sh echo -e "\n[boot]\nsystemd=true\n" | sudo tee -a /etc/wsl.conf ``` Powershell (관리자로 실행) ```sh wsl --shutdown # 종료 wsl # 재시작 ``` Debian Bash ```sh curl -fsSL https://get.docker.com | sudo sh sudo adduser $USER docker # sudo 없이 docker 실행 su $USER # group 변경은 로그인해야 적용되므로 자신에게 다시 로그인 docker run hello-world ``` 성공 메시지: ``` Hello from Docker! This message shows that your installation appears to be working correctly. ``` ## 5. WSL background 실행 WSL는 기본적으로 실행중인 터미널이 없으면 WSL 자체가 종료되도록 되어 있어서 서버를 굴릴수가 없다. - https://www.autohotkey.com/ - AHK v1.1 (Deprecated) 설치 - Win+R > `shell:startup` : `시작프로그램` 폴더가 열린다. - 메모장으로 아래의 `wsl.ahk` 파일을 생성하여 `시작프로그램` 폴더에 저장 ``` Run, wsl.exe, , Hide ``` - 이제 더블클릭해서 실행해보아도 아무것도 보이지 않지만 눈에 보이지 않는 터미널 하나가 실행되어, wsl이 꺼지지 않게 된다. - 컴퓨터를 재시작 할 경우에도 항상 하나가 켜져 있을 것이다. > 예외: 본인이 `wsl --shutdown`으로 강제 종료하면 눈에 안보이는 이것도 꺼지므로 그때는 저걸 다시 켜주어야 함) # Docker에 NVIDIA 설치 WSL에서 nvidia-driver까지는 자동으로 깔아주므로 별다른 설정 없이 `nvidia-smi`를 사용할 수 있지만 docker container 내부에서 CUDA를 사용하기 위해서는 nvidia-container-toolkit을 설치해야 한다. ## 6. nvidia-container-toolkit 설치 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-with-apt 위의 부분의 명령어를 따라가면 되는데 아래와 같이 WSL Debian 기준으로는 아래와 같이 실행하면 된다. ```sh curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker docker run --gpus all debian nvidia-smi # test ``` `nvidia-smi`가 잘 실행되면 성공이다. # [추가] WSL에 Python & Jupyter Lab 설치 ## 7. debian에 python 설치 ```sh sudo apt-get update && sudo apt-get install -y python3-venv cd ~ python3 -m venv .venv # ~/.venv에 가상환경 python을 만든다. echo 'export PATH="$HOME/.venv/bin:$PATH"' >> ~/.bashrc source ~/.bashrc which python # /home//.venv/bin/python which pip # /home//.venv/bin/pip ``` 이제 activate/deactivate 신경쓰지 않고 pip install로 설치하는 것들은 ~/.venv 안에 잘 설치된다. ```sh pip install jupyter lab jupyter lab --IdentityProvider.token="" # 암호 없이 localhost:8888 로그인 가능 ``` ## 8. Windows 재부팅시 Jupyter Lab 자동시작 먼저 ssh를 통해 비밀번호 없이 자신에게 접속할수 있도록 세팅해야 한다. ```sh sudo apt-get update && sudo apt-get install -y openssh-server sudo systemctl start ssh # ssh-server 시작 ssh-keygen # [Enter] 계속 눌러 ~/.ssh 폴더에 비밀키 생성 ssh localhost # 자기자신으로 접속된다. ssh-copy-id localhost ssh localhost # 자기자신으로 접속되는데 비밀번호가 필요하지 않게 된다. ``` ```sh cd ~ mkdir -p .jupyter # 없으면 폴더를 만든다. cd .jupyter cat <<"EOF" > docker-compose.yml services: jupyter: image: alpine container_name: jupyter restart: unless-stopped stop_grace_period: 0s network_mode: host volumes: - $HOME/.ssh:/root/.ssh entrypoint: sh -c command: - | apk add openssh-client ssh -tt $USER@localhost '~/.venv/bin/jupyter-lab --IdentityProvider.token=""' EOF docker compose up -d # Jupyter 서버 시작 ``` 1. `image: alpine`: 가벼운 Alpine Linux 이미지를 사용합니다. 2. `container_name: jupyter`: 컨테이너 이름을 'jupyter'로 지정합니다. 3. `restart: unless-stopped`: 컨테이너가 중지되지 않는 한 항상 재시작합니다. 4. `stop_grace_period: 0s`: 컨테이너 중지 시 즉시 종료합니다. 5. `network_mode: host`: 호스트의 네트워크를 직접 사용합니다. 6. `volumes: - $HOME/.ssh:/root/.ssh`: SSH 키를 컨테이너와 공유합니다. 7. `entrypoint: sh -c`: 쉘 명령을 실행할 수 있게 합니다. 8. `command:`: - `apk add openssh-client`: SSH 클라이언트를 설치합니다. - `ssh -tt $USER@localhost '~/.venv/bin/jupyter lab --IdentityProvider.token=""`': SSH를 통해 Jupyter Lab을 실행합니다. 이 설정은 다음과 같은 이점이 있습니다: - Alpine 이미지를 사용하여 가볍습니다. - SSH 키를 호스트와 공유하여 인증 문제를 해결합니다. - 호스트 네트워크를 사용하여 localhost 접근이 가능합니다. - 컨테이너가 자동으로 재시작되어 안정성을 높입니다. ```sh docker compose logs -f # 서버 상태 보기 & Ctrl+C로 나오기 cd ~/.jupyter && docker compose down # 서버 종료 ``` - 만약 `5. WSL background 실행`과 `8. Windows 재부팅시 Jupyter Lab 자동시작` 모두 정확히 설정되었다면 윈도우를 재부팅하고 바로 localhost:8888에 접속할 수 있게 된다.