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


164

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

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

팁이 있습니까?

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


필요와 비슷한 stackoverflow.com/questions/17792161/… 을 참조하십시오 .
Nicolas Goy

1
@NicolasGoy 보안상의 이유로 권한을 사용할 수 없으므로 링크는 좋지만 유용하지는 않습니다. lxc-cgroups는 좋은 포인터 였지만 충분하지 않았습니다. 나는 방법을 찾았고 모든 것이 연마 될 때 스스로 대답 할 것입니다.
Regan

답변:


132

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

3
lxc가 필요하지 않은 경우 왜 lxc-docker를 설치합니까?
MP0 2013

4
호스트에 CUDA 5.5가 있고 이미지에서 만든 컨테이너에 CUDA 6.5가 있습니다. CUDA는 호스트에서 작업 중이며 장치를 컨테이너로 전달했습니다. 컨테이너는 GPU를 인식 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 라이브러리가 일치하지 않기 때문입니까?
brunetto

1
몰라, 당신은 엔비디아 포럼에 물어보고 싶을 수도 있습니다. 버전 불일치가 문제라고 가정하면이 Dockerfile을 가져 와서 CUDA 5.5 드라이버를 갖도록 편집 한 다음 새 Docker 이미지를 다시 빌드하여 사용할 수 있습니다.
tleyden

3
이미지가 nvidia 드라이버를 설치해야하는 이유를 설명 할 수 있습니까? nvidia 드라이버를 설치하는 호스트 만 충분하고 --device ...를 사용하는 것으로 충분하다고 생각 했습니까?
Helin Wang

2
현재 Windows를 호스트로 사용하는 경우에는이 작업을 수행 할 수 없습니다.
Souradeep Nanda

46

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

이전 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

5
2019 년 현재 도커 컨테이너 내에서 GPU를 사용하는 올바른 방법입니다.
Timur Bakeyev

1
누구든지 AWS의 Batch 작업에서 이것을 시도한 적이 있습니까?
medley56

1
나는 이것이 가장 관련이 있다고 생각합니다. 내가의 지침에 적응했다지만 위시 나는 빨리 그것을 발견했다 github.com/NVIDIA/nvidia-docker을 우분투 20.04와 함께 작동하도록
VictorLegros

40

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

컨테이너를 공유 할 수 있습니까?
ChillarAnand

1
Docker에는 --device컨테이너가 호스트의 장치에 액세스 할 수 있는 옵션이 있습니다. 그러나 --device=/dev/nvidia0도커 컨테이너가 cuda를 실행할 수 있도록 시도했지만 실패했습니다.
shiquanwang

4
나는 모든 노출을 성공 /dev/nvidiao, /dev/nvidia1, /dev/nvidiactl/dev/nvidia-uvm함께 --device. 이유를 모르겠지만.
shiquanwang

이 솔루션을 찾아야 할 때 --device 옵션이 구현되지 않았습니다. nvidia0 또는 nvidia1 (그래픽 카드) 및 nvidiactl (일반 nvidia 장치) 및 nvidia-uvm (미국 메모리 장치)이 필요합니다.
Regan

2
/dev/nvidia*@Regan 에 대한 힌트를 주셔서 감사합니다 . @ChillarAnand를 위해 cuda-docker를
shiquanwang

29

우리는 Docker 컨테이너 내에서 NVIDIA GPU를 사용하는 프로세스를 용이하게 하는 실험적인 GitHub 리포지토리 를 출시했습니다 .


4
윈도우 지원이 있습니까? 보이지 않는 것 같지만 아마도 뭔가 빠진 것 같습니다.
Blaze

6
Windows 지원이 없습니다. CUDA 컨테이너를 실행하려면 Linux 용 Nvidia 드라이버와 GPU를 나타내는 Linux 장치 (예 : / dev / nvidia0)에 액세스해야합니다. Docker가 Windows에 설치되어 있고 VirtualBox 가상 머신 내부에서 실행중인 경우 이러한 장치 및 드라이버를 사용할 수 없습니다.
Paweł Bylica

여전히 run 명령에 --device 선언이 필요합니까? nvidia / cuda에서 컨테이너를 만들었고 컨테이너가 제대로 실행되지만 호스트에서 직접 실행할 때 응용 프로그램 (Wowza)이 GPU를 인식하지 못하지만 GPU를 인식하지 못합니다 (이 호스트는 드라이버가 정상임을 알고 있습니다) . 361.28을 실행 중입니다. 호스트는 g2.8xlarge에서 NVidia AMI를 사용하는 EC2입니다.
rainabba

nvidia-docker가 모든 것을 처리
하지는 않습니다

22

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


모든 단계를 완료하면 잘 작동합니다. Nvidia는 한곳에서 모든 것을 제공 하지는 않지만 이 예제 는 일반적인 사용 사례에서 작동하도록하는 데 필요한 모든 것을 제공합니다.
KobeJohn

@KobeJohn-방금 설치 지침, 명령 줄 사용 방법 및 컨테이너가 cuda 컨테이너를 상속하는지 확인하는 방법을 따랐습니다. 그것은 나를 위해 작동합니다.
Matt

1
실제로 nvidia-docker 사용이 의미가있는 실제 시나리오를 제공 할 수 있습니까?
Suncatcher

@Suncatcher-3D 렌더링을 위해 GPU에 액세스 해야하는 클러스터에서 사용하고 있습니다. 앱을 도킹하면 배포 및 유지 관리가 더 간단 해졌습니다.
Matt

17

우분투 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


3
나는 다음과 같은 결과를 얻는다. cudaGetDeviceCount 38 반환 -> 더 CUDA 가능 디바이스는 = FAIL 결과 검출되지 않은
쇼이치 하야시

답변이
Jonathan

Cuda-9 버전이 이것과 거의 같습니까?
huseyin tugrul buyukisik

@huseyintugrulbuyukisik이 답변은 askubuntu askubuntu.com/questions/967332/ 에서 볼 수 있습니다.이 답변을 가이드로 사용할 수 있지만 cuda 9와 동일한 단계가 적용 되는지 확인하지 않았습니다
Jonathan

이런 식으로하지 마십시오. 이것은 옛날 방식입니다. 새로운 방법을 사용하십시오. 내 답변에 대한 링크를 참조하십시오. 이 방법에는 문제가 있습니다.
Matt

3

고유 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

1

mviereck의 x11docker 사용 :

https://github.com/mviereck/x11docker#hardware-acceleration 말한다

하드웨어 가속

옵션 -g, --gpu를 사용하여 OpenGL의 하드웨어 가속이 가능합니다.

이것은 대부분의 경우 호스트의 오픈 소스 드라이버에서 즉시 작동합니다. 그렇지 않으면 wiki : 기능 종속성을 살펴보십시오. 비공개 소스 NVIDIA 드라이버에는 약간의 설정이 필요하며 x11docker X 서버 옵션을 지원하지 않습니다.

이 스크립트는 모든 구성 및 설정을 처리하므로 매우 편리합니다. GPU로 X에서 도커 이미지를 실행하는 것은 간단합니다.

x11docker --gpu imagename
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.