도커 컨테이너에서 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