programing

도커 컨테이너의 GPU를 사용하시겠습니까?

goodcopy 2023. 9. 5. 21:38
반응형

도커 컨테이너의 GPU를 사용하시겠습니까?

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

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

팁 있어요?

이전 연구에서 저는 그것을 이해했습니다.run -v LXC 및/는 LXCcgroup는 그랬지만 할지 잘

이미 있는 답변의 대부분은 현재 구식이므로 업데이트된 답변을 작성하는 것입니다.

이전 Docker 19.03을 요구하곤 했습니다.nvidia-docker2 리고그고.--runtime=nvidia 깃발

다음을 설치해야 합니다.nvidia-container-toolkit를 선택한 패지화사니다합용음다를 합니다.--gpus all 깃발

자, 여기에 기본이 있습니다.

패키지 설치

합니다.nvidia-container-toolkitGithub의 공식 문서에 따라 패키지.

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

Debian 기반 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를 도커 컨테이너에 할당하는 데 사용됩니다.

특정 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

Regan의 답변은 훌륭하지만, Docker가 Docker 0.9 기준으로 LXC를 기본 실행 컨텍스트로 삭제했기 때문에 올바른 방법은 LXC 실행 컨텍스트를 피하는 것이기 때문에 약간 구식입니다.

대신 --device 플래그를 통해 도커에게 엔비디아 장치에 대해 알려주고 lxc 대신 네이티브 실행 컨텍스트를 사용하는 것이 좋습니다.

환경

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

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

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

호스트 시스템 설정을 보려면 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

Nvidia 장치 찾기

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 드라이버가 미리 설치된 도커 이미지를 만들었습니다.이 이미지가 어떻게 작성되었는지 알고 싶다면 도커 허브에서 도커 파일을 사용할 수 있습니다.

이 명령을 사용자 지정하여 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/

빌드 장치쿼리 샘플:

$ 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

네, 마침내 --privileged 모드를 사용하지 않고도 할 수 있었습니다.

Ubuntu 서버 14.04에서 실행 중이며 최신 cuda(리눅스 13.04 64비트의 경우 6.0.37)를 사용하고 있습니다.


준비

호스트에 nvidia 드라이버 및 cuda를 설치합니다.(조금 까다로울 수 있으므로 이 가이드 https://askubuntu.com/questions/451672/installing-and-testing-cuda-in-ubuntu-14-04) 를 따를 것을 제안합니다.

주의: 호스트 cuda 설치에 사용한 파일을 보관하는 것이 매우 중요합니다.


lxc를 사용하여 실행할 도커 데몬 가져오기

구성을 수정하고 컨테이너에 장치 액세스 권한을 부여하려면 lxc 드라이버를 사용하여 도커 데몬을 실행해야 합니다.

일회성 활용:

sudo service docker stop
sudo docker -d -e lxc

영구 구성 /etc/default/docker에 있는 도커 구성 파일 수정 '-elxc'를 추가하여 DOKER_OPTS 라인 변경 수정 후 내 라인입니다.

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"

그런 다음 다음 다음을 사용하여 데몬을 다시 시작합니다.

sudo service docker restart

데몬이 lxc 드라이버를 효과적으로 사용하는지 확인하는 방법은?

docker info

Execution Driver 행은 다음과 같아야 합니다.

Execution Driver: lxc-1.0.5

NVIDIA 및 CUDA 드라이버로 이미지를 구축할 수 있습니다.

CUDA 호환 이미지를 구축하기 위한 기본 Docker 파일입니다.

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

결과가 비어 있으면 호스트에서 샘플 중 하나를 실행하면 됩니다.저 결과는그렇합니다야여보.enter image description here보시다시피 그룹과 날짜 사이에는 2개의 숫자 세트가 있습니다.이 두 숫자를 큰 숫자와 작은 숫자(순서대로 적음)라고 하며 장치를 설계합니다.우리는 편의상 주요 숫자만 사용할 것입니다.

Lxc 드라이버를 활성화한 이유는 무엇입니까?컨테이너가 해당 장치에 액세스할 수 있도록 허용하는 lxc conf 옵션을 사용합니다.옵션은 다음과 같습니다(단순 숫자는 실행 명령의 길이를 줄이기 때문에 *를 사용하는 것이 좋습니다).

--lxc-conf='lxc.cgroup.sys.허용 = 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

우리는 방금 도커 컨테이너 내에서 NVIDIA GPU를 사용하는 프로세스를 쉽게 할 수 있는 실험적인 GitHub 저장소를 출시했습니다.

NVIDIA의 최근 향상된 기능은 이를 위한 훨씬 더 강력한 방법을 만들어냈습니다.

기본적으로 그들은 컨테이너 안에 CUDA/GPU 드라이버를 설치할 필요가 없고 호스트 커널 모듈과 일치하는 것을 피할 수 있는 방법을 참조하십시오.

대신 드라이버가 호스트에 있고 컨테이너에는 드라이버가 필요하지 않습니다.지금 당장 수정된 도커-cli가 필요합니다.

이것은 훌륭합니다. 왜냐하면 지금은 컨테이너가 훨씬 더 휴대하기 쉽기 때문입니다.

enter image description here

Ubuntu에서 빠른 테스트:

# 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 지원 도커 컨테이너 및 https://github.com/NVIDIA/nvidia-docker 를 참조하십시오.

Ubuntu 16.04에서 cuda-8.0용으로 업데이트됨

  • 도커 설치 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
  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

목표:

제 목표는 nvidia/cuda를 기본 이미지로 사용하지 않고 CUDA 지원 도커 이미지를 만드는 것이었습니다.왜냐하면 저는 커스텀 주피터 이미지를 가지고 있고, 그것을 기반으로 하고 싶기 때문입니다.

필수 구성 요소:

호스트 시스템에 nvidia 드라이버, CUDA 툴킷 및 nvidia-container-toolkit이 이미 설치되어 있습니다.공식 문서를 참고하시고, 로히트의 답변을 참고하시기 바랍니다.

다음을 및 CUDA 툴킷이 합니다.nvidia-smi올바른 "드라이버 버전" 및 "CUDA 버전"을 표시하고 GPU 정보를 표시해야 합니다.

을 사용하여 docker run --rm --gpus all nvidia/cuda:latest nvidia-smi

도커 파일

여기서 nvidia/cuda의 공식 Docker 파일로 추정되는 것을 발견했습니다. "플랫"하고, 내용을 Docker 파일에 추가하고, 제대로 작동하는지 테스트했습니다.

FROM sidazhou/scipy-notebook:latest
# FROM ubuntu:18.04 

###########################################################################
# See https://gitlab.com/nvidia/container-images/cuda/-/blob/master/dist/10.1/ubuntu18.04-x86_64/base/Dockerfile
# See https://sarus.readthedocs.io/en/stable/user/custom-cuda-images.html
###########################################################################
USER root

###########################################################################
# base
RUN apt-get update && apt-get install -y --no-install-recommends \
    gnupg2 curl ca-certificates && \
    curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub | apt-key add - && \
    echo "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list && \
    echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list && \
    apt-get purge --autoremove -y curl \
    && rm -rf /var/lib/apt/lists/*

ENV CUDA_VERSION 10.1.243
ENV CUDA_PKG_VERSION 10-1=$CUDA_VERSION-1

# For libraries in the cuda-compat-* package: https://docs.nvidia.com/cuda/eula/index.html#attachment-a
RUN apt-get update && apt-get install -y --no-install-recommends \
    cuda-cudart-$CUDA_PKG_VERSION \
    cuda-compat-10-1 \
    && ln -s cuda-10.1 /usr/local/cuda && \
    rm -rf /var/lib/apt/lists/*

# Required for nvidia-docker v1
RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \
    echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf

ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64


###########################################################################
#runtime next
ENV NCCL_VERSION 2.7.8

RUN apt-get update && apt-get install -y --no-install-recommends \
    cuda-libraries-$CUDA_PKG_VERSION \
    cuda-npp-$CUDA_PKG_VERSION \
    cuda-nvtx-$CUDA_PKG_VERSION \
    libcublas10=10.2.1.243-1 \
    libnccl2=$NCCL_VERSION-1+cuda10.1 \
    && apt-mark hold libnccl2 \
    && rm -rf /var/lib/apt/lists/*

# apt from auto upgrading the cublas package. See https://gitlab.com/nvidia/container-images/cuda/-/issues/88
RUN apt-mark hold libcublas10


###########################################################################
#cudnn7 (not cudnn8) next

ENV CUDNN_VERSION 7.6.5.32

RUN apt-get update && apt-get install -y --no-install-recommends \
    libcudnn7=$CUDNN_VERSION-1+cuda10.1 \
    && apt-mark hold libcudnn7 && \
    rm -rf /var/lib/apt/lists/*


ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES all
ENV NVIDIA_REQUIRE_CUDA "cuda>=10.1"


###########################################################################
#docker build -t sidazhou/scipy-notebook-gpu:latest .

#docker run -itd -gpus all\
#  -p 8888:8888 \
#  -p 6006:6006 \
#  --user root \
#  -e NB_UID=$(id -u) \
#  -e NB_GID=$(id -g) \
#  -e GRANT_SUDO=yes \
#  -v ~/workspace:/home/jovyan/work \
#  --name sidazhou-jupyter-gpu \
#  sidazhou/scipy-notebook-gpu:latest

#docker exec sidazhou-jupyter-gpu python -c "import tensorflow as tf; print(tf.config.experimental.list_physical_devices('GPU'))"

기본 도커를 사용하는 대신 도커 컨테이너에서 GPU를 사용하려면 Nvidia-docker를 사용합니다.Nvidia 도커를 설치하려면 다음 명령을 사용합니다.

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로 x11도커 사용:

https://github.com/mviereck/x11docker#hardware-acceleration 는 말합니다.

하드웨어 가속

OpenGL에 대한 하드웨어 가속은 옵션 -g, --gpu로 가능합니다.

대부분의 경우 호스트의 오픈 소스 드라이버에서 즉시 사용할 수 있습니다.그렇지 않으면 Wiki: 기능 종속성을 살펴봅니다.클로즈드 소스 NVIDIA 드라이버는 몇 가지 설정이 필요하며 지원하는 x11도커 X 서버 옵션이 적습니다.

이 스크립트는 모든 구성과 설정을 처리하기 때문에 매우 편리합니다.GPU를 사용하여 X에서 도커 이미지를 실행하는 것은 다음과 같이 간단합니다.

x11docker --gpu imagename

도커를 사용할 수 있는 경우 호스트에 CUDA/cuDNN을 설치하는 것이 좋습니다.적어도 CUDA 8 이후로 "거인들의 어깨 위에 서서" 사용하는 것이 가능해졌습니다.nvidia/cudaNVIDIA가 Docker Hub repo에서 유지 관리하는 기본 이미지.어떤 버전을 선택할지 확실하지 않은 경우 최신 버전과 가장 큰 버전(딥러닝을 수행하는 경우 cuDNN 포함)을 선택합니다.

스타터 CUDA 컨테이너:

mkdir ~/cuda11
cd ~/cuda11

echo "FROM nvidia/cuda:11.0-cudnn8-devel-ubuntu18.04" > Dockerfile
echo "CMD [\"/bin/bash\"]" >> Dockerfile

docker build --tag mirekphd/cuda11 .

docker run --rm -it --gpus 1 mirekphd/cuda11 nvidia-smi

샘플 출력:

컨테이너에 없는 경우에는 설치하지 마십시오. NVIDIA GPU 드라이버가 있는 호스트에 이미 설치되어 있으며 도커가 GPU에 액세스할 수 있는 경우 호스트에서 컨테이너 시스템으로 사용할 수 있어야 합니다.

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.57       Driver Version: 450.57       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   50C    P8    17W / 280W |    409MiB / 11177MiB |      7%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

전제 조건

  1. 최신 CUDA 버전을 지원하는 적절한 NVIDIA 드라이버를 호스트에 먼저 설치합니다(NVIDIA 드라이버 다운로드에서 다운로드한 다음).mv driver-file.run driver-file.sh && chmod +x driver-file.sh && ./driver-file.sh). CUDA 10.1 이후로 상위 호환성이 있습니다.

  2. 에서 GPU 액세스 사용docker설치함으로써sudo apt get update && sudo apt get install nvidia-container-toolkit(그리고 나서 다음을 사용하여 도커 데몬을 다시 시작합니다.sudo systemctl restart docker).

언급URL : https://stackoverflow.com/questions/25185405/using-gpu-from-a-docker-container

반응형