Sử dụng GPU từ một container docker?


164

Tôi đang tìm cách sử dụng GPU từ bên trong thùng chứa docker.

Container sẽ thực thi mã tùy ý vì vậy tôi không muốn sử dụng chế độ đặc quyền.

Bất cứ lời khuyên?

Từ nghiên cứu trước đây tôi đã hiểu rằng run -vvà / hoặc LXC cgrouplà con đường để đi nhưng tôi không chắc chắn làm thế nào để loại bỏ nó chính xác


Xem stackoverflow.com/questions/17792161/ , tương tự như nhu cầu của bạn.
Nicolas Goy

1
@NicolasGoy Liên kết là tốt nhưng không hữu ích vì tôi không thể sử dụng đặc quyền vì lý do bảo mật. Các nhóm lxc là một con trỏ tốt, nhưng không đủ. Tôi tìm thấy một cách, và tôi sẽ tự trả lời khi mọi thứ sẽ được đánh bóng.
Regan

Câu trả lời:


132

Câu trả lời của Regan rất hay, nhưng hơi lỗi thời, vì cách chính xác để làm điều này là tránh bối cảnh thực thi lxc vì Docker đã bỏ LXC làm bối cảnh thực thi mặc định kể từ docker 0.9.

Thay vào đó, tốt hơn là nói với docker về các thiết bị nvidia thông qua cờ --device và chỉ sử dụng bối cảnh thực thi riêng thay vì lxc.

Môi trường

Các hướng dẫn này đã được thử nghiệm trên môi trường sau:

  • Ubuntu 14.04
  • CUDA 6.5
  • Ví dụ GPU AWS.

Cài đặt trình điều khiển nvidia và cuda trên máy chủ của bạn

Xem CUDA 6.5 trên Trường hợp GPU AWS Chạy Ubuntu 14.04 để cài đặt máy chủ của bạn.

Cài đặt 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

Tìm thiết bị nvidia của bạn

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

Chạy Docker container với trình điều khiển nvidia được cài đặt sẵn

Tôi đã tạo một hình ảnh docker có trình điều khiển cuda được cài đặt sẵn. Các dockerfile có sẵn trên dockerhub nếu bạn muốn biết làm thế nào hình ảnh này được xây dựng.

Bạn sẽ muốn tùy chỉnh lệnh này để phù hợp với các thiết bị nvidia của bạn. Đây là những gì làm việc cho tôi:

 $ 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

Xác minh CUDA được cài đặt đúng

Điều này nên được chạy từ bên trong container docker bạn vừa khởi chạy.

Cài đặt mẫu CUDA:

$ cd /opt/nvidia_installers
$ ./cuda-samples-linux-6.5.14-18745345.run -noprompt -cudaprefix=/usr/local/cuda-6.5/

Xây dựng mẫu deviceQuery:

$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery   

Nếu mọi thứ hoạt động, bạn sẽ thấy đầu ra sau:

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs =    1, Device0 = GRID K520
Result = PASS

3
Tại sao bạn cài đặt lxc-docker nếu bạn không cần lxc?
MP0

4
Tôi có CUDA 5.5 trên máy chủ và CUDA 6.5 trong một thùng chứa được tạo từ hình ảnh của bạn. CUDA đang làm việc trên máy chủ và tôi đã chuyển các thiết bị đến container. Container nhìn thấy các GPU thông qua ls -la /dev | grep nvidianhưng CUDA không thể tìm thấy bất kỳ thiết bị nào có khả năng CUDA: ./deviceQuery ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) cudaGetDeviceCount returned 38 -> no CUDA-capable device is detected Result = FAIL Có phải do sự không phù hợp của các lib CUDA trên máy chủ và trong container không?
brunetto

1
Tôi không biết, bạn có thể muốn hỏi trên diễn đàn nvidia. Giả sử phiên bản không khớp là một vấn đề, bạn có thể lấy Dockerfile này và chỉnh sửa nó để có trình điều khiển CUDA 5.5, sau đó xây dựng lại hình ảnh docker mới từ nó và sử dụng nó.
tleyden

