어쩌다보니 GPU 서버를 운용중인데 jupyter notebook(lab)을 사용해서 친구와 같이 모델 개발하려고 합니다. 서버가 멀티 GPU라서 잘 돌아가고있는 GPU를 아예 사용 못하게 하고싶어서(혹시나 서비스 되고있던게 브램 부족으로 터질까 싶어서 아예 안보이게 하고싶습니다.) 이것저것 시도중인데 잘 안됩니다. 즉, 도커 컨테이너 내부에서 nvidia-smi 명령어를 사용했을 때 호스트에 있는 모든 GPU가 표시되지 않고 컨테이너에 할당되어있는 GPU만 보이도록 하고싶습니다.
OS: Ubuntu 20.04 LTS
Nvidia Driver: 530.30.02
sudo apt install nvidia-docker2 로 커널 설치 되어있습니다.(2.13.0-1)
docker-compose는 v2로 업데이트 되어있습니다.(v2.17.2)
ChatGPT에게도 이것저것 해결 방법을 물어봤는데 딱히 맞는 답변이 없네요.
ChatGPT가 알려준 방법:
1.
version: "3.9"
services:
myservice:
image: myimage
runtime: nvidia
devices:
- /dev/nvidiactl
- /dev/nvidia-uvm
- /dev/nvidia0
- /dev/nvidia1
environment:
- NVIDIA_VISIBLE_DEVICES=0 # 첫 번째 GPU만 사용하도록 설정
위의 docker-compose.yml 파일 양식으로 환경 변수 사용하기
--> 결과
nvidia-smi 명령 실행 시 동일하게 모든 GPU가 출력됨.
2.
죄송합니다. 이전에 제공한 정보가 부정확했습니다. `NVIDIA_VISIBLE_DEVICES` 환경 변수를 사용하여도 컨테이너 내부에서 `nvidia-smi`를 실행할 때 모든 GPU가 표시될 수 있습니다. `NVIDIA_VISIBLE_DEVICES` 환경 변수는 컨테이너 내부에서만 가시성을 제어할 뿐, `nvidia-smi` 명령어가 호스트 시스템의 Nvidia 드라이버를 사용하기 때문에 호스트 시스템의 GPU 가시성에 영향을 주지 않습니다.
만약 컨테이너 내부에서 특정 GPU만 표시하도록 하려면 추가적인 설정이 필요합니다. 아래의 단계를 따라 진행해주세요:
1. 호스트 시스템의 Nvidia 드라이버를 최신 버전으로 업데이트합니다.
2. 호스트 시스템의 Nvidia 드라이버 설정 파일(`/etc/nvidia-container-runtime/config.toml`)을 엽니다.
3. 설정 파일에서 `[nvidia-container-runtime]` 섹션을 찾습니다.
4. 해당 섹션에 `no-cgroups = true`라는 줄을 추가합니다.
5. Docker를 재시작합니다.
이렇게 설정을 변경하면 컨테이너 내부에서 `nvidia-smi`를 실행했을 때, `NVIDIA_VISIBLE_DEVICES` 환경 변수로 지정한 GPU만 표시될 것입니다.
다시 한 번 사과드리며, 이전에 제공한 부정확한 정보로 혼동을 드려 죄송합니다.
--> 결과
nvidia-smi 명령 실행 시 동일하게 모든 GPU가 출력됨.
3.
죄송합니다. 다시 한 번 정확한 정보를 전달하지 못한 것 같습니다. `no-cgroups = true`를 설정하여도 `nvidia-smi`에서의 GPU 표시에는 영향을 주지 않습니다.
일반적으로 Docker 컨테이너 내부에서 `nvidia-smi`를 실행하면 호스트 시스템의 Nvidia 드라이버를 사용하게 됩니다. 따라서 호스트 시스템에서 GPU 가시성을 변경하거나 제한하는 설정을 적용해야 원하는 결과를 얻을 수 있습니다.
GPU 가시성을 제한하려면 Nvidia 드라이버 설정을 변경해야 합니다. Nvidia 드라이버가 설치된 호스트 시스템에서 다음과 같은 단계를 수행하여 GPU 가시성을 제어할 수 있습니다:
1. `/etc/nvidia-container-runtime/config.toml` 파일을 엽니다.
2. `[nvidia-container-cli]` 섹션을 찾습니다.
3. 해당 섹션에 `ldconfig = "/usr/local/nvidia/lib:/usr/local/nvidia/lib64"`라는 줄을 추가합니다. 이렇게 하면 컨테이너 내에서 Nvidia 라이브러리가 올바르게 로드됩니다.
4. 설정 파일을 저장하고 닫습니다.
5. 호스트 시스템에서 Docker를 재시작합니다. 이는 앞서 설명한 방법을 사용하여 수행할 수 있습니다. (예: `sudo systemctl restart docker`)
이렇게 설정을 변경하고 Docker를 재시작한 후 컨테이너를 시작하면 `NVIDIA_VISIBLE_DEVICES` 환경 변수로 지정한 GPU만 컨테이너 내에서 `nvidia-smi`를 실행할 때 표시될 것입니다.
다시 한 번 사과드리며, 이전에 제공한 잘못된 정보로 혼동을 드려 죄송합니다.
--> 결과
NVIDIA-SMI couldn't find libnvidia-ml.so library in your system. Please make sure that the NVIDIA Display Driver is properly installed and present in your system. Please also try adding directory that contains libnvidia-ml.so to your system PATH.
라는 오류가 발생.
---------
현재 docker-compose.yml
version: "3.1"
services:
jupyter:
image: jupyter/datascience-notebook:python-3.9.13
runtime: nvidia
restart: unless-stopped
container_name: Jupyter_Notebook
environment:
- NVIDIA_VISIBLE_DEVICES=0
- UID=1000
- GID=1000
volumes:
- ./jun_jupyter:/home/jovyan/
- ./.jupyter-jun:/home/jovyan/.jupyter
ports:
- 8888:8888
privileged: true
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['0']
capabilities: [gpu]
일단 이렇게 놔뒀는데 뭘 어떻게 해야할지 감도 안잡히는 상황입니다..
추가적인 정보가 필요하다면 댓글 부탁드립니다.
감사합니다.
다만 NVIDIA_VISIBLE_DEVICES는 docker 명령어로 직접 컨테이너를 실행하는 경우에만 잘 될 것 같다는 느낌입니다. 해당 인자는 nvidia-docker에서 받아야 하는데, docker-compose를 통해 실행하는 경우 그렇지 않을 것 같아서요.