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 -v
dan / atau LXC cgroup
adalah cara untuk pergi tetapi saya tidak yakin bagaimana melakukannya dengan tepat
Jawaban:
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:
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
Temukan perangkat nvidia Anda
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:
Verifikasi CUDA diinstal dengan benar
Ini harus dijalankan dari dalam wadah buruh pelabuhan yang baru saja Anda luncurkan.
Instal sampel CUDA:
Buat sampel deviceQuery:
Jika semuanya berfungsi, Anda akan melihat output berikut:
sumber
ls -la /dev | grep nvidia
tetapi 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?Menulis jawaban yang diperbarui karena sebagian besar jawaban yang sudah ada sudah usang seperti yang sekarang.
Versi yang lebih awal dari yang
Docker 19.03
dibutuhkannvidia-docker2
dan--runtime=nvidia
bendera.Karena
Docker 19.03
, Anda perlu menginstalnvidia-container-toolkit
paket dan kemudian menggunakan--gpus all
bendera.Jadi, inilah dasar-dasarnya,
Instalasi Paket
Instal
nvidia-container-toolkit
paket sesuai dokumentasi resmi di Github .Untuk OS berbasis Redhat, jalankan serangkaian perintah berikut:
Untuk OS berbasis Debian, jalankan serangkaian perintah berikut:
Menjalankan buruh pelabuhan dengan dukungan GPU
Harap dicatat, bendera
--gpus all
digunakan 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)
Atau
sumber
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:
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
Kemudian restart daemon menggunakan
Bagaimana cara memeriksa apakah daemon secara efektif menggunakan driver lxc?
Baris Driver Eksekusi akan terlihat seperti itu:
Bangun gambar Anda dengan driver NVIDIA dan CUDA.
Berikut ini adalah Dockerfile dasar untuk membangun gambar yang kompatibel dengan CUDA.
Jalankan gambar Anda.
Pertama, Anda perlu mengidentifikasi nomor utama Anda yang terkait dengan perangkat Anda. Cara termudah adalah dengan melakukan perintah berikut:
Jika hasilnya kosong, gunakan meluncurkan salah satu sampel pada host harus melakukan trik. Hasilnya akan terlihat seperti itu. 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)
Jadi jika saya ingin meluncurkan sebuah wadah (Misalkan nama gambar Anda adalah cuda).
sumber
--device
opsi untuk memungkinkan wadah mengakses perangkat host. Namun saya mencoba menggunakan--device=/dev/nvidia0
untuk memungkinkan buruh pelabuhan untuk menjalankan cuda dan gagal./dev/nvidiao
,/dev/nvidia1
,/dev/nvidiactl
dan/dev/nvidia-uvm
dengan--device
. Meski tidak tahu kenapa./dev/nvidia*
@Regan. Untuk @ChillarAnand saya telah membuat cuda -dockerKami baru saja merilis repositori GitHub eksperimental yang seharusnya memudahkan proses penggunaan GPU NVIDIA di dalam wadah Docker.
sumber
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.
Tes cepat di Ubuntu:
Untuk lebih jelasnya lihat: Container Docker yang Diaktifkan GPU dan: https://github.com/NVIDIA/nvidia-docker
sumber
Diperbarui untuk cuda-8.0 di ubuntu 16.04
Instal docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
Buat gambar berikut yang menyertakan driver nvidia dan toolkit cuda
Dockerfile
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
sumber
Untuk menggunakan GPU dari wadah buruh pelabuhan, alih-alih menggunakan Docker asli, gunakan Nvidia-buruh pelabuhan. Untuk menginstal Nvidia docker gunakan perintah berikut
sumber
Gunakan x11docker oleh mviereck:
https://github.com/mviereck/x11docker#hardware-acceleration berkata
Script ini sangat nyaman karena menangani semua konfigurasi dan pengaturan. Menjalankan gambar buruh pelabuhan di X dengan GPU sesederhana itu
sumber