3
Bạn có thể giải thích tại sao hình ảnh cần cài đặt trình điều khiển nvidia? Tôi nghĩ chỉ có máy chủ cài đặt trình điều khiển nvidia (và sử dụng --device ...) là đủ?
Helin Wang

2
Hiện tại không có cách nào để làm điều này nếu bạn có Windows làm máy chủ lưu trữ.
Souradeep Nanda

45

Viết một câu trả lời cập nhật vì hầu hết các câu trả lời đã có mặt đã lỗi thời.

Phiên bản sớm hơn Docker 19.03được sử dụng để yêu cầu nvidia-docker2--runtime=nvidiacờ.

Docker 19.03, bạn cần cài đặt nvidia-container-toolkitgói và sau đó sử dụng --gpus allcờ.

Vì vậy, đây là những điều cơ bản,

Cài đặt gói

Cài đặt nvidia-container-toolkitgói theo tài liệu chính thức tại Github .

Đối với các hệ điều hành dựa trên Redhat, hãy thực thi bộ lệnh sau:

$ 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

Đối với các hệ điều hành dựa trên Debian, thực thi bộ lệnh sau:

# 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

Chạy docker với hỗ trợ GPU

docker run --name my_all_gpu_container --gpus all -t nvidia/cuda

Xin lưu ý, cờ --gpus allđược sử dụng để gán tất cả các gpus có sẵn cho bộ chứa docker.

Để gán gpu cụ thể cho bộ chứa docker (trong trường hợp có nhiều GPU có sẵn trong máy của bạn)

docker run --name my_first_gpu_container --gpus device=0 nvidia/cuda

Hoặc là

docker run --name my_first_gpu_container --gpus '"device=0"' nvidia/cuda

5
Kể từ năm 2019, đây là cách sử dụng GPU phù hợp từ bên trong các container docker.
Timur Bakeyev

1
Có ai đã từng thử điều này từ bên trong một công việc Batch trên AWS chưa?
medley56

1
Tôi tin rằng điều này có liên quan nhất. Ước gì tôi đã tìm thấy nó sớm hơn, mặc dù tôi phải điều chỉnh các hướng dẫn từ github.com/NVIDIA/nvidia-docker để làm việc với Ubuntu
20.04

40

Ok tôi cuối cùng đã quản lý để làm điều đó mà không cần sử dụng chế độ - đặc quyền.

Tôi đang chạy trên máy chủ Ubuntu 14.04 và tôi đang sử dụng cuda mới nhất (6.0.37 cho linux 13.04 64 bit).


Sự chuẩn bị

Cài đặt trình điều khiển nvidia và cuda trên máy chủ của bạn. (nó có thể hơi khó khăn một chút vì vậy tôi sẽ đề nghị bạn làm theo hướng dẫn này https://askubfox.com/questions/451672/installing-and-testing-cuda-in-ub Ubuntu-14-04 )

CHÚ Ý: Điều thực sự quan trọng là bạn giữ các tệp bạn đã sử dụng để cài đặt cuda máy chủ


Nhận Docker Daemon để chạy bằng lxc

Chúng ta cần chạy docker daemon bằng trình điều khiển lxc để có thể sửa đổi cấu hình và cấp quyền truy cập container cho thiết bị.

Sử dụng một lần:

sudo service docker stop
sudo docker -d -e lxc

Cấu hình vĩnh viễn Sửa đổi tệp cấu hình docker của bạn nằm trong / etc / default / docker Thay đổi dòng DOCKER_OPTS bằng cách thêm '-e lxc' Đây là dòng của tôi sau khi sửa đổi

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

Sau đó khởi động lại daemon bằng

sudo service docker restart

Làm thế nào để kiểm tra xem daemon có sử dụng trình điều khiển lxc hiệu quả không?

docker info

Dòng Trình điều khiển thực thi sẽ trông như thế:

Execution Driver: lxc-1.0.5

Xây dựng hình ảnh của bạn với trình điều khiển NVIDIA và CUDA.

Dưới đây là một Dockerfile cơ bản để xây dựng hình ảnh tương thích CUDA.

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.

Chạy hình ảnh của bạn.

Trước tiên, bạn cần xác định số chính của bạn được liên kết với thiết bị của bạn. Cách dễ nhất là thực hiện lệnh sau:

ls -la /dev | grep nvidia

Nếu kết quả là trống, sử dụng khởi chạy một trong các mẫu trên máy chủ nên thực hiện thủ thuật. Kết quả sẽ giống như vậy nhập mô tả hình ảnh ở đây Như bạn có thể thấy có một bộ gồm 2 số giữa nhóm và ngày. 2 số này được gọi là số chính và số phụ (được viết theo thứ tự đó) và thiết kế một thiết bị. Chúng tôi sẽ chỉ sử dụng những con số chính cho thuận tiện.

Tại sao chúng tôi kích hoạt trình điều khiển lxc? Để sử dụng tùy chọn lxc conf cho phép chúng tôi cho phép container của chúng tôi truy cập vào các thiết bị đó. Tùy chọn là: (tôi khuyên bạn nên sử dụng * cho số phụ vì nó làm giảm độ dài của lệnh chạy)

--lxc-conf = 'lxc.cgroup.devices.allow = c [số chính]: [số phụ hoặc *] rwm'

Vì vậy, nếu tôi muốn khởi chạy một container (Giả sử tên hình ảnh của bạn là cuda).

docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda

Bạn có thể chia sẻ container?
ChillarAnand

1
Docker có một --devicetùy chọn cho phép container truy cập thiết bị của máy chủ. Tuy nhiên tôi đã cố gắng sử dụng --device=/dev/nvidia0để cho phép container docker chạy cuda và không thành công.
shiquanwang

4
Sau đó tôi đã thành công với tất cả phơi bày /dev/nvidiao, /dev/nvidia1, /dev/nvidiactl/dev/nvidia-uvmvới --device. Mặc dù không biết tại sao.
shiquanwang

Tùy chọn --device không được triển khai khi tôi phải tìm giải pháp này. Bạn cần ít nhất nvidia0 hoặc nvidia1 (card đồ họa) và nvidiactl (thiết bị nvidia chung) và nvidia-uvm (thiết bị bộ nhớ United).
Regan

2
Cảm ơn gợi ý của bạn về /dev/nvidia*@Regan. Đối với @ChillarAnand Tôi đã thực hiện một CUDA-Docker
shiquanwang

29

Chúng tôi vừa phát hành một kho lưu trữ GitHub thử nghiệm , giúp dễ dàng sử dụng GPU NVIDIA bên trong các thùng chứa Docker.


4
Có hỗ trợ windows không? Có vẻ như không phải vậy, nhưng có lẽ tôi đang thiếu một cái gì đó.
Blaze

6
Không có hỗ trợ Windows. Chạy bộ chứa CUDA yêu cầu trình điều khiển Nvidia cho Linux và truy cập vào các thiết bị Linux đại diện cho GPU, ví dụ / dev / nvidia0. Các thiết bị và trình điều khiển này không khả dụng khi Docker được cài đặt trên Windows và chạy bên trong máy ảo VirtualBox.
Paweł Bylica

Vẫn cần các khai báo --device trong lệnh run? Tôi đã xây dựng một bộ chứa TỪ nvidia / cuda và bộ chứa chạy tốt, nhưng ứng dụng (Wowza) không nhận ra GPU trong khi nó chỉ hoạt động tốt khi chạy trực tiếp trên máy chủ (máy chủ này, vì vậy tôi biết trình điều khiển vẫn ổn) . Tôi đang chạy 361.28. Máy chủ lưu trữ là EC2 sử dụng NVidia AMI trên g2.8xlarge.
rainabba

Không có mọi thứ được chăm sóc bởi nvidia-docker, bạn sẽ có thể chạy nvidia-smi bên trong container và xem các thiết bị của bạn
3XX0

22

Những cải tiến gần đây của NVIDIA đã tạo ra một cách mạnh mẽ hơn nhiều để làm điều này.

Về cơ bản, họ đã tìm ra một cách để tránh sự cần thiết phải cài đặt trình điều khiển CUDA / GPU bên trong các thùng chứa và để nó phù hợp với mô-đun hạt nhân máy chủ.

Thay vào đó, các trình điều khiển ở trên máy chủ và các container không cần chúng. Nó đòi hỏi một docker-cli sửa đổi ngay bây giờ.

Điều này là tuyệt vời, bởi vì bây giờ container là di động hơn nhiều.

nhập mô tả hình ảnh ở đây

Một thử nghiệm nhanh trên 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

Để biết thêm chi tiết, hãy xem: Container Docker kích hoạt GPU và: https://github.com/NVIDIA/nvidia-docker


Điều này hoạt động tốt khi bạn nhận được tất cả các bước. Nvidia không cung cấp tất cả ở một nơi, nhưng ví dụ này cung cấp mọi thứ bạn cần để làm cho nó hoạt động với trường hợp sử dụng chung.
KobeJohn

@KobeJohn - Tôi chỉ cần làm theo các hướng dẫn cài đặt, cách sử dụng dòng lệnh và đảm bảo các thùng chứa của tôi kế thừa từ các cuda. Nó chỉ làm việc cho tôi.
Matt

1
Trên thực tế, bạn có thể đưa ra các kịch bản thực tế trong đó việc sử dụng nvidia-docker có ý nghĩa không?
Suncatcher

@Suncatcher - Tôi đang sử dụng nó trong một cụm yêu cầu quyền truy cập vào GPU để kết xuất 3D. Dockerizing các ứng dụng làm cho mọi thứ đơn giản hơn để triển khai và bảo trì.
Matt

17

Cập nhật cho cuda-8.0 trên Ubuntu 16.04

Dockerfile

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. Chạy container của bạn

sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm <built-image> ./deviceQuery

Bạn sẽ thấy đầu ra tương tự như:

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 Result = PASS


3
Tôi nhận được đầu ra sau. cudaGetDeviceCount trả lại 38 -> không phát hiện thấy thiết bị nào có khả năng CUDA Kết quả = FAIL
Soichi Hayashi

Trả lời trễ, nhưng điều đó có nghĩa là bạn có thể không có GPU trên máy đó
Jonathan

Một phiên bản Cuda-9 sẽ gần giống như thế này?
huseyin tugrul buyukisik

@huseyintugrulbuyukisik thấy câu trả lời này trên askubuntu askubuntu.com/questions/967332/... , tôi muốn nói rằng bạn có thể sử dụng câu trả lời này như một hướng dẫn nhưng tôi đã không làm việc với CUDA 9 để xác nhận rằng các bước tương tự sẽ được áp dụng
Jonathan

Đừng làm theo cách này. Đây là cách cũ. Sử dụng cách mới. Xem liên kết đến câu trả lời của tôi. Phương pháp này có nhiều vấn đề.
Matt

3

Để sử dụng GPU từ bộ chứa docker, thay vì sử dụng Docker gốc, hãy sử dụng Nvidia-docker. Để cài đặt docker Nvidia, sử dụng các lệnh sau

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

Sử dụng x11docker bởi mviereck:

https://github.com/mviereck/x11docker#hardware-accelutions nói

Tăng tốc phần cứng

Có thể tăng tốc phần cứng cho OpenGL với tùy chọn -g, --gpu.

Điều này sẽ hoạt động tốt trong hầu hết các trường hợp với trình điều khiển nguồn mở trên máy chủ. Nếu không, hãy xem wiki: phụ thuộc tính năng. Trình điều khiển NVIDIA nguồn đóng cần một số thiết lập và hỗ trợ ít tùy chọn máy chủ x11docker X.

Kịch bản này thực sự tiện lợi vì nó xử lý tất cả các cấu hình và thiết lập. Chạy một hình ảnh docker trên X với gpu cũng đơn giản như

x11docker --gpu imagename
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.