Menggunakan GPU dari wadah buruh pelabuhan?

164

Saya mencari cara untuk menggunakan GPU dari dalam wadah buruh pelabuhan.

Kontainer akan mengeksekusi kode arbitrer jadi saya tidak ingin menggunakan mode privilege.

Ada tips?

Dari penelitian sebelumnya saya mengerti itu run -vdan / atau LXC cgroupadalah cara untuk pergi tetapi saya tidak yakin bagaimana melakukannya dengan tepat

Regan
sumber
Lihat stackoverflow.com/questions/17792161/… yang mirip dengan kebutuhan Anda.
Nicolas Goy
1
@NicolasGoy Tautannya bagus tapi tidak berguna karena saya tidak bisa menggunakan hak istimewa karena alasan keamanan. Kelompok-lxc-cg adalah penunjuk yang baik, tetapi tidak cukup. Saya menemukan cara, dan saya akan menjawab sendiri ketika semuanya akan dipoles.
Regan

Jawaban:

132

Jawaban Regan memang bagus, tapi agak ketinggalan zaman, karena cara yang benar untuk melakukannya adalah menghindari konteks eksekusi lxc karena Docker telah menjatuhkan LXC sebagai konteks eksekusi default pada docker 0.9.

Alih-alih, lebih baik memberi tahu docker tentang perangkat nvidia melalui flag --device, dan cukup gunakan konteks eksekusi asli daripada lxc.

Lingkungan Hidup

Instruksi ini diuji pada lingkungan berikut:

  • Ubuntu 14.04
  • CUDA 6.5
  • Contoh GPU AWS.

Instal driver nvidia dan cuda di host Anda

Lihat CUDA 6.5 pada AWS GPU Instance Menjalankan Ubuntu 14.04 untuk mendapatkan pengaturan mesin host Anda.

Instal 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

Temukan perangkat nvidia Anda

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

Jalankan wadah Docker dengan driver nvidia yang sudah diinstal sebelumnya

Saya telah membuat gambar buruh pelabuhan yang memiliki driver cuda yang sudah diinstal. File docker tersedia di dockerhub jika Anda ingin tahu bagaimana gambar ini dibuat.

Anda ingin menyesuaikan perintah ini agar sesuai dengan perangkat nvidia Anda. Inilah yang bekerja untuk saya:

 $ 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

Verifikasi CUDA diinstal dengan benar

Ini harus dijalankan dari dalam wadah buruh pelabuhan yang baru saja Anda luncurkan.

Instal sampel CUDA:

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

Buat sampel deviceQuery:

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

Jika semuanya berfungsi, Anda akan melihat output berikut:

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs =    1, Device0 = GRID K520
Result = PASS
tleyden
sumber
3
Mengapa Anda menginstal lxc-docker jika Anda tidak membutuhkan lxc?
MP0
4
Saya memiliki CUDA 5.5 di host dan CUDA 6.5 di sebuah wadah yang dibuat dari gambar Anda. CUDA bekerja pada host, dan saya menyerahkan perangkat ke wadah. Kontainer melihat GPU melalui ls -la /dev | grep nvidiatetapi CUDA tidak dapat menemukan perangkat yang mampu CUDA: ./deviceQuery ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) cudaGetDeviceCount returned 38 -> no CUDA-capable device is detected Result = FAIL Apakah karena ketidakcocokan lib CUDA pada host dan dalam kontainer?
brunetto
1
Saya tidak tahu, Anda mungkin ingin bertanya di forum nvidia. Menganggap ketidakcocokan versi adalah masalah, Anda bisa mengambil Dockerfile ini dan mengeditnya untuk memiliki driver CUDA 5.5, kemudian membangun kembali gambar buruh pelabuhan baru dari itu dan menggunakannya.
tleyden
3
Bisakah Anda menjelaskan mengapa gambar perlu menginstal driver nvidia? Saya pikir hanya host yang menginstal driver nvidia (dan menggunakan - perangkat ...) sudah cukup?
Helin Wang
2
Saat ini tidak ada cara untuk melakukan ini jika Anda memiliki Windows sebagai tuan rumah.
Souradeep Nanda
46

Menulis jawaban yang diperbarui karena sebagian besar jawaban yang sudah ada sudah usang seperti yang sekarang.

Versi yang lebih awal dari yang Docker 19.03dibutuhkan nvidia-docker2dan --runtime=nvidiabendera.

Karena Docker 19.03, Anda perlu menginstal nvidia-container-toolkitpaket dan kemudian menggunakan --gpus allbendera.

Jadi, inilah dasar-dasarnya,

Instalasi Paket

Instal nvidia-container-toolkitpaket sesuai dokumentasi resmi di Github .

Untuk OS berbasis Redhat, jalankan serangkaian perintah berikut:

$ 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

Untuk OS berbasis Debian, jalankan serangkaian perintah berikut:

# 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

Menjalankan buruh pelabuhan dengan dukungan GPU

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

Harap dicatat, bendera --gpus alldigunakan untuk menetapkan semua GPU yang tersedia ke wadah buruh pelabuhan.

Untuk menetapkan GPU spesifik ke wadah buruh pelabuhan (jika beberapa GPU tersedia di mesin Anda)

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

Atau

docker run --name my_first_gpu_container --gpus '"device=0"' nvidia/cuda
Rohit
sumber
5
Pada 2019 ini adalah cara yang tepat untuk menggunakan GPU dari dalam wadah buruh pelabuhan.
Timur Bakeyev
1
Adakah yang pernah mencoba ini dari dalam pekerjaan Batch di AWS?
medley56
1
Saya percaya ini yang paling relevan. Seandainya saya menemukannya lebih cepat, meskipun saya harus menyesuaikan instruksi dari github.com/NVIDIA/nvidia-docker untuk bekerja dengan Ubuntu 20.04
VictorLegros
40

Ok saya akhirnya berhasil melakukannya tanpa menggunakan mode --privileged.

Saya menjalankan server ubuntu 14.04 dan saya menggunakan cuda terbaru (6.0.37 untuk linux 13.04 64 bit).


Persiapan

Instal driver nvidia dan cuda di host Anda. (ini mungkin sedikit rumit sehingga saya akan menyarankan Anda mengikuti panduan ini /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )

PERHATIAN: Sangat penting bahwa Anda menyimpan file yang Anda gunakan untuk instalasi host cuda


Dapatkan Docker Daemon untuk dijalankan menggunakan lxc

Kita perlu menjalankan docker daemon menggunakan driver lxc untuk dapat mengubah konfigurasi dan memberikan wadah akses ke perangkat.

Pemanfaatan satu kali:

sudo service docker stop
sudo docker -d -e lxc

Konfigurasi permanen Ubah file konfigurasi buruh pelabuhan Anda yang berada di / etc / default / docker Ubah baris DOCKER_OPTS dengan menambahkan '-e lxc' Ini baris saya setelah modifikasi

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

Kemudian restart daemon menggunakan

sudo service docker restart

Bagaimana cara memeriksa apakah daemon secara efektif menggunakan driver lxc?

docker info

Baris Driver Eksekusi akan terlihat seperti itu:

Execution Driver: lxc-1.0.5

Bangun gambar Anda dengan driver NVIDIA dan CUDA.

Berikut ini adalah Dockerfile dasar untuk membangun gambar yang kompatibel dengan 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.

Jalankan gambar Anda.

Pertama, Anda perlu mengidentifikasi nomor utama Anda yang terkait dengan perangkat Anda. Cara termudah adalah dengan melakukan perintah berikut:

ls -la /dev | grep nvidia

Jika hasilnya kosong, gunakan meluncurkan salah satu sampel pada host harus melakukan trik. Hasilnya akan terlihat seperti itu. masukkan deskripsi gambar di sini Seperti yang Anda lihat ada satu set 2 angka antara grup dan tanggal. 2 angka ini disebut angka besar dan kecil (ditulis dalam urutan itu) dan mendesain perangkat. Kami hanya akan menggunakan nomor utama untuk kenyamanan.

Mengapa kita mengaktifkan driver lxc? Untuk menggunakan opsi lxc conf yang memungkinkan kami mengizinkan wadah kami mengakses perangkat-perangkat itu. Opsinya adalah: (saya sarankan menggunakan * untuk nomor minor karena mengurangi panjang perintah run)

--lxc-conf = 'lxc.cgroup.devices.allow = c [angka utama]: [angka minor atau *] rwm'

Jadi jika saya ingin meluncurkan sebuah wadah (Misalkan nama gambar Anda adalah cuda).

docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda
Regan
sumber
Bisakah Anda berbagi wadah?
ChillarAnand
1
Docker memiliki --deviceopsi untuk memungkinkan wadah mengakses perangkat host. Namun saya mencoba menggunakan --device=/dev/nvidia0untuk memungkinkan buruh pelabuhan untuk menjalankan cuda dan gagal.
shiquanwang
4
Saya kemudian berhasil dengan mengekspos semua /dev/nvidiao, /dev/nvidia1, /dev/nvidiactldan /dev/nvidia-uvmdengan --device. Meski tidak tahu kenapa.
shiquanwang
Opsi --device tidak diimplementasikan ketika saya harus menemukan solusi ini. Anda memerlukan setidaknya nvidia0 atau nvidia1 (kartu grafis) dan nvidiactl (perangkat nvidia umum) dan nvidia-uvm (perangkat memori bersatu).
Regan
2
Terima kasih atas petunjuk Anda pada /dev/nvidia*@Regan. Untuk @ChillarAnand saya telah membuat cuda -docker
shiquanwang
29

Kami baru saja merilis repositori GitHub eksperimental yang seharusnya memudahkan proses penggunaan GPU NVIDIA di dalam wadah Docker.

3XX0
sumber
4
Apakah ada dukungan windows? Sepertinya tidak, tapi mungkin saya kehilangan sesuatu.
Blaze
6
Tidak ada dukungan Windows. Menjalankan wadah CUDA membutuhkan driver Nvidia untuk Linux dan akses ke perangkat Linux yang mewakili GPU, misalnya / dev / nvidia0. Perangkat dan driver ini tidak tersedia ketika Docker diinstal pada Windows dan berjalan di dalam mesin virtual VirtualBox.
Paweł Bylica
Masih membutuhkan deklarasi --device pada perintah run? Saya telah membangun sebuah wadah DARI nvidia / cuda dan wadah berjalan dengan baik, tetapi aplikasi (Wowza) tidak mengenali GPU sementara itu baik-baik saja ketika dijalankan langsung pada host (tuan rumah ini, jadi saya tahu driver baik-baik saja) . Saya menjalankan 361.28. Tuan rumah adalah EC2 menggunakan NVidia AMI di g2.8xlarge.
rainabba
Tidak semuanya diurus oleh nvidia-docker, Anda harus dapat menjalankan nvidia-smi di dalam wadah dan melihat perangkat Anda
3XX0
22

Peningkatan terbaru oleh NVIDIA telah menghasilkan cara yang jauh lebih kuat untuk melakukan ini.

Pada dasarnya mereka telah menemukan cara untuk menghindari kebutuhan untuk menginstal driver CUDA / GPU di dalam wadah dan memilikinya cocok dengan modul kernel host.

Sebaliknya, pengemudi berada di tuan rumah dan wadah tidak membutuhkannya. Itu membutuhkan docker-cli yang dimodifikasi sekarang.

Ini hebat, karena sekarang kontainer jauh lebih portabel.

masukkan deskripsi gambar di sini

Tes cepat di 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

Untuk lebih jelasnya lihat: Container Docker yang Diaktifkan GPU dan: https://github.com/NVIDIA/nvidia-docker

Mat
sumber
Ini bekerja dengan baik setelah Anda mendapatkan semua langkah. Nvidia tidak menyediakan semuanya di satu tempat, tetapi contoh ini memberikan semua yang Anda butuhkan untuk membuatnya berfungsi dengan kasus penggunaan umum.
KobeJohn
@KobeJohn - Saya baru saja mengikuti instruksi instalasi, bagaimana cara menggunakan baris perintah dan memastikan kontainer saya mewarisi dari yang cuda. Itu hanya bekerja untuk saya.
Matt
1
Sebenarnya, dapatkah Anda memberikan skenario kehidupan nyata di mana penggunaan nvidia-docker masuk akal?
Suncatcher
@Suncatcher - Saya menggunakannya dalam sebuah cluster yang membutuhkan akses ke GPU untuk rendering 3D. Dockerisasi aplikasi membuat hal-hal lebih mudah untuk digunakan dan dipelihara.
Matt
17

Diperbarui untuk cuda-8.0 di 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. Jalankan wadah Anda

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

Anda akan melihat output yang mirip dengan:

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

Jonathan
sumber
3
Saya mendapatkan hasil berikut. cudaGetDeviceCount kembali 38 -> tidak ada perangkat yang mampu CUDA terdeteksi Hasil = GAGAL
Soichi Hayashi
Balasan terlambat, tetapi itu berarti Anda mungkin tidak memiliki GPU di mesin itu
Jonathan
Apakah versi Cuda-9 hampir sama dengan ini?
huseyin tugrul buyukisik
@huseyintugrulbuyukisik lihat jawaban ini di askubuntu askubuntu.com/questions/967332/… , saya akan mengatakan Anda bisa menggunakan jawaban ini sebagai panduan tapi saya belum bekerja dengan cuda 9 untuk mengonfirmasi bahwa langkah yang sama akan berlaku
Jonathan
Jangan lakukan seperti ini. Ini cara lama. Gunakan cara baru. Lihat tautan ke jawaban saya. Metode ini penuh dengan masalah.
Matt
3

Untuk menggunakan GPU dari wadah buruh pelabuhan, alih-alih menggunakan Docker asli, gunakan Nvidia-buruh pelabuhan. Untuk menginstal Nvidia docker gunakan perintah berikut

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
Patel Sunil
sumber
1

Gunakan x11docker oleh mviereck:

https://github.com/mviereck/x11docker#hardware-acceleration berkata

Akselerasi perangkat keras

Akselerasi perangkat keras untuk OpenGL dimungkinkan dengan opsi -g, --gpu.

Ini akan bekerja di luar kotak dalam kebanyakan kasus dengan driver sumber terbuka di host. Kalau tidak, lihat wiki: dependensi fitur. Sumber NVIDIA driver tertutup memerlukan beberapa pengaturan dan mendukung lebih sedikit opsi x11docker X server.

Script ini sangat nyaman karena menangani semua konfigurasi dan pengaturan. Menjalankan gambar buruh pelabuhan di X dengan GPU sesederhana itu

x11docker --gpu imagename
phil294
sumber