도커 컨테이너 내부에서 GPU를 사용하는 방법을 찾고 있습니다.
컨테이너는 임의의 코드를 실행하므로 권한 모드를 사용하고 싶지 않습니다.
팁이 있습니까?
이전 연구에서 나는 run -v
LXC cgroup
가 갈 길이 라는 것을 이해 했지만 정확히 그것을 뽑아내는 방법을 모르겠습니다.
도커 컨테이너 내부에서 GPU를 사용하는 방법을 찾고 있습니다.
컨테이너는 임의의 코드를 실행하므로 권한 모드를 사용하고 싶지 않습니다.
팁이 있습니까?
이전 연구에서 나는 run -v
LXC cgroup
가 갈 길이 라는 것을 이해 했지만 정확히 그것을 뽑아내는 방법을 모르겠습니다.
답변:
Regan의 대답은 훌륭하지만 조금 오래되었습니다 .Docker가 docker 0.9에서 LXC 를 기본 실행 컨텍스트로 삭제 했기 때문에 올바른 방법은 lxc 실행 컨텍스트를 피하는 것 입니다.
대신 --device 플래그를 통해 docker에게 nvidia 장치에 대해 알리고 lxc 대신 기본 실행 컨텍스트를 사용하는 것이 좋습니다.
이 지침은 다음 환경에서 테스트되었습니다.
호스트 시스템 설정을 얻으려면 Ubuntu 14.04 를 실행하는 AWS GPU 인스턴스의 CUDA 6.5를 참조하십시오 .
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update && sudo apt-get install lxc-docker
ls -la /dev | grep nvidia
crw-rw-rw- 1 root root 195, 0 Oct 25 19:37 nvidia0
crw-rw-rw- 1 root root 195, 255 Oct 25 19:37 nvidiactl
crw-rw-rw- 1 root root 251, 0 Oct 25 19:37 nvidia-uvm
cuda 드라이버가 사전 설치된 도커 이미지 를 만들었습니다 . dockerfile는 이 이미지가 구축 된 방법을 알고 싶다면 dockerhub 볼 수 있습니다.
nvidia 장치와 일치하도록이 명령을 사용자 정의하려고합니다. 나를 위해 일한 것은 다음과 같습니다.
$ sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm tleyden5iwx/ubuntu-cuda /bin/bash
방금 시작한 도커 컨테이너 내부에서 실행해야합니다.
CUDA 샘플 설치 :
$ cd /opt/nvidia_installers
$ ./cuda-samples-linux-6.5.14-18745345.run -noprompt -cudaprefix=/usr/local/cuda-6.5/
deviceQuery 샘플을 빌드하십시오.
$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery
모든 것이 작동하면 다음과 같은 결과가 나타납니다.
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs = 1, Device0 = GRID K520
Result = PASS
ls -la /dev | grep nvidia
하지만 CUDA는 CUDA 가능 장치를 찾을 수 없습니다 : ./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 38
-> no CUDA-capable device is detected
Result = FAIL
호스트와 컨테이너의 CUDA 라이브러리가 일치하지 않기 때문입니까?
이미 존재하는 대부분의 답변이 현재 사용되지 않으므로 업데이트 된 답변을 작성하십시오.
이전 Docker 19.03
에 필요한 버전 nvidia-docker2
및 --runtime=nvidia
플래그.
이후 패키지 Docker 19.03
를 설치 nvidia-container-toolkit
한 후 --gpus all
플래그 를 사용해야합니다 .
기본은 다음과 같습니다.
패키지 설치
Github 공식 문서에 따라 nvidia-container-toolkit
패키지를 설치하십시오 .
Redhat 기반 OS의 경우 다음 명령 세트를 실행하십시오.
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
$ sudo yum install -y nvidia-container-toolkit
$ sudo systemctl restart docker
데비안 기반 OS의 경우 다음 명령 세트를 실행하십시오.
# Add the package repositories
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker
GPU 지원으로 도커 실행
docker run --name my_all_gpu_container --gpus all -t nvidia/cuda
이 플래그 --gpus all
는 사용 가능한 모든 gpus를 docker container에 할당하는 데 사용됩니다.
도커 컨테이너에 특정 GPU를 할당하려면 (컴퓨터에서 여러 GPU를 사용할 수있는 경우)
docker run --name my_first_gpu_container --gpus device=0 nvidia/cuda
또는
docker run --name my_first_gpu_container --gpus '"device=0"' nvidia/cuda
Ok --privileged 모드를 사용하지 않고 마침내 관리했습니다.
우분투 서버 14.04에서 실행 중이며 최신 cuda (리눅스 13.04 64 비트의 경우 6.0.37)를 사용하고 있습니다.
호스트에 nvidia 드라이버 및 cuda를 설치하십시오. (약간 까다로울 수 있으므로이 안내서 /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 을 따르십시오. )
주의 : 호스트 cuda 설치에 사용한 파일을 보관하는 것이 중요합니다
구성을 수정하고 컨테이너에 장치에 대한 액세스 권한을 부여하려면 lxc 드라이버를 사용하여 docker 데몬을 실행해야합니다.
한 번 활용 :
sudo service docker stop
sudo docker -d -e lxc
영구 구성 / etc / default / docker에있는 도커 구성 파일 수정 '-e lxc'를 추가하여 DOCKER_OPTS 행을 변경하십시오. 수정 후 내 행은 다음과 같습니다.
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
그런 다음 다음을 사용하여 데몬을 다시 시작하십시오.
sudo service docker restart
데몬이 효과적으로 lxc 드라이버를 사용하는지 확인하는 방법은 무엇입니까?
docker info
실행 드라이버 줄은 다음과 같아야합니다.
Execution Driver: lxc-1.0.5
다음은 CUDA 호환 이미지를 빌드하기위한 기본 Dockerfile입니다.
FROM ubuntu:14.04
MAINTAINER Regan <http://stackoverflow.com/questions/25185405/using-gpu-from-a-docker-container>
RUN apt-get update && apt-get install -y build-essential
RUN apt-get --purge remove -y nvidia*
ADD ./Downloads/nvidia_installers /tmp/nvidia > Get the install files you used to install CUDA and the NVIDIA drivers on your host
RUN /tmp/nvidia/NVIDIA-Linux-x86_64-331.62.run -s -N --no-kernel-module > Install the driver.
RUN rm -rf /tmp/selfgz7 > For some reason the driver installer left temp files when used during a docker build (i don't have any explanation why) and the CUDA installer will fail if there still there so we delete them.
RUN /tmp/nvidia/cuda-linux64-rel-6.0.37-18176142.run -noprompt > CUDA driver installer.
RUN /tmp/nvidia/cuda-samples-linux-6.0.37-18176142.run -noprompt -cudaprefix=/usr/local/cuda-6.0 > CUDA samples comment if you don't want them.
RUN export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64 > Add CUDA library into your PATH
RUN touch /etc/ld.so.conf.d/cuda.conf > Update the ld.so.conf.d directory
RUN rm -rf /temp/* > Delete installer files.
먼저 장치와 관련된 주요 번호를 식별해야합니다. 가장 쉬운 방법은 다음 명령을 수행하는 것입니다.
ls -la /dev | grep nvidia
결과가 비어 있으면 호스트에서 샘플 중 하나를 시작하여 트릭을 수행하십시오. 결과는 다음과 같습니다 . 그룹과 날짜 사이에 2 개의 숫자 세트가 있습니다. 이 두 번호는 주 번호와 부 번호 (순서대로 기록)라고하며 장치를 설계합니다. 편의상 주요 숫자 만 사용하겠습니다.
lxc 드라이버를 활성화 한 이유는 무엇입니까? 컨테이너가 해당 장치에 액세스하도록 허용하는 lxc conf 옵션을 사용합니다. 옵션은 다음과 같습니다 (작은 번호에는 *를 사용하여 실행 명령의 길이를 줄이십시오).
--lxc-conf = 'lxc.cgroup.devices.allow = c [주수] : [부수 또는 *] rwm'
따라서 컨테이너를 시작하려면 이미지 이름을 cuda로 바꾸십시오.
docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda
--device
컨테이너가 호스트의 장치에 액세스 할 수 있는 옵션이 있습니다. 그러나 --device=/dev/nvidia0
도커 컨테이너가 cuda를 실행할 수 있도록 시도했지만 실패했습니다.
/dev/nvidiao
, /dev/nvidia1
, /dev/nvidiactl
와 /dev/nvidia-uvm
함께 --device
. 이유를 모르겠지만.
/dev/nvidia*
@Regan 에 대한 힌트를 주셔서 감사합니다 . @ChillarAnand를 위해 cuda-docker를
우리는 Docker 컨테이너 내에서 NVIDIA GPU를 사용하는 프로세스를 용이하게 하는 실험적인 GitHub 리포지토리 를 출시했습니다 .
NVIDIA의 최근 개선 사항으로 훨씬 강력한 방법이 만들어졌습니다.
기본적으로 컨테이너 안에 CUDA / GPU 드라이버를 설치하지 않고 호스트 커널 모듈과 일치시킬 필요가없는 방법을 찾았습니다.
대신, 드라이버는 호스트에 있으며 컨테이너에는 필요하지 않습니다. 지금 수정 된 docker-cli가 필요합니다.
컨테이너가 훨씬 더 휴대 가능하기 때문에 이것은 훌륭합니다.
우분투에 대한 빠른 테스트 :
# Install nvidia-docker and nvidia-docker-plugin
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
# Test nvidia-smi
nvidia-docker run --rm nvidia/cuda nvidia-smi
자세한 내용은 GPU 지원 Docker 컨테이너 및 https://github.com/NVIDIA/nvidia-docker를 참조하십시오.
도커 설치 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
nvidia 드라이버 및 cuda 툴킷이 포함 된 다음 이미지를 빌드하십시오.
도커 파일
FROM ubuntu:16.04
MAINTAINER Jonathan Kosgei <jonathan@saharacluster.com>
# A docker container with the Nvidia kernel module and CUDA drivers installed
ENV CUDA_RUN https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run
RUN apt-get update && apt-get install -q -y \
wget \
module-init-tools \
build-essential
RUN cd /opt && \
wget $CUDA_RUN && \
chmod +x cuda_8.0.44_linux-run && \
mkdir nvidia_installers && \
./cuda_8.0.44_linux-run -extract=`pwd`/nvidia_installers && \
cd nvidia_installers && \
./NVIDIA-Linux-x86_64-367.48.run -s -N --no-kernel-module
RUN cd /opt/nvidia_installers && \
./cuda-linux64-rel-8.0.44-21122537.run -noprompt
# Ensure the CUDA libs and binaries are in the correct environment variables
ENV LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64
ENV PATH=$PATH:/usr/local/cuda-8.0/bin
RUN cd /opt/nvidia_installers &&\
./cuda-samples-linux-8.0.44-21122537.run -noprompt -cudaprefix=/usr/local/cuda-8.0 &&\
cd /usr/local/cuda/samples/1_Utilities/deviceQuery &&\
make
WORKDIR /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm <built-image> ./deviceQuery
다음과 유사한 출력이 표시되어야합니다.
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520
Result = PASS
고유 Docker를 사용하는 대신 docker 컨테이너에서 GPU를 사용하려면 Nvidia-docker를 사용하십시오. Nvidia docker를 설치하려면 다음 명령을 사용하십시오.
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-
docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker
sudo pkill -SIGHUP dockerd # Restart Docker Engine
sudo nvidia-docker run --rm nvidia/cuda nvidia-smi # finally run nvidia-smi in the same container
mviereck의 x11docker 사용 :
https://github.com/mviereck/x11docker#hardware-acceleration 말한다
하드웨어 가속
옵션 -g, --gpu를 사용하여 OpenGL의 하드웨어 가속이 가능합니다.
이것은 대부분의 경우 호스트의 오픈 소스 드라이버에서 즉시 작동합니다. 그렇지 않으면 wiki : 기능 종속성을 살펴보십시오. 비공개 소스 NVIDIA 드라이버에는 약간의 설정이 필요하며 x11docker X 서버 옵션을 지원하지 않습니다.
이 스크립트는 모든 구성 및 설정을 처리하므로 매우 편리합니다. GPU로 X에서 도커 이미지를 실행하는 것은 간단합니다.
x11docker --gpu imagename