Docker kapsayıcısından GPU mu kullanıyorsunuz?


164

GPU'yu bir docker konteynerinin içinden kullanmanın bir yolunu arıyorum.

Ayrıcalıklı modu kullanmak istemiyorum kapsayıcı rasgele kod yürütecek.

Herhangi bir ipucu?

Önceki araştırmalardan anladım run -vve / veya LXC cgroup, yolun bir yoluydu ama bunu tam olarak nasıl çıkaracağımdan emin değilim


İhtiyacınıza benzer olan stackoverflow.com/questions/17792161/… adresine bakın .
Nicolas Goy

1
@NicolasGoy Güvenlik nedeniyle ayrıcalıklı kullanamadığım için bağlantı iyi ama yararlı değil. Lxc-cgroups iyi bir göstericiydi, ama yeterli değildi. Bir yol buldum ve her şeyin cilalanacağı zaman kendi kendime cevap vereceğim.
Regan

Yanıtlar:


132

Regan cevabı harika ama bunu yapmak için doğru yolu beri, güncel biraz bu Docker gibi LXC yürütme içeriği önlemek olduğunu LXC düştü docker 0.9 itibariyle varsayılan yürütme içeriği olarak.

Bunun yerine docker'a --device bayrağı aracılığıyla nvidia cihazları hakkında bilgi vermek ve lxc yerine yerel yürütme bağlamını kullanmak daha iyidir.

çevre

Bu talimatlar aşağıdaki ortamda test edilmiştir:

  • Ubuntu 14.04
  • CUDA 6.5
  • AWS GPU örneği.

Ana makinenize nvidia sürücüsü ve cuda yükleyin

Ubuntu 14.04 Çalıştıran AWS GPU Örneği hakkında CUDA 6.5'e bakınAna makine kurulumunuzu almak için .

Docker'ı Yükle

$ 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 cihazlarınızı bulun

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

Docker kapsayıcısını önceden yüklenmiş nvidia sürücüsüyle çalıştırın

Cuda sürücülerinin önceden yüklenmiş olduğu bir liman işçisi görüntüsü oluşturdum . dockerfile Bu görüntü nasıl oluşturulduğunu öğrenmek istiyorsanız dockerhub mevcuttur.

Bu komutu nvidia cihazlarınızla eşleşecek şekilde özelleştirmek istersiniz. İşte benim için işe yarayan:

 $ 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'nın doğru bir şekilde kurulduğunu doğrulayın

Bu, yeni başlattığınız docker konteynerinin içinden çalıştırılmalıdır.

CUDA örneklerini yükleyin:

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

Cihaz inşa et Sorgu örneği:

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

Her şey işe yaradıysa, aşağıdaki çıktıyı görmelisiniz:

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

3
Eğer lxc'ye ihtiyacınız yoksa neden lxc-docker'ı kuruyorsunuz?
MP0

4
Ana bilgisayarda CUDA 5.5 ve resminizden oluşturulan bir kapta CUDA 6.5 var. CUDA sunucu üzerinde çalışıyor ve cihazları konteynere geçtim. Konteyner GPU'ları görüyor ls -la /dev | grep nvidiaancak CUDA CUDA özellikli herhangi bir cihaz bulamıyor: ./deviceQuery ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) cudaGetDeviceCount returned 38 -> no CUDA-capable device is detected Result = FAIL Bunun nedeni, ana bilgisayardaki ve kaptaki CUDA kütüphanelerinin uyuşmazlığı mı?
brunetto

1
Bilmiyorum, nvidia forumlarına sormak isteyebilirsiniz. Sürüm uyumsuzluğunun bir sorun olduğunu varsayarsak, bu Dockerfile dosyasını alıp CUDA 5.5 sürücülerine sahip olacak şekilde düzenleyebilir, ardından yeni bir docker görüntüsünü yeniden oluşturabilir ve kullanabilirsiniz.
tleyden

3
Nvidia sürücüsünü kurmak için neden görüntü gerektiğini açıklayabilir misiniz? Ben sadece nvidia sürücüsü (ve kullanımı --device ...) yükleme ana yeterli olduğunu düşündüm?
Helin Wang

2
Şu anda ana bilgisayar olarak Windows varsa bunu yapmanın bir yolu yoktur.
Souradeep Nanda

47

Halihazırda var olan cevapların çoğu şu an için eski olduğu için güncellenmiş bir cevap yazmak.

Daha önceki sürümleri Docker 19.03gerektirecek şekilde kullanılır nvidia-docker2ve --runtime=nvidiabayrak.

Bu nedenle, paketi Docker 19.03yüklemeniz nvidia-container-toolkitve ardından --gpus allbayrağı kullanmanız gerekir .

İşte temeller,

Paket Kurulumu

nvidia-container-toolkitPaketi Github'daki resmi belgelere göre kurun .

Redhat tabanlı işletim sistemleri için aşağıdaki komutları yürütün:

$ 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 tabanlı işletim sistemleri için aşağıdaki komutları yürütün:

# 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

Bağlantı istasyonunu GPU desteği ile çalıştırma

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

Bayrağın --gpus all, docker kapsayıcısına tüm kullanılabilir gpusları atamak için kullanıldığını unutmayın .

Bağlantı istasyonu kabına belirli bir gpu atamak için (makinenizde birden fazla GPU olması durumunda)

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

Veya

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

5
2019'dan itibaren GPU'yu docker konteynırlarından kullanmanın doğru yolu budur.
Timur Bakeyev

1
Herkes bunu AWS'de bir Toplu iş içinden denedi mi?
medley56

1
Bunun en alakalı olduğuna inanıyorum. Daha önce bulmuş olsaydım, guntub.com/NVIDIA/nvidia-docker'dan Ubuntu 20.04
VictorLegros

40

Tamam nihayet --privileged modunu kullanmadan başardı.

Ubuntu sunucu 14.04 üzerinde çalışıyorum ve son cuda (linux 13.04 64 bit için 6.0.37) kullanıyorum.


Hazırlık

Ana makinenize nvidia sürücüsü ve cuda yükleyin. (biraz zor olabilir bu yüzden bu kılavuzu takip etmenizi öneririm /ubuntu/451672/instal-and-testing-cuda-in-ubuntu-14-04 )

DİKKAT: Host cuda kurulumu için kullandığınız dosyaları saklamanız gerçekten önemlidir.


Dox Daemon'u lxc kullanarak çalıştırın

Yapılandırmayı değiştirebilmek ve kapsayıcının aygıta erişimini sağlamak için lxc sürücüsünü kullanarak docker daemon'u çalıştırmamız gerekiyor.

Bir kez kullanım:

sudo service docker stop
sudo docker -d -e lxc

Kalıcı yapılandırma / etc / default / docker içinde bulunan docker yapılandırma dosyanızı değiştirin '-e lxc' ekleyerek DOCKER_OPTS satırını değiştirin

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

Sonra daemon'u yeniden başlatın

sudo service docker restart

Daemon etkin bir şekilde lxc sürücüsü kullanıp kullanmadığını nasıl kontrol edebilirim?

docker info

Yürütme Sürücüsü satırı şöyle görünmelidir:

Execution Driver: lxc-1.0.5

NVIDIA ve CUDA sürücüsü ile görüntünüzü oluşturun.

İşte CUDA uyumlu bir görüntü oluşturmak için temel bir 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.

Resminizi çalıştırın.

İlk önce cihazınızla ilişkili ana numaranızı tanımlamanız gerekir. En kolay yol aşağıdaki komutu yapmaktır:

ls -la /dev | grep nvidia

Sonuç boşsa, ana bilgisayardaki örneklerden birini başlatmak hile yapmalıdır. Sonuç şöyle görünmelidir resim açıklamasını buraya girin Gördüğünüz gibi grup ve tarih arasında 2 sayı kümesi vardır. Bu 2 sayıya büyük ve küçük numaralar denir (bu sırada yazılır) ve bir cihaz tasarlar. Kolaylık için sadece büyük sayıları kullanacağız.

LXC sürücüsünü neden etkinleştirdik? Konteynerimizin bu cihazlara erişmesine izin vermemize izin veren lxc conf seçeneğini kullanmak için. Seçenek: (küçük sayı için * kullanmanızı öneririz çünkü run komutunun uzunluğunu azaltır)

--lxc-conf = 'lxc.cgroup.devices.allow = c [büyük sayı]: [küçük sayı veya *] rwm'

Eğer bir konteyner başlatmak istiyorsanız Yani (varsayalım resim adınız cuda).

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

Konteyneri paylaşabilir misiniz?
ChillarAnand

1
Docker, --devicekapsayıcının ana bilgisayarın cihazına erişmesine izin verme seçeneğine sahiptir . Ancak --device=/dev/nvidia0docker konteyner cuda çalıştırmak izin vermek için kullanmaya çalıştım ve başarısız oldu.
shiquanwang

4
Sonra bütün teşhir bulmayı /dev/nvidiao, /dev/nvidia1, /dev/nvidiactlve /dev/nvidia-uvmile --device. Gerçi bilmiyorum neden.
shiquanwang

Bu çözümü bulmak zorunda kaldığımda --device seçeneği uygulanmadı. En azından nvidia0 veya nvidia1 (grafik kartı) ve nvidiactl (genel nvidia cihazı) ve nvidia-uvm (Birleşik bellek cihazı) gerekir.
Regan

2
/dev/nvidia*@ Regan'daki ipuçlarınız için teşekkürler. @ChillarAnand için bir cuda -docker
shiquanwang

29

Docker kapları içinde NVIDIA GPU'ları kullanma sürecini kolaylaştıracak deneysel bir GitHub deposu çıkardık.


4
Windows desteği var mı? Öyle görünmüyor, ama belki de bir şey eksik.
Blaze

6
Windows desteği yok. CUDA kapsayıcısını çalıştırmak için Linux için Nvidia sürücüleri ve GPU'yu temsil eden Linux aygıtlarına erişim gerekir, örn. / Dev / nvidia0. Docker Windows'a yüklendiğinde ve VirtualBox sanal makinesinin içinde çalışırken bu cihazlar ve sürücüler kullanılamaz.
Paweł Bylica

Çalıştır komutunda hala --device bildirimlerine mi ihtiyacınız var? Nvidia / cuda'dan bir konteyner inşa ettim ve konteyner iyi çalışıyor, ancak uygulama (Wowza) doğrudan ana bilgisayarda çalıştırıldığında iyi çalışıyorken (Wowza) GPU'ları tanımıyor (bu ana bilgisayar, bu yüzden sürücülerin iyi olduğunu biliyorum) . 361.28 koşuyorum. Ana bilgisayar g2.8xlarge üzerinde NVidia AMI kullanan EC2.
rainabba

Hiçbir şey nvidia-docker tarafından halledilmez, nvidia-smi'yi konteyner içinde çalıştırabilmeli ve cihazlarınızı görebilmelisiniz
3XX0

22

NVIDIA'nın son geliştirmeleri bunu yapmanın çok daha sağlam bir yolunu oluşturdu.

Esasen, CUDA / GPU sürücüsünü kapların içine yükleme ve ana sunucu çekirdek modülüyle eşleşmesini önleme yolunu buldular.

Bunun yerine, sürücüler ana bilgisayardadır ve kapların bunlara ihtiyacı yoktur. Şu anda değiştirilmiş bir docker-cli gerektiriyor.

Bu harika, çünkü şimdi konteynerler çok daha taşınabilir.

resim açıklamasını buraya girin

Ubuntu'da hızlı bir test:

# 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

Daha fazla ayrıntı için bkz. GPU Etkin Docker Kabı ve: https://github.com/NVIDIA/nvidia-docker


Tüm adımları aldıktan sonra bu iyi çalışır. Nvidia hepsini tek bir yerde sağlamaz, ancak bu örnek , ortak bir kullanım durumuyla çalışmasını sağlamak için ihtiyacınız olan her şeyi verir.
KobeJohn

@KobeJohn - Kurulum talimatlarını, komut satırını nasıl kullanacağımı ve kaplarımın cuda olanlardan miras aldığından emin oldum. Sadece benim için çalışıyor.
Matt

1
Aslında, nvidia-docker kullanımının mantıklı olduğu gerçek hayat senaryolarını verebilir misiniz?
Suncatcher

@Suncatcher - 3B oluşturma için GPU'ya erişim gerektiren bir kümede kullanıyorum. Uygulamaları yerleştirmek işleri dağıtmayı ve bakımını kolaylaştırdı.
Matt

17

Ubuntu 16.04'te cuda-8.0 için güncellendi

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. Konteynerinizi çalıştırı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

Şuna benzer bir çıktı görmelisiniz:

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


3
Aşağıdaki çıktıyı alıyorum. cudaGetDeviceCount döndürüldü 38 -> CUDA özellikli cihaz algılanmadı Sonuç = FAIL
Soichi Hayashi

Geç cevap, ancak muhtemelen bu makinede bir GPU'nuz olmadığı anlamına gelir
Jonathan

Bir Cuda-9 versiyonu hemen hemen aynı mıdır?
huseyin tugrul buyukisik

@huseyintugrulbuyukisik askubuntu için bu yanıtı gör askubuntu.com/questions/967332/… , bu cevabı rehber olarak kullanabileceğinizi söyleyebilirim, ancak aynı adımların uygulanacağını doğrulamak için cuda 9 ile çalışmadım
Jonathan

Bu şekilde yapma. Bu eski yöntem. Yeni yolu kullanın. Cevabımın bağlantısına bakın. Bu yöntem problemlerle doludur.
Matt

3

Docker kapsayıcısından GPU kullanmak için, yerel Docker kullanmak yerine Nvidia-docker'ı kullanın. Nvidia docker'ı kurmak için aşağıdaki komutları kullanın

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 tarafından x11docker kullanın :

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

Donanım ivmesi

OpenGL için donanım hızlandırma seçeneği -g, --gpu ile mümkündür.

Bu, çoğu durumda ana bilgisayarda açık kaynak sürücülerinin bulunduğu kutudan çıkar. Aksi takdirde wiki: özellik bağımlılıklarına bir göz atın. Kapalı kaynaklı NVIDIA sürücüleri bazı kurulumlara ihtiyaç duyar ve daha az x11docker X sunucu seçeneğini destekler.

Bu komut dosyası, tüm yapılandırma ve kurulumu işlediğinden gerçekten kullanışlıdır. Gpu ile X'te bir docker görüntüsü çalıştırmak kadar basit

x11docker --gpu imagename
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.