[cuda] 도커 컨테이너에서 GPU를 사용하십니까?

도커 컨테이너 내부에서 GPU를 사용하는 방법을 찾고 있습니다.

컨테이너는 임의의 코드를 실행하므로 권한 모드를 사용하고 싶지 않습니다.

팁이 있습니까?

이전 연구에서 나는 run -vLXC cgroup가 갈 길이 라는 것을 이해 했지만 정확히 그것을 뽑아내는 방법을 모르겠습니다.



답변

Regan의 대답은 훌륭하지만 조금 오래되었습니다 .Docker가 docker 0.9에서 LXC 를 기본 실행 컨텍스트로 삭제 했기 때문에 올바른 방법은 lxc 실행 컨텍스트를 피하는 것 입니다.

대신 –device 플래그를 통해 docker에게 nvidia 장치에 대해 알리고 lxc 대신 기본 실행 컨텍스트를 사용하는 것이 좋습니다.

환경

이 지침은 다음 환경에서 테스트되었습니다.

  • 우분투 14.04
  • CUDA 6.5
  • AWS GPU 인스턴스.

호스트에 nvidia 드라이버 및 cuda 설치

호스트 시스템 설정을 얻으려면 Ubuntu 14.04실행하는 AWS GPU 인스턴스의 CUDA 6.5를 참조하십시오 .

Docker 설치

$ 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

nvidia 드라이버가 사전 설치된 Docker 컨테이너 실행

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가 올바르게 설치되었는지 확인

방금 시작한 도커 컨테이너 내부에서 실행해야합니다.

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


답변

이미 존재하는 대부분의 답변이 현재 사용되지 않으므로 업데이트 된 답변을 작성하십시오.

이전 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 데몬 실행

구성을 수정하고 컨테이너에 장치에 대한 액세스 권한을 부여하려면 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

NVIDIA 및 CUDA 드라이버로 이미지를 구축하십시오.

다음은 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


답변

우리는 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를 참조하십시오.


답변

우분투 16.04의 cuda-8.0에 맞게 업데이트되었습니다.

도커 파일

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
  1. 컨테이너를 실행

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