Compose: Dukungan untuk GPU NVIDIA di bawah Docker Compose

Dibuat pada 9 Mei 2019  ·  160Komentar  ·  Sumber: docker/compose

Di bawah Docker 19.03.0 Beta 2, dukungan untuk NVIDIA GPU telah diperkenalkan dalam bentuk CLI API baru --gpus. https://github.com/docker/cli/pull/1714 bicarakan tentang pemberdayaan ini.

Sekarang seseorang dapat dengan mudah melewati opsi --gpus untuk aplikasi berbasis Docker yang dipercepat GPU.

$ docker run -it --rm --gpus all ubuntu nvidia-smi
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
f476d66f5408: Pull complete 
8882c27f669e: Pull complete 
d9af21273955: Pull complete 
f5029279ec12: Pull complete 
Digest: sha256:d26d529daa4d8567167181d9d569f2a85da3c5ecaf539cace2c6223355d69981
Status: Downloaded newer image for ubuntu:latest
Tue May  7 15:52:15 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.116                Driver Version: 390.116                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P4            Off  | 00000000:00:04.0 Off |                    0 |
| N/A   39C    P0    22W /  75W |      0MiB /  7611MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
:~$ 

Sampai hari ini, Compose tidak mendukung ini. Ini adalah permintaan fitur untuk mengaktifkan Compose agar mendukung NVIDIA GPU.

kinenhancement statu0-triage

Komentar yang paling membantu

Ini adalah kebutuhan yang mendesak. Terima kasih atas upaya Anda!

Semua 160 komentar

Ini menjadi semakin penting sekarang karena 'nvidia runtime' lama (sekarang) tampak rusak dengan Docker 19.03.0 dan nvidia-container-toolkit-1.0.0-2 : https://github.com/NVIDIA/nvidia-docker/issues/1017

$ cat docker-compose.yml 
version: '2.3'

services:
 nvidia-smi-test:
  runtime: nvidia
  image: nvidia/cuda:9.2-runtime-centos7

$ docker-compose run nvidia-smi-test
Cannot create container for service nvidia-smi-test: Unknown runtime specified nvidia

Ini bekerja: docker run --gpus all nvidia/cudagl:9.2-runtime-centos7 nvidia-smi

Ini tidak: docker run --runtime=nvidia nvidia/cudagl:9.2-runtime-centos7 nvidia-smi

Adakah pekerjaan yang terjadi dalam hal ini?

Saya mendapatkan Docker CE 19.03.0 baru di mesin Ubuntu 18.04 LTS baru, memiliki versi NVIDIA Container Toolkit (née nvidia-docker2) yang saat ini dan cocok, tetapi tidak dapat menggunakannya karena docker-compose.yml 3.7 tidak mendukung --gpus bendera.

Apakah ada solusi untuk ini?

Ini bekerja: docker run --gpus all nvidia/cudagl:9.2-runtime-centos7 nvidia-smi

Ini tidak: docker run --runtime=nvidia nvidia/cudagl:9.2-runtime-centos7 nvidia-smi

Anda harus memiliki

{
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

di /etc/docker/daemon.json untuk --runtime=nvidia untuk terus bekerja. Info selengkapnya di sini .

ping @KlaasH @ulyssessouza @Goryudyuma @ chris-nenek yg tua. Ada pembaruan tentang ini?

Ini adalah kebutuhan yang mendesak. Terima kasih atas upaya Anda!

Apakah ini dimaksudkan agar pengguna secara manual mengisi /etc/docker/daemon.json setelah bermigrasi ke buruh pelabuhan> = 19.03 dan menghapus nvidia-docker2 untuk menggunakan nvidia-container-toolkit sebagai gantinya?

Tampaknya ini merusak banyak instalasi. Terutama, karena --gpus tidak tersedia di compose .

Tidak, ini adalah penyelesaian sampai compose mendukung flag gpus.

instal nvidia-docker-runtime:
https://github.com/NVIDIA/nvidia-container-runtime#docker -engine-setup
tambahkan ke /etc/docker/daemon.json
{
"runtimes": {
"nvidia": {
"path": "/ usr / bin / nvidia-container-runtime",
"runtimeArgs": []
}
}
}

buruh pelabuhan-menulis:
runtime: nvidia
lingkungan Hidup:
- NVIDIA_VISIBLE_DEVICES = semua

Tidak ada lagi yang seperti "/ usr / bin / nvidia-container-runtime". Masalah masih kritis.

itu akan membantu menjalankan lingkungan nvidia dengan docker-compose, hingga memperbaiki docker-compose

instal nvidia-docker-runtime:
https://github.com/NVIDIA/nvidia-container-runtime#docker -engine-setup
tambahkan ke /etc/docker/daemon.json
{
"runtimes": {
"nvidia": {
"path": "/ usr / bin / nvidia-container-runtime",
"runtimeArgs": []
}
}
}

buruh pelabuhan-menulis:
runtime: nvidia
lingkungan Hidup:

  • NVIDIA_VISIBLE_DEVICES = semua

Ini tidak berhasil untuk saya, masih mendapatkan Unsupported config option for services.myservice: 'runtime' saat mencoba menjalankan docker-compose up

ada ide?

Ini tidak berhasil untuk saya, masih mendapatkan Unsupported config option for services.myservice: 'runtime' saat mencoba menjalankan docker-compose up

ada ide?

setelah memodifikasi /etc/docker/daemon.json, restart layanan docker
systemctl restart buruh pelabuhan
gunakan Compose format 2.3 dan tambahkan runtime: nvidia ke layanan GPU Anda. Docker Compose harus versi 1.19.0 atau lebih tinggi.
file docker-compose:
versi: '2.3'

jasa:
nvsmi:
gambar: ubuntu: 16.04
runtime: nvidia
lingkungan Hidup:
- NVIDIA_VISIBLE_DEVICES = semua
perintah: nvidia-smi

@cheperuiz , Anda dapat menyetel nvidia sebagai runtime default di daemon.json dan tidak akan bergantung pada docker-compose. Tetapi semua kontainer buruh pelabuhan Anda akan menggunakan runtime nvidia - sejauh ini saya tidak memiliki masalah.
{ "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, }

Ah! terima kasih @Kwull , saya melewatkan default-runtime bagian itu ... Semuanya berfungsi sekarang :)

@uderik , runtime tidak lagi ada dalam skema format file 3.7 saat ini, atau dalam versi 3.8 tertunda yang pada akhirnya akan sejajar dengan Docker 19.03: https://github.com/docker/compose/blob/ 5e587d574a94e011b029c2fb491fb0f4bdeef71c / compose / config / config_schema_v3.8.json

@johncolby runtime tidak pernah menjadi flag 3.x. Ini hanya ada di track 2.x, (2.3 dan 2.4).

Ya, saya tahu, dan meskipun file docker-compose.yml saya menyertakan version: '2.3' (yang pernah berfungsi di masa lalu) tampaknya diabaikan oleh versi terbaru ...
Untuk proyek mendatang, apa cara yang benar untuk mengaktifkan / menonaktifkan akses ke GPU? hanya menjadikannya sebagai variabel default + env? atau akankah ada dukungan untuk flag --gpus ?

@johncolby apa pengganti runtime di 3.X?

@ Daniel451 Saya baru saja mengikuti secara periferal, tetapi sepertinya itu akan berada di bawah kunci generic_resources , seperti:

services:
  my_app:
    deploy:
      resources:
        reservations:
          generic_resources:
            - discrete_resource_spec:
                kind: 'gpu'
                value: 2

(dari https://github.com/docker/cli/blob/9a39a1/cli/compose/loader/full-example.yml#L71-L74)
Dokumen desain di sini: https://github.com/docker/swarmkit/blob/master/design/generic_resources.md

Berikut adalah masalah penulisan terkait dukungan skema pembuatan 3.8, yang telah digabungkan di: https://github.com/docker/compose/issues/6530

Di sisi daemon, kemampuan gpu dapat didaftarkan dengan memasukkannya ke dalam daemon.json atau dockerd CLI (seperti solusi runtime berkode keras sebelumnya), seperti

/usr/bin/dockerd --node-generic-resource gpu=2

yang kemudian didaftarkan dengan menghubungkan ke utilitas buruh pelabuhan NVIDIA:
https://github.com/moby/moby/blob/09d0f9/daemon/nvidia_linux.go

Sepertinya mesin pada dasarnya sudah siap, mungkin hanya perlu didokumentasikan ...

Perubahan apapun?

Juga menunggu pembaruan, menggunakan bash dengan docker run --gpus hingga perbaikan resmi ...

Menunggu pembaruan juga.

Juga menunggu pembaruan :)

Oke ... Saya tidak mengerti mengapa ini masih terbuka. 3 baris tambahan ini membuatnya berfungsi dengan skema versi 3.7. Senang mengetahui pekerja galangan responsif terhadap masalah komunitas yang sepele. Jadi kloning repo ini, tambahkan tiga baris ini, dan python3 setup.py build && install, dan pastikan docker-compose.yml Anda adalah versi 3.7.

[ruckc<strong i="6">@omnilap</strong> compose]$ git diff
diff --git a/compose/config/config_schema_v3.7.json b/compose/config/config_schema_v3.7.json
index cd7882f5..d25d404c 100644
--- a/compose/config/config_schema_v3.7.json
+++ b/compose/config/config_schema_v3.7.json
@@ -151,6 +151,7 @@

         "external_links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
         "extra_hosts": {"$ref": "#/definitions/list_or_dict"},
+        "gpus": {"type": ["number", "string"]},
         "healthcheck": {"$ref": "#/definitions/healthcheck"},
         "hostname": {"type": "string"},
         "image": {"type": "string"},
diff --git a/compose/service.py b/compose/service.py
index 55d2e9cd..71188b67 100644
--- a/compose/service.py
+++ b/compose/service.py
@@ -89,6 +89,7 @@ HOST_CONFIG_KEYS = [
     'dns_opt',
     'env_file',
     'extra_hosts',
+    'gpus',
     'group_add',
     'init',
     'ipc',
@@ -996,6 +997,7 @@ class Service(object):
             dns_opt=options.get('dns_opt'),
             dns_search=options.get('dns_search'),
             restart_policy=options.get('restart'),
+            gpus=options.get('gpus'),
             runtime=options.get('runtime'),
             cap_add=options.get('cap_add'),
             cap_drop=options.get('cap_drop'),

Saya baru saja menambahkan masalah internal untuk melacaknya.
Ingatlah bahwa PR dipersilakan: smiley:

Oke ... Saya tidak mengerti mengapa ini masih terbuka. 3 baris tambahan ini membuatnya berfungsi dengan skema versi 3.7. Senang mengetahui pekerja galangan responsif terhadap masalah komunitas yang sepele. Jadi kloning repo ini, tambahkan tiga baris ini, dan python3 setup.py build && install, dan pastikan docker-compose.yml Anda adalah versi 3.7.

[ruckc<strong i="7">@omnilap</strong> compose]$ git diff
diff --git a/compose/config/config_schema_v3.7.json b/compose/config/config_schema_v3.7.json
index cd7882f5..d25d404c 100644
--- a/compose/config/config_schema_v3.7.json
+++ b/compose/config/config_schema_v3.7.json
@@ -151,6 +151,7 @@

         "external_links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
         "extra_hosts": {"$ref": "#/definitions/list_or_dict"},
+        "gpus": {"type": ["number", "string"]},
         "healthcheck": {"$ref": "#/definitions/healthcheck"},
         "hostname": {"type": "string"},
         "image": {"type": "string"},
diff --git a/compose/service.py b/compose/service.py
index 55d2e9cd..71188b67 100644
--- a/compose/service.py
+++ b/compose/service.py
@@ -89,6 +89,7 @@ HOST_CONFIG_KEYS = [
     'dns_opt',
     'env_file',
     'extra_hosts',
+    'gpus',
     'group_add',
     'init',
     'ipc',
@@ -996,6 +997,7 @@ class Service(object):
             dns_opt=options.get('dns_opt'),
             dns_search=options.get('dns_search'),
             restart_policy=options.get('restart'),
+            gpus=options.get('gpus'),
             runtime=options.get('runtime'),
             cap_add=options.get('cap_add'),
             cap_drop=options.get('cap_drop'),

saya mencoba solusi Anda tetapi saya mendapatkan banyak kesalahan tentang bendera itu:

ERROR: for <SERVICE_NAME>  __init__() got an unexpected keyword argument 'gpus'
Traceback (most recent call last):
  File "/usr/local/bin/docker-compose", line 11, in <module>
    load_entry_point('docker-compose==1.25.0.dev0', 'console_scripts', 'docker-compose')()
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/cli/main.py", line 71, in main
    command()
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/cli/main.py", line 127, in perform_command
    handler(command, command_options)
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/cli/main.py", line 1106, in up
    to_attach = up(False)
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/cli/main.py", line 1102, in up
    cli=native_builder,
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/project.py", line 569, in up
    get_deps,
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/parallel.py", line 112, in parallel_execute
    raise error_to_reraise
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/parallel.py", line 210, in producer
    result = func(obj)
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/project.py", line 555, in do
    renew_anonymous_volumes=renew_anonymous_volumes,
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/service.py", line 546, in execute_convergence_plan
    scale, detached, start
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/service.py", line 468, in _execute_convergence_create
    "Creating"
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/parallel.py", line 112, in parallel_execute
    raise error_to_reraise
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/parallel.py", line 210, in producer
    result = func(obj)
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/service.py", line 466, in <lambda>
    lambda service_name: create_and_start(self, service_name.number),
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/service.py", line 454, in create_and_start
    container = service.create_container(number=n, quiet=True)
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/service.py", line 337, in create_container
    previous_container=previous_container,
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/service.py", line 913, in _get_container_create_options
    one_off=one_off)
  File "/usr/local/lib/python3.6/dist-packages/docker_compose-1.25.0.dev0-py3.6.egg/compose/service.py", line 1045, in _get_container_host_config
    cpu_rt_runtime=options.get('cpu_rt_runtime'),
  File "/usr/local/lib/python3.6/dist-packages/docker-4.0.2-py3.6.egg/docker/api/container.py", line 590, in create_host_config
    return HostConfig(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'gpus'

Apakah saya memerlukan paket python docker ?

@DarioTurchi Ya, saya menemui masalah yang sebenarnya. Sepertinya jenis HostConfig juga perlu diperbarui.

Saya tidak percaya perubahan yang dijelaskan oleh @ruckc sudah cukup, karena docker-py juga memerlukan perubahan. Dan sepertinya perubahan buruh pelabuhan yang diperlukan masih dikerjakan. Lihat disini:
https://github.com/docker/docker-py/pull/2419

Ini cabang dengan perubahannya:
https://github.com/sigurdkb/docker-py/tree/gpus_parameter

Jadi jika Anda ingin menambal ini sekarang, Anda harus membangun docker-compose terhadap docker-py yang dimodifikasi dari https://github.com/sigurdkb/docker-py/tree/gpus_parameter

Saya tidak mengerti apa yang terjadi di sini:

1) Saya memiliki /etc/docker/daemon.json

{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

tetapi runtime key tidak dapat digunakan lagi di v3.x seperti untuk https://github.com/docker/compose/issues/6239

Saya juga mencoba:

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

Jadi saya tidak dapat memulai container saya dengan dukungan gpu pada docker-compose lagi:

bertserving_1    | I:VENTILATOR:[__i:_ge:222]:get devices
bertserving_1    | W:VENTILATOR:[__i:_ge:246]:no GPU available, fall back to CPU

Sebelum perubahan itu berhasil, jadi apa yang bisa saya lakukan sekarang?

+1 akan sangat berguna untuk memiliki fitur seperti itu di docker-compose!

Ada eta?

dilacak secara internal sebagai https://docker.atlassian.net/browse/COMPOSE-82

+1 akan menjadi fitur yang berguna untuk pembuat galangan-galangan

Fitur ini akan menjadi tambahan yang luar biasa untuk docker-compose

Sekarang solusi saya untuk ini adalah menggunakan versi 2.3 dari file docker-compose, yang mendukung runtime, dan secara manual menginstal nvidia-container-runtime (karena tidak lagi diinstal dengan nvidia-buruh pelabuhan).
Saya juga mengatur konfigurasi runtime di /etc/docker/daemon.json (bukan sebagai default, hanya sebagai runtime yang tersedia).
Dengan ini saya dapat menggunakan file tulis seperti:

version: '2.3'
services:
  test:
    image: nvidia/cuda:9.0-base
    runtime: nvidia

Sekarang solusi saya untuk ini adalah menggunakan versi 2.3 dari file docker-compose, yang mendukung runtime, dan secara manual menginstal nvidia-container-runtime (karena tidak lagi diinstal dengan nvidia-buruh pelabuhan).
Saya juga mengatur konfigurasi runtime di /etc/docker/daemon.json (bukan sebagai default, hanya sebagai runtime yang tersedia).
Dengan ini saya dapat menggunakan file tulis seperti:

version: '2.3'
services:
  test:
    image: nvidia/cuda:9.0-base
    runtime: nvidia

@arruda Maukah Anda membagikan daemon.json ?

Sekarang solusi saya untuk ini adalah menggunakan versi 2.3 dari file docker-compose, yang mendukung runtime, dan secara manual menginstal nvidia-container-runtime (karena tidak lagi diinstal dengan nvidia-buruh pelabuhan).
Saya juga mengatur konfigurasi runtime di /etc/docker/daemon.json (bukan sebagai default, hanya sebagai runtime yang tersedia).
Dengan ini saya dapat menggunakan file tulis seperti:

version: '2.3'
services:
  test:
    image: nvidia/cuda:9.0-base
    runtime: nvidia

@arruda Maukah Anda membagikan daemon.json ?

Ya, tidak masalah, ini dia:

{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

Hai

Saya memiliki aplikasi yang membutuhkan driver NVIDIA. Saya telah membuat gambar buruh pelabuhan berdasarkan (FROM)
nvidia / cudagl: 10.1-runtime-ubuntu18.04

Menggunakan pendekatan yang direkomendasikan di atas - apakah itu berarti gambar saya tidak perlu diturunkan dari nvidia / cudagl: 10.1-runtime-ubuntu18.04 ? Yaitu saya bisa saja mengambil dari (FROM) python: 3.7.3-stretch
dan menambahkan runtime: nvidia ke layanan di docker-compose?

Terima kasih

@rfsch Tidak, itu hal yang berbeda. runtime: nvidia di docker-compose mengacu pada runtime Docker. Ini membuat GPU tersedia untuk penampung. Tapi Anda masih membutuhkan beberapa cara untuk menggunakannya setelah tersedia. runtime di nvidia/cudagl:10.1-runtime-ubuntu18.04 mengacu pada komponen runtime CUDA. Ini memungkinkan Anda menggunakan GPU (disediakan dalam wadah oleh Docker) menggunakan CUDA.

Dalam gambar ini:

Docker architecture

runtime: nvidia menggantikan bagian runc / containerd. nvidia/cudagl:10.1-runtime-ubuntu18.04 benar-benar di luar gambar .

kami membutuhkan fitur ini

@ Daniel451 Saya baru saja mengikuti secara periferal, tetapi sepertinya itu akan berada di bawah kunci generic_resources , seperti:

services:
  my_app:
    deploy:
      resources:
        reservations:
          generic_resources:
            - discrete_resource_spec:
                kind: 'gpu'
                value: 2

(dari https://github.com/docker/cli/blob/9a39a1/cli/compose/loader/full-example.yml#L71-L74)
Dokumen desain di sini: https://github.com/docker/swarmkit/blob/master/design/generic_resources.md

Berikut adalah masalah penulisan terkait dukungan skema compose 3.8, yang telah digabungkan di: # 6530

Di sisi daemon, kemampuan gpu dapat didaftarkan dengan memasukkannya ke dalam daemon.json atau dockerd CLI (seperti solusi runtime berkode keras sebelumnya), seperti

/usr/bin/dockerd --node-generic-resource gpu=2

yang kemudian didaftarkan dengan menghubungkan ke utilitas buruh pelabuhan NVIDIA:
https://github.com/moby/moby/blob/09d0f9/daemon/nvidia_linux.go

Sepertinya mesin pada dasarnya sudah siap, mungkin hanya perlu didokumentasikan ...

Hai, @johncolby , saya coba ini, tapi gagal:

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.nvidia-smi-test.deploy.resources.reservations value Additional properties are not allowed ('generic_resources' was unexpected)

ada saran?

Terima kasih
David

Menginstal nvidia-container-runtime 3.1.4.1 dari https://github.com/NVIDIA/nvidia-container-runtime dan meletakkan

runtime: nvidia

berfungsi dengan baik di sini dengan docker-compose 1.23.1 dan 1.24.1 seperti yang diinstal dari https://docs.docker.com/compose/install/ menggunakan perintah yang tampak cerdik ini:

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

dan misalnya kontainer berbasis nvidia / cudagl / 10.1 dari dockerhub. Saya sudah mencoba rendering cuda dan OpenGL dan semuanya mendekati performa asli.

Dilacak secara internal sebagai COMPOSE-82
Harap perhatikan bahwa perubahan seperti itu juga perlu diterapkan di docker stack (https://github.com/docker/cli/blob/master/cli/compose/types/types.go#L156) untuk konsistensi

Menginstal nvidia-container-runtime 3.1.4.1 dari https://github.com/NVIDIA/nvidia-container-runtime dan meletakkan

runtime: nvidia

berfungsi dengan baik di sini dengan docker-compose 1.23.1 dan 1.24.1 seperti yang diinstal dari https://docs.docker.com/compose/install/ menggunakan perintah yang tampak cerdik ini:

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

dan misalnya kontainer berbasis nvidia / cudagl / 10.1 dari dockerhub. Saya sudah mencoba rendering cuda dan OpenGL dan semuanya mendekati performa asli.

dapatkah Anda membagikan docker-compose.yml Anda?

hai, @ jdr-face,

berikut adalah pengujian saya mengikuti saran Anda, dengan menginstal nvidia-container-runtime di mesin host.

version: '3.0'

services:
  nvidia-smi-test:
    runtime: nvidia
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix 
    environment:
     - NVIDIA_VISIBLE_DEVICES=0 
     - DISPLAY
    image: vkcube

itu masih memberikan kesalahan:

       Unsupported config option for services.nvidia-smi-test: 'runtime'

@ david-gwa seperti yang dicatat oleh andyneff sebelumnya :

runtime tidak pernah menjadi flag 3.x. Ini hanya ada di track 2.x, (2.3 dan 2.4).

@ david-gwa

dapatkah Anda membagikan docker-compose.yml Anda?

version: '2.3'

services:
    container:
        image: "nvidia/cudagl/10.1-base"

        runtime: "nvidia" 

        security_opt:
            - seccomp:unconfined
        privileged: true

        volumes:
            - $HOME/.Xauthority:/root/.Xauthority:rw
            - /tmp/.X11-unix:/tmp/.X11-unix:rw

        environment:
          - NVIDIA_VISIBLE_DEVICES=all

Bergantung pada kebutuhan Anda, beberapa opsi tersebut mungkin tidak diperlukan. Seperti prediksi @muru , triknya adalah menentukan versi lama. Setidaknya untuk kasus penggunaan saya ini bukan masalah, tetapi saya hanya menawarkan konfigurasi ini sebagai solusi, benar-benar harus dimungkinkan menggunakan versi terbaru.

terima kasih teman-teman, @ jdr-face, @muru , compose v2 berhasil,
Saya salah paham bahwa solusi Anda adalah untuk penulisan v3.

Sebagai catatan, secara tradisional: compose v2 tidak lebih tua dari compose v3. Mereka adalah kasus penggunaan yang berbeda. v3 diarahkan untuk swarm sedangkan v2 tidak. v1 sudah tua.

Apakah ada diskusi tentang dukungan Docker-compose untuk dukungan GPU native Docker?

Mendukung opsi runtime bukanlah solusi untuk dukungan GPU di masa mendatang. NVIDIA menjelaskan tentang masa depan nvidia-docker2 di https://github.com/NVIDIA/nvidia-docker sebagai berikut.

Perhatikan bahwa dengan rilis Docker 19.03, penggunaan paket nvidia-docker2 tidak digunakan lagi karena GPU NVIDIA sekarang secara native didukung sebagai perangkat di runtime Docker.

Saat ini, dukungan GPU dapat direalisasikan dengan mengubah runtime, tetapi sangat mungkin hal ini tidak akan berfungsi di masa mendatang.

Sejujurnya, ini mungkin bukan praktik terbaik, tetapi entah bagaimana kami membuatnya berhasil.

Bagian yang sulit adalah kita harus tetap menggunakan docker-compose v3.x karena kita menggunakan docker swarm, sementara itu kita ingin menggunakan Nvidia Runtime untuk mendukung GPU / CUDA di dalam container.

Untuk menghindari secara eksplisit memberi tahu Nvidia Runtime di dalam file docker-compose, kami menetapkan Nvidia sebagai runtime default di /etc/docker/daemon.json , dan itu akan terlihat seperti

{
    "default-runtime":"nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

Sehingga semua container yang berjalan pada mesin GPU akan secara default mengaktifkan runtime Nvidia.

Semoga ini dapat membantu seseorang menghadapi pemblokir serupa

Sejujurnya, ini mungkin bukan praktik terbaik, tetapi entah bagaimana kami membuatnya berhasil.

Bagian yang sulit adalah kita harus tetap menggunakan docker-compose v3.x karena kita menggunakan docker swarm, sementara itu kita ingin menggunakan Nvidia Runtime untuk mendukung GPU / CUDA di dalam container.

Untuk menghindari secara eksplisit memberi tahu Nvidia Runtime di dalam file docker-compose, kami menetapkan Nvidia sebagai runtime default di /etc/docker/daemon.json , dan itu akan terlihat seperti

{
    "default-runtime":"nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

Sehingga semua container yang berjalan pada mesin GPU akan secara default mengaktifkan runtime Nvidia.

Semoga ini dapat membantu seseorang menghadapi pemblokir serupa

Ini memang yang kami lakukan juga. Ini berfungsi untuk saat ini, tetapi bagi saya terasa sedikit hacky. Berharap dukungan penuh menulis-v3 segera. :)

Apakah ini dimaksudkan agar pengguna secara manual mengisi /etc/docker/daemon.json setelah bermigrasi ke buruh pelabuhan> = 19.03 dan menghapus nvidia-docker2 untuk menggunakan nvidia-container-toolkit sebagai gantinya?

Tampaknya ini merusak banyak instalasi. Terutama, karena --gpus tidak tersedia di compose .

--gpus tidak tersedia di compose
Saya tidak dapat menggunakan pycharm untuk menghubungkan buruh pelabuhan untuk menjalankan tensorflow-gpu

Adakah pembaruan tentang masalah ini? Apakah ada kemungkinan --gpus akan segera didukung di docker-compose?

Bagi Anda yang mencari solusi, inilah yang akhirnya kami lakukan:

Dan kemudian jalankan COMPOSE_API_VERSION=auto docker-compose run gpu dengan file berikut:

version: '3.7'

services:
    gpu:
        image: 'nvidia/cuda:9.0-base'
        command: 'nvidia-smi'
        device_requests:
            - capabilities:
               - "gpu"

Di bawah Docker 19.03.0 Beta 2, dukungan untuk NVIDIA GPU telah diperkenalkan dalam bentuk CLI API baru --gpus. buruh pelabuhan / cli # 1714 berbicara tentang pemberdayaan ini.

Sekarang seseorang dapat dengan mudah melewati opsi --gpus untuk aplikasi berbasis Docker yang dipercepat GPU.

$ docker run -it --rm --gpus all ubuntu nvidia-smi
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
f476d66f5408: Pull complete 
8882c27f669e: Pull complete 
d9af21273955: Pull complete 
f5029279ec12: Pull complete 
Digest: sha256:d26d529daa4d8567167181d9d569f2a85da3c5ecaf539cace2c6223355d69981
Status: Downloaded newer image for ubuntu:latest
Tue May  7 15:52:15 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.116                Driver Version: 390.116                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P4            Off  | 00000000:00:04.0 Off |                    0 |
| N/A   39C    P0    22W /  75W |      0MiB /  7611MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
:~$ 

Sampai hari ini, Compose tidak mendukung ini. Ini adalah permintaan fitur untuk mengaktifkan Compose agar mendukung NVIDIA GPU.

Saya telah memecahkan masalah ini, Anda dapat mencoba sebagai berikut, alamat blog csdn saya: https://blog.csdn.net/u010420283/article/details/104055046

~ $ sudo apt-get install nvidia-container-runtime
~ $ sudo vim /etc/docker/daemon.json

lalu, di file daemon.json ini, tambahkan konten ini:

{
"default-runtime": "nvidia"
"runtimes": {
"nvidia": {
"path": "/ usr / bin / nvidia-container-runtime",
"runtimeArgs": []
}
}
}

~ $ sudo systemctl daemon-reload
~ $ sudo systemctl restart buruh pelabuhan

Untuk pengguna ansible yang ingin setup solusi yang dijelaskan sebelumnya, ada peran untuk menginstal nvidia-kontainer-runtime dan mengkonfigurasi /etc/docker/deamon.json untuk menggunakan runtime: nvidia :

https://github.com/NVIDIA/ansible-role-nvidia-docker

(untuk beberapa alasan ini hanya berjalan di Ubuntu dan RHEL, tetapi cukup mudah untuk dimodifikasi. Saya menjalankannya di Debian)

Kemudian di docker-compose.yml Anda :

version: "2.4"
services:
  test:
    image: "nvidia/cuda:10.2-runtime-ubuntu18.04"
    command: "nvidia-smi"

ada pembaruan pada versi 3.x resmi dengan dukungan gpu? Kami membutuhkan swarm :)

Apakah ada rencana untuk menambahkan fitur ini?

Fitur ini bergantung pada docker-py yang mengimplementasikan parameter device_requests , yang diterjemahkan menjadi --gpus . Ada beberapa permintaan tarik untuk menambahkan fitur ini (https://github.com/docker/docker-py/pull/2419, https://github.com/docker/docker-py/pull/2465, https: / /github.com/docker/docker-py/pull/2471) tetapi tidak ada reaksi dari pengelola mana pun. # 7124 menggunakan https://github.com/docker/docker-py/pull/2471 untuk menyediakannya di Compose, tetapi tetap tidak ada balasan dari siapa pun.

Seperti yang saya sebutkan di # 7124, saya sangat senang untuk membuat PR lebih patuh, tetapi karena perhatiannya sangat sedikit, saya tidak ingin membuang waktu saya untuk sesuatu yang tidak akan digabungkan ...

Silakan tambahkan fitur ini, akan luar biasa!

Tolong, tambahkan fitur ini! Saya sangat senang dengan nevidia-docker2 lama, yang memungkinkan saya mengubah runtime di daemon.json. Akan sangat menyenangkan memiliki ini kembali.

Tolong, butuh itu. Benar-benar membutuhkannya: /

Saya ingin menumpuk juga ... kita membutuhkan fitur ini!

Saya perlu menjalankan kontainer CPU dan GPU pada mesin yang sama sehingga peretasan runtime default tidak berfungsi untuk saya. Apakah kita tahu kapan ini akan berhasil pada penulisan? Mengingat bahwa kita tidak memiliki flag runtime dalam compose, ini mewakili regresi fungsionalitas yang serius, bukan? Saya harus menulis skrip untuk membuat ini berhasil - yuck!

Saya perlu menjalankan kontainer CPU dan GPU pada mesin yang sama sehingga peretasan runtime default tidak berfungsi untuk saya. Apakah kita tahu kapan ini akan berhasil pada penulisan? Mengingat bahwa kita tidak memiliki flag runtime dalam compose, ini mewakili regresi fungsionalitas yang serius, bukan? Saya harus menulis skrip untuk membuat ini berhasil - yuck!

Anda dapat melakukannya dengan docker cli (docker run --gpu ....), saya memiliki trik semacam ini (dengan menambahkan proxy, untuk dapat berkomunikasi dengan container lain yang berjalan di node lain di swarm). Kita semua menunggu kemampuan untuk menjalankannya di swarm, karena itu tidak bekerja dengan perintah layanan buruh pelabuhan (seperti yang saya tahu) atau dengan menulis.

@tokopedia . Baiklah ;-). Saya menyadari hal ini dan karenanya referensi ke skrip. Tapi ini adalah cara yang cukup buruk dan tidak portabel untuk melakukannya, jadi saya ingin melakukannya dengan cara yang lebih dinamis. Seperti yang saya katakan, saya pikir ini mewakili regresi, bukan fitur yang ditanyakan.

COMPOSE_API_VERSION=auto docker-compose run gpu

@ggregoire di mana kita menjalankan: COMPOSE_API_VERSION = auto docker-compose run gpu?

@joehoeller dari shell Anda hanya akan Anda lakukan untuk perintah lain.

Saat ini kami memutuskan untuk setiap proyek apakah kami membutuhkan fitur 3.x atau jika kami dapat menggunakan docker-compose 2.x di mana opsi GPU masih didukung. Fitur seperti menjalankan target multistage dari Dockerfile sayangnya tidak dapat digunakan jika GPU diperlukan. Tolong tambahkan ini kembali!

Saya ingin merekomendasikan sesuatu seperti bidang "opsi tambahan" untuk pembuatan-galangan di mana kita bisa menambahkan bendera seperti --gpus=all ke perintah start / jalankan buruh pelabuhan, yang belum / lagi didukung di galangan-tulis tetapi dalam versi buruh pelabuhan terbaru. Dengan cara ini, pengguna compose tidak perlu menunggu docker-compose menyusul jika mereka membutuhkan fitur docker baru yang belum didukung.

Masih diperlukan untuk menjalankan ini di Docker Swarm untuk lingkungan produksi. Apakah ini akan berguna oleh Docker Swarm?

@sebastianfelipe Ini sangat berguna jika Anda ingin menerapkan ke swarm Anda menggunakan compose.
Membandingkan:
docker service create --generic-resource "gpu=1" --replicas 10 \ --name sparkWorker <image_name> \"service ssh start && \ /opt/spark/bin/spark-class org.apache.spark.deploy.worker.Worker spark://<spark_master_ip>:7077\"

untuk sesuatu seperti ini

docker stack deploy --compose-file docker-compose.yml stackdemo

Maaf, jadi apakah itu sudah bekerja dengan Docker Swarm menggunakan file yaml pembuat-buruh pelabuhan? Hanya untuk memastikan: O. Terima kasih!

hanya untuk buruh pelabuhan menulis 2.x

Inti dari masalah ini adalah meminta dukungan gpu nvidia-docker untuk docker-compose 3+

Sudah hampir setahun sejak permintaan asli !! Kenapa ditunda ?? Bisakah kita memajukan ini ??

ping @KlaasH @ulyssessouza @Goryudyuma @ chris-nenek yg tua. Ada pembaruan tentang ini?

Bagi Anda yang mencari solusi, inilah yang akhirnya kami lakukan:

Dan kemudian jalankan COMPOSE_API_VERSION=auto docker-compose run gpu dengan file berikut:

version: '3.7'

services:
    gpu:
        image: 'nvidia/cuda:9.0-base'
        command: 'nvidia-smi'
        device_requests:
            - capabilities:
               - "gpu"

Bagi Anda yang tidak sabar seperti saya, berikut ini cara mudah versi pip install dari solusi di atas:

pip install git+https://github.com/docker/docker-py.git@refs/pull/2471/merge
pip install git+https://github.com/docker/compose.git@refs/pull/7124/merge
pip install python-dotenv

Pujian besar untuk
Masih dengan cemas menunggu patch resmi. Dengan semua PR yang ada, tampaknya tidak sulit menurut standar apa pun.

ping @KlaasH @ulyssessouza @Goryudyuma @ chris-nenek yg tua. Ada pembaruan tentang ini?

Tidak, saya tidak tahu mengapa saya dipanggil.
Saya ingin Anda memberi tahu saya apa yang harus saya lakukan?

Saya harap ada pembaruan tentang ini.

Ya, sudah lebih dari setahun sekarang ... kenapa mereka tidak bergabung dalam buruh pelabuhan-py ...

Saya tidak yakin bahwa implementasi yang diusulkan adalah yang tepat untuk format Tulis. Kabar baiknya adalah kami telah membuka spesifikasi format Compose dengan tujuan menambahkan hal-hal seperti ini. Anda dapat menemukan spesifikasinya di https://github.com/compose-spec.

Apa yang saya sarankan agar kita lakukan adalah menambahkan masalah pada spesifikasi dan kemudian mendiskusikannya di salah satu pertemuan komunitas Compose yang akan datang (tautan untuk mengundang di bagian bawah halaman ini ).

Ini bekerja: docker run --gpus all nvidia/cudagl:9.2-runtime-centos7 nvidia-smi
Ini tidak: docker run --runtime=nvidia nvidia/cudagl:9.2-runtime-centos7 nvidia-smi

Anda harus memiliki

{
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

di /etc/docker/daemon.json untuk --runtime=nvidia untuk terus bekerja. Info selengkapnya di sini .

Dockerd tidak dimulai dengan daemon.json ini

Ya Tuhan, ini akan memakan waktu bertahun-tahun: @

Ini bekerja: docker run --gpus all nvidia/cudagl:9.2-runtime-centos7 nvidia-smi
@deniswal : Ya, kami mengetahui hal ini, tetapi kami bertanya tentang fungsionalitas penulisan.

@ chris-crone: Saya bingung: Ini mewakili regresi dari perilaku sebelumnya, mengapa ini memerlukan spesifikasi fitur baru? Bukankah masuk akal untuk menjalankan kontainer, beberapa di antaranya menggunakan GPU dan beberapa di antaranya menggunakan CPU pada kotak fisik yang sama?

Terima kasih atas pertimbangannya.

@ vk1z AFAIK Docker Compose tidak pernah memiliki dukungan GPU jadi ini bukan regresi. Bagian yang membutuhkan desain adalah cara mendeklarasikan kebutuhan layanan untuk GPU (atau perangkat lain) dalam format Compose– khususnya perubahan seperti ini . Setelah itu, seharusnya hanya disalurkan ke bagian belakang.

Hai Teman-teman, saya sudah mencoba beberapa solusi yang diusulkan di sini dan tidak ada yang berhasil untuk saya, misalnya @miriaford tidak berfungsi dalam kasus saya, juga apakah ada cara untuk menggunakan GPU untuk menjalankan kontainer buruh pelabuhan yang ada?
Saya memiliki i7 dengan ram 16GB tetapi pembuatan untuk beberapa proyek membutuhkan waktu terlalu lama untuk diselesaikan, tujuan saya juga menggunakan daya GPU untuk mempercepat proses, apakah itu mungkin? Terima kasih!

@ chris-crone: Sekali lagi, saya akan bersedia untuk diperbaiki, tetapi bukankah itu karena parameter runtime: menghilang dari penulisan setelah konfigurasi 2.4? Itulah mengapa saya merasa itu adalah kemunduran. Tapi tidak, masalah sekarang karena kita semua harus di 3.x pula.

Saya akan dengan senang hati mengajukan masalah, apakah kita melakukannya terhadap spesifikasi di repo spesifikasi, benar?

tetapi bukankah itu karena runtime: parameter menghilang dari penulisan setelah konfigurasi 2,4? Itulah mengapa saya merasa itu adalah kemunduran.

Ya persis. Saya memiliki beberapa proyek di mana kami mengandalkan penggunaan runtime: nvidia dalam file penulisan-galangan kami, dan masalah ini menghalangi kami untuk meningkatkan ke 3.x karena kami belum menemukan cara untuk menggunakan GPU di sana.

Hai, tolong, tolong, perbaiki ini.
Ini harus ditandai sebagai prioritas kritis misi -20

Sekali lagi, saya bersedia dikoreksi, tetapi bukankah itu karena parameter runtime: menghilang dari penulisan setelah konfigurasi 2,4? Itulah mengapa saya merasa itu adalah kemunduran. Tapi tidak, masalah sekarang karena kita semua harus di 3.x pula.

Saya tidak ada di sini ketika perubahan dilakukan, jadi saya tidak 100% yakin mengapa itu dibatalkan. Saya tahu bahwa Anda tidak memerlukan runtime NVIDIA untuk menggunakan GPU lagi dan kami sedang mengembangkan spesifikasi Compose v3 secara terbuka di sini dengan tujuan membuat satu versi spesifikasi. Ini mungkin berarti memindahkan beberapa fungsionalitas v2 ke v3.

Dalam hal kolom runtime , saya rasa ini bukan cara menambahkannya ke spesifikasi Compose karena sangat spesifik untuk dijalankan pada satu node. Idealnya kami menginginkan sesuatu yang memungkinkan Anda menentukan bahwa beban kerja Anda memiliki kebutuhan perangkat (misalnya: GPU, TPU, apa pun yang terjadi selanjutnya) dan kemudian membiarkan orkestrator menetapkan beban kerja ke node yang menyediakan kemampuan itu.

Diskusi ini harus membahas spesifikasi meskipun karena ini tidak spesifik untuk Python Docker Compose.

@ chris-crone: Saya sebagian besar setuju dengan pernyataan Anda. Menambahkan peretasan jangka pendek mungkin adalah cara yang salah untuk melakukan ini karena kami memiliki perkembangbiakan perangkat edge yang masing-masing memiliki waktu prosesnya sendiri. Misalnya, seperti yang Anda tunjukkan, TPU (Google), VPU (Intel) dan ARM GPU pada Pi. Jadi kami memang membutuhkan cerita yang lebih lengkap.

Saya akan mengajukan masalah terhadap spesifikasi hari ini dan memperbarui utas ini setelah saya melakukannya. Namun, menurut saya orkestra harus independen - seperti jika saya ingin menggunakan Kube, saya harus bisa melakukannya. Saya berasumsi bahwa akan ada dalam ruang lingkup.

Namun saya setuju, tidak setuju dengan pernyataan using GPUs, karena itu tidak bekerja dengan compose - itulah maksud dari semua ini. Tapi saya pikir kita semua mengerti masalah apa yang ingin kita selesaikan.

@ chris-crone: Silakan lihat masalah spesifikasi penulisan dokumen galangan yang diajukan. Saya akan mengikuti pembaruan terhadap masalah itu mulai sekarang.

Bisakah kita menambahkan opsi (seperti extra_docker_run_args ) untuk meneruskan argumen langsung ke docker run mendasarinya? Ini tidak hanya akan menyelesaikan masalah saat ini, tetapi juga menjadi bukti masa depan: bagaimana jika buruh pelabuhan menambahkan dukungan untuk "XPU", ​​"YPU", atau fitur baru lainnya yang mungkin datang di masa mendatang?

Jika kita membutuhkan diskusi bolak-balik yang panjang setiap kali buruh pelabuhan menambahkan fitur baru, itu akan sangat tidak efisien dan menyebabkan penundaan yang tak terhindarkan (dan kebingungan yang tidak perlu) antara pembaruan docker-compose dan docker . Pendelegasian argumen dapat memberikan bantuan sementara untuk masalah berulang ini untuk semua fitur di masa mendatang.

@miriaford Saya tidak yakin bahwa meneruskan blob yang tidak ditafsirkan mendukung gagasan penulisan menjadi deklaratif. Tag runtime lama setidaknya menunjukkan bahwa itu ada hubungannya dengan runtime. Mengingat arah tren buruh pelabuhan (aplikasi buruh pelabuhan), menurut saya melakukan ini akan membuat penerapan deklaratif lebih sulit karena orkestra harus mengurai blob arbitrer.

Tapi saya setuju bahwa compose dan docker harus disinkronkan dan fitur kerja zapping yang bergantung pada orang (meskipun itu rilis utama) tidak cukup halal.

@ vk1z Saya setuju - seharusnya ada mekanisme sinkronisasi yang jauh lebih baik antara compose dan docker . Namun, saya tidak berharap mekanisme seperti itu dirancang dalam waktu dekat. Sementara itu kami juga membutuhkan cara sementara untuk melakukan sinkronisasi kami sendiri tanpa meretas jauh ke dalam kode sumber.

Jika proposal pendelegasian argumen bukanlah sebuah pilihan, apa yang kami sarankan untuk kami lakukan? Saya setuju ini bukan solusi yang bagus, tetapi setidaknya _much_ lebih baik daripada solusi ini, bukan? https://github.com/docker/compose/issues/6691#issuecomment -616984053

@miriaford docker-compose tidak memanggil eksekutif buruh pelabuhan dengan argumen, ia sebenarnya menggunakan docker_py yang menggunakan API http ke daemon buruh pelabuhan. Jadi tidak ada perintah "yang mendasari docker run ". CLI buruh pelabuhan bukanlah sebuah API, koneksi soket adalah titik kontak API. Inilah mengapa tidak selalu semudah itu.

Untuk menyederhanakan banyak hal, dalam proses menjalankan buruh pelabuhan, ada dua panggilan utama, satu yang membuat penampung, dan satu lagi yang memulainya, masing-masing menelan potongan informasi yang berbeda, dan mengetahui kapan dibutuhkan seseorang yang memiliki pengetahuan API, yang mana Saya tidak tahu bahwa saya cenderung tahu docker CLI. Saya tidak berpikir bisa menambahkan argumen tambahan ke panggilan docker_py akan berguna seperti yang Anda pikirkan, kecuali dalam kasus penggunaan tertentu.

Untuk membuat segalanya lebih sulit, terkadang pustaka docker_py berada di belakang API, dan tidak memiliki semua yang Anda butuhkan saat itu juga, dan Anda harus menunggu untuk diperbarui. Semua yang dikatakan, extra_docker_run_args bukanlah solusi sederhana.

@andyneff Terima kasih atas penjelasannya. Memang, saya tidak terlalu paham dengan cara kerja Docker. Jika saya mengerti dengan benar, ada 4 API yang perlu disinkronkan secara manual untuk pembaruan fitur baru:

  1. API soket Docker
  2. docker_py yang menyediakan frontend python ke socket API
  3. Docker CLI (titik masuk yang kami kenal ke toolchain docker)
  4. Antarmuka tulis-dock yang memanggil API soket buruh pelabuhan

Ini menimbulkan pertanyaan: mengapa tidak ada mekanisme sinkronisasi otomatis (atau setidaknya semi-otomatis)? Menyebarkan pembaruan fitur baru secara manual di 4 API tampaknya rawan kesalahan, rawan penundaan, dan membingungkan ...

NB Saya tidak mengatakan bahwa memiliki sinkronisasi otomatis merupakan tugas _sederhana_, tapi menurut saya harus ada satu hal yang membuat hidup lebih mudah di masa depan.

Saya agak suka bertele-tele sekarang ... Tapi seperti yang saya gambarkan sebagai ...

  • Soket buruh pelabuhan adalah API resmi untuk buruh pelabuhan. Ini sering merupakan soket file, tetapi bisa juga TCP (atau yang lain, saya bayangkan menggunakan socat )
  • docker CLI menggunakan API itu untuk memberi kita alat yang luar biasa

    • Docker menulis API dan CLI, sehingga selalu disinkronkan pada waktu rilis. (Saya pikir itu aman untuk mengatakan, CLI adalah warga kelas pertama dari ekosistem buruh pelabuhan)

  • Perpustakaan docker_py, mengambil API itu dan meletakkannya di perpustakaan luar biasa yang dapat digunakan perpustakaan python lainnya. Tanpa ini Anda akan membuat semua panggilan HTTP ini sendiri, dan menarik rambut Anda.

    • Namun docker_py dimulai sebagai pustaka pihak ketiga, dan karenanya secara tradisional mengikuti API buruh pelabuhan, dan memiliki hal-hal yang ditambahkan nanti atau sesuai kebutuhan (sumber daya terbatas).

  • compose menggunakan versi docker_py dan kemudian menambahkan semua fitur luar biasa ini, lagi sesuai kebutuhan (berdasarkan masalah seperti ini)

    • Namun, tulis tidak dapat berbuat banyak sampai docker_py (yang tidak saya katakan adalah menahan masalah ini, saya tidak tahu, saya hanya berbicara secara umum)

Jadi ya, begitulah:

  • "tulis yaml + tulis argumen" -> "docker_py" -> "docker_api"
  • Dan CLI bukanlah bagian dari ini, (dan percayalah, itulah cara yang benar untuk melakukan sesuatu)

Saya tidak dapat berbicara untuk docker_py atau menulis, tetapi saya membayangkan mereka memiliki jam kerja terbatas yang berkontribusi padanya, jadi lebih sulit untuk mengikuti SEMUA fitur buruh pelabuhan gila gila yang terus ditambahkan oleh buruh pelabuhan. Tetapi karena buruh pelabuhan adalah perpustakaan go, dan pemahaman saya adalah bahwa dukungan python bukanlah (saat ini) warga kelas satu. Meskipun bagus bahwa kedua proyek berada di bawah payung buruh pelabuhan, setidaknya dari sudut pandang organisasi github.


Jadi itu semua dikatakan ... Saya juga menunggu dukungan yang setara dengan --gpus , dan harus menggunakan metode runtime: nvidia yang lama, yang setidaknya akan memberi saya "sebuah" jalur untuk bergerak teruskan di docker-compose 2.x.

@andyneff FYI ada dukungan Docker CLI di docker-compose terbaru. Ini memungkinkan penggunaan buildkit misalnya. https://www.docker.com/blog/faster-builds-in-compose-thanks-to-buildkit-support/

@andyneff ini adalah ikhtisar yang sangat membantu! Terima kasih lagi

@lig mengagumkan! Terima kasih atas koreksinya! Saya benar-benar berpikir "Bagaimana buildkit cocok dengan semua ini" saat saya menulisnya

Apa yang membuat saya sedikit terkejut adalah bahwa docker-compose adalah bagian yang cukup intrinsik dari framework aplikasi docker baru dan saya membayangkan bahwa mereka ingin menyinkronkan docker-compose dan docker untuk setidaknya alasan itu. Saya ingin tahu apa sebenarnya pemblokir itu: Tidak cukup bandwidth python? Sepertinya agak sulit dipercaya.

Jadi, bagaimana Docker Swarm cocok dengan struktur yang baru saja dijelaskan docker ?

Mohon maaf jika itu di luar topik untuk masalah khusus ini. Saya agak kehilangan jejak masalah yang mana tetapi saya mulai mengikuti ini karena saya ingin dapat memberi tahu layanan yang berjalan pada segerombolan bahwa ia perlu menggunakan runtime tertentu. Kami hanya dapat melakukannya dengan v2 dari spesifikasi file compose yang berarti kami tidak dapat melakukannya dengan Swarm yang membutuhkan v3. Dengan kata lain, saya tidak terlalu tertarik dengan apa yang dilakukan CLI docker-compose tetapi hanya pada spesifikasi yang ditentukan untuk file docker-compose.yml yang digunakan oleh buruh pelabuhan.

Oh swarm, yang lolos ... (dariku). Sayangnya itu adalah # 6239 yang ditutup oleh BOT. :( Seseorang mencoba di # 6240 tetapi diberi tahu bahwa ...

@miriaford , sepertinya ada PR untuk menyinkronkannya! # 6642 ?! (Apakah ini hanya untuk v3 ???)


Jadi karena sifat swarm, ada hal-hal tertentu yang Anda lakukan dan tidak lakukan pada node swarm. Jadi API Docker tidak selalu memungkinkan Anda untuk melakukan opsi yang sama saat menjalankan swarm, seperti proses normal. Saya tidak tahu apakah runtime adalah salah satu dari hal-hal ini begitu saja, tetapi seringkali itulah mengapa Anda tidak dapat melakukan sesuatu di v3 (versi yang kompatibel dengan swarm) dan dapat di v2 (versi yang tidak kompatibel dengan swarm).

Tidak ada yang membaca ini yang tahu apa yang kalian bicarakan.
Kita semua mencoba menerapkan jellyfin dengan akselerasi perangkat keras.
Sampai kalian memperbaikinya kembali ke cara yang seharusnya, ketika dikatakan layanan, 3.x tidak bagus.
Jangan gunakan itu.

Anda harus meletakkan 2.4 untuk servis.
Kemudian Anda dapat menggunakan akselerasi perangkat keras untuk jellyfin, ez

Jadi ayo guys, bagaimana ETA nya 1 tahun 2 tahun ini?

@KlaasH @ulyssessouza @Goryudyuma @ chris-crone Hai, Saya sedang menangani masalah ini, saya menemukan bahwa dukungan tidak ada di "docker-py", telah bekerja di bagian itu. Sekarang untuk membuatnya berfungsi, saya harus meneruskan konfigurasi melalui file docker-compose.yml. Bisakah Anda membantu saya dengan skema? yaitu Untuk menambahkannya, saya harus menambahkannya ke skema baru atau adakah tempat di mana konfigurasi dapat dilewati

@fakabbir Saya akan berasumsi bahwa tidak masalah menggunakan COMPOSE_DOCKER_CLI_BUILD untuk ini. Menambahkan kemampuan untuk menyediakan dan daftar arbitrer dari argumen docker run bahkan dapat membantu menghindari masalah serupa di masa mendatang.

@lig bagaimana Anda menangani ketika hanya satu layanan yang membutuhkan akses ke GPU?

@lig AFAICS compose menggunakan docker-py sebagai ganti docker run cli. Jadi menambahkan argumen sewenang-wenang docker run tidak akan berfungsi kecuali docker-py mendukungnya juga.

ref: https://github.com/docker/compose/issues/6691#issuecomment -585199425

Hal yang satu ini sangat menurunkan kegunaan buruh pelabuhan bagi banyak orang. Bahwa itu belum terlihat banyak perhatian dan keinginan untuk memperbaikinya, terutama ketika bekerja di buruh pelabuhan yang lebih tua, cukup mencengangkan.
Tidakkah salah satu cara untuk pergi adalah dengan mengizinkan argumen docker --run sewenang-wenang diberikan dalam file docker-compose? Kemudian --gpus semua misalnya dapat diteruskan ke buruh pelabuhan.

Saya mengerti mungkin ada alasan filosofis atau teknis mengapa seseorang mungkin ingin melakukannya dengan cara tertentu. Tapi tidak mendapatkan tangan dan melakukannya dengan cara APAPUN mengejutkan pikiran.

@lig bagaimana Anda menangani ketika hanya satu layanan yang membutuhkan akses ke GPU?

Nah variabel lingkungan NVIDIA_VISIBLE_DEVICES akan memungkinkan Anda untuk mengontrol tidak?

Hal yang satu ini sangat menurunkan kegunaan buruh pelabuhan bagi banyak orang. Bahwa itu belum terlihat banyak perhatian dan keinginan untuk memperbaikinya, terutama ketika bekerja di buruh pelabuhan yang lebih tua, cukup mencengangkan.
Tidakkah salah satu cara untuk pergi adalah dengan mengizinkan argumen docker --run sewenang-wenang diberikan dalam file docker-compose? Kemudian --gpus semua misalnya dapat diteruskan ke buruh pelabuhan.

Saya tidak berpikir untuk mengizinkan lewat docker --run args adalah cara yang harus dilakukan. compose tidak benar-benar memanggil docker dengan sendirinya melainkan menggunakan docker-py .

Saya mengerti mungkin ada alasan filosofis atau teknis mengapa seseorang mungkin ingin melakukannya dengan cara tertentu. Tapi tidak mendapatkan tangan dan melakukannya dengan cara APAPUN mengejutkan pikiran.

Seorang PR terbuka tentang itu: https://github.com/docker/compose/pull/7124. Silakan "dapatkan tangan Anda".

Saya percaya bahwa sesuai perubahan dalam spesifikasi penulisan buruh pelabuhan , kita harus segera kembali ke kompatibilitas sebelumnya sesuai pembuatan 2.4 dan runtime nvidia akan berfungsi. Ini jelas tidak akan berfungsi untuk TPU atau akselerator lain - yang sangat disayangkan tetapi bagi mereka yang ingin menjalankan nvidia gpus (mahal), itu akan berhasil.

Jadi tunggu saja PR hijau di docker-py untuk digabungkan https://github.com/docker/docker-py/pull/2471

YA! PR di docker-py telah disetujui! https://github.com/docker/docker-py/pull/2471
Apa langkah selanjutnya di sini?

Ada apa disini? Akan sangat keren untuk dapat mendukung runtime nvidia di docker-compose

Sekarang docker / docker-py # 2471 telah digabungkan, kita dapat menginstal docker-py dari master. Tapi karena docker-compose telah berubah sejak @yoanisgil 's cool [PR] (https://github.com/docker/compose/pull/7124) (Kudos!), Tidak mungkin untuk digabungkan. Jadi pada titik ini, buruh pelabuhan-menulis dapat diinstal dari PR itu untuk menghemat hari.

Bagi mereka yang berakhir di sini tanpa melihat komentar sebelumnya:

pip install git+https://github.com/docker/docker-py.git
pip install git+https://github.com/yoanisgil/compose.git@device-requests

Kemudian gunakan template berikut di file tulis Anda. (sumber: komentar ):

Dan kemudian jalankan COMPOSE_API_VERSION=auto docker-compose run gpu dengan file berikut:

version: '3.7'

services:
    gpu:
        image: 'nvidia/cuda:9.0-base'
        command: 'nvidia-smi'
        device_requests:
            - capabilities:
               - "gpu"

Saya mengonfirmasi bahwa ini berfungsi di komputer lokal saya. Tidak tahu ini berfungsi dengan Swarm.

Tidak boleh memiliki commit tertentu dari buruh pelabuhan dalam produksi. Apakah # 7124 perlu di-rebased atau adakah PR lain yang akan menyertakan docker-py ?

Halo @bkakilli ,

Terima kasih untuk bantuannya! Saya baru saja mencoba saran Anda, tetapi saya mendapatkan kesalahan saat menjalankan penulisan buruh pelabuhan saya

ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.analysis: 'device_requests'

_analysis menjadi nama penampung saya_

Saya mengubah docker-compose.yml dari:

version: '2.3'

services:
    analysis:
        container_name: analysis
        image: analysis:${TAG}
        runtime: nvidia
        restart: always
        ports:
            - "8000:80"

untuk:

version: '3.7'

services:
    analysis:
        container_name: analysis
        image: analysis:${TAG}
        device_requests:
          - capabilities:
            - "gpu"
        restart: always
        ports:
            - "8000:80"

Apakah ada hal lain selain pip install git+ untuk mengaturnya dengan benar? Atau mungkin saya mengedit file konfigurasi dengan buruk?

@frgfm pastikan Anda menginstal compose dan docker-py dari tautan yang benar. Anda mungkin telah menggunakan repo docker-compose sendiri daripada fork yoanisgil (dan branch). Lihat apakah Anda menggunakan tautan berikut:

pip install git+https://github.com/yoanisgil/compose.git@device-requests

Anda dapat mencoba meletakkan --upgrade param ke pip install. Kalau tidak, saya akan mencurigai pengaturan lingkungan virtual. Mungkin Anda memiliki instalasi docker-compose lain, yang digunakan secara default? Misalnya Anda mungkin telah menginstalnya untuk sistem dengan petunjuk "Linux" di sini: https://docs.docker.com/compose/install/. Saya sarankan Anda untuk melihat "Opsi Penginstalan Alternatif" dan menginstal melalui pip di lingkungan virtual (tetapi gunakan perintah penginstalan pip di atas. Jangan instal docker-compose default dari PyPI).

Hai!
Terima kasih atas semua infonya. Saya mencoba menjalankan pendekatan Anda @bkakilli dan docker-compose build berhasil tetapi ketika menjalankan docker-compose up saya mendapatkan kesalahan:
docker.errors.InvalidVersion: device_requests param is not supported in API versions < 1.40

Docker_compose.yml saya terlihat seperti ini:

version: '3.7'

networks:
  isolation-network:
    driver: bridge

services:
 li_t5_service:
    build: .
    ports:
      - "${GRAPH_QL_API_PORT}:5001"
    device_requests:
      - capabilities:
        - "gpu"
    environment:
      - SSH_PRIVATE_KEY=${SSH_PRIVATE_KEY}
      - PYTHONUNBUFFERED=${PYTHONUNBUFFERED}
    networks: 
      - isolation-network

Terima kasih sebelumnya!

@ugmSorcero Setel variabel lingkungan COMPOSE_API_VERSION=1.40 lalu jalankan kembali perintah Anda

@ugmSorcero apakah Anda berhasil memperbaiki kesalahan itu? @EpicWink @bkakilli Saya menjalankan versi yang dinyatakan dari pemasangan pip tetapi saya masih mendapatkan kesalahan untuk device_requests param is not supported in API versions < 1.40 bahkan jika saya mengekspor variabel seperti itu ke 1,40

Untuk file tulis yang diberikan

version: "3.7"
services:
  spam:
    image: nvidia/cuda:10.1-cudnn7-runtime
    command: nvidia-smi
    device_requests:
      - capabilities:
          - gpu

Menggunakan versi docker-compose diinstal seperti di atas, di Bash di Linux, perintah berikut berhasil:

COMPOSE_API_VERSION=1.40 docker-compose up

Perintah berikut gagal:

docker-compose up

Ini memiliki keluaran kesalahan:

ERROR: for tmp_spam_1  device_requests param is not supported in API versions < 1.40
...
docker.errors.InvalidVersion: device_requests param is not supported in API versions < 1.40

@EpicWink terima kasih banyak. Saya tidak menyadari bahwa docker-compose up harus dijalankan seperti itu. Saya menganggapnya sebagai langkah 2 di mana pertama saya mengekspor COMPOSE_API_VERSION secara terpisah. Menjalankannya bersama sepertinya berhasil :)

Saya punya masalah lain. Jika saya menjalankan COMPOSE_API_VERSION=1.40 docker-compose run nvidiatest maka nvidia-smi tidak ditemukan di path, sedangkan jika saya menjalankan langsung dari gambar tidak ada masalah.

Begini cara saya mereproduksinya.

file lokal docker-compose berisi:

nvidiatest:
    image: nvidia/cuda:10.0-base
    device_requests:
      - capabilities:
        - gpu
    command: nvidia-smi

Jika saya menjalankan pengaturan saya saat ini (baik versi api otomatis dan 1.40) saya mendapatkan kesalahan berikut:

COMPOSE_API_VERSION=auto docker-compose -f docker-compose.yml -f docker-compose.local.yml run nvidiatest
Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"nvidia-smi\": executable file not found in $PATH": unknown

Mungkinkah ini ada hubungannya dengan menggunakan file override? Jika saya hanya menjalankan gambar dasar cuda dengan Docker, tidak ada masalah dengan mendapatkan output dari nvidia-smi :

docker run --gpus all nvidia/cuda:10.0-base nvidia-smi
Mon Aug 24 11:40:04 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.100      Driver Version: 440.100      CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 2070    Off  | 00000000:29:00.0  On |                  N/A |
|  0%   46C    P8    19W / 175W |    427MiB /  7974MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Saya menginstal docker-compose mengikuti instruksi di atas dari git setelah menghapus versi yang diinstal dari dokumen resmi. Berikut info versi yang diinstal:

pip3 show --verbose docker-compose
Name: docker-compose
Version: 1.26.0.dev0
Summary: Multi-container orchestration for Docker
Home-page: https://www.docker.com/
Author: Docker, Inc.
Author-email: None
License: Apache License 2.0
Location: /home/jurugu/.local/lib/python3.8/site-packages
Requires: docopt, docker, requests, PyYAML, texttable, websocket-client, six, dockerpty, jsonschema, cached-property
Required-by:
Metadata-Version: 2.1
Installer: pip
Classifiers:
  Development Status :: 5 - Production/Stable
  Environment :: Console
  Intended Audience :: Developers
  License :: OSI Approved :: Apache Software License
  Programming Language :: Python :: 2
  Programming Language :: Python :: 2.7
  Programming Language :: Python :: 3
  Programming Language :: Python :: 3.4
  Programming Language :: Python :: 3.6
  Programming Language :: Python :: 3.7
Entry-points:
  [console_scripts]
  docker-compose = compose.cli.main:main

Apakah saya melewatkan sesuatu? Terima kasih untuk bantuannya!

@jjrugui ini menjadi di luar topik, dan saya tidak dapat meniru masalah Anda. Maaf karena tidak dapat membantu

@EpicWink tidak masalah, dan maaf karena menyimpang dari topik :). Jika saya menemukan masalah khusus saya, saya akan mempostingnya di sini jika relevan.

Apakah seseorang mengerjakan PR lain atau apakah kita men-debug cabang device-requests untuk bersiap-siap untuk PR?

Sementara PR macet, saya memindahkan perubahan dari # 7124 ke versi terbaru dari master cabang untuk mencocokkan dependensi, dll. - https://github.com/beehiveai/compose Anda dapat menginstal dengan pip install git+https://github.com/beehiveai/compose.git dan ubah versinya di docker-compose.yml menjadi 3.8 :

version: "3.8"
services:
  gpu-test:
    image: nvidia/cuda:10.2-runtime
    command: nvidia-smi
    device_requests:
      - capabilities:
          - gpu

Dalam pengaturan ini, semuanya bekerja seperti yang diharapkan.

Seperti yang telah didiskusikan kemarin pada rapat tata kelola spesifikasi-tulis , kami akan mulai mengerjakan proposal untuk mengadopsi sesuatu yang sebanding dengan # 7124, yang bisa mendekati generic_resouces sudah tersedia di bagian deploy .

@ndeloof Itu bagus! Jika memungkinkan, silakan posting link ke proposal di sini. Saya rasa banyak orang akan senang untuk berkontribusi karena dukungan GPU sangat penting untuk penerapan pembelajaran yang mendalam.

@ndeloof Secara historis, berapa lama waktu yang dibutuhkan komite pengarah untuk membuat keputusan, 6 bulan, setahun?

+1

+1

@visheratin Adakah kemungkinan Anda dapat meningkatkan perbaikan agar berfungsi saat menggunakan beberapa file yml pembuatan? Saya memiliki basis docker-compose.yml yang menggunakan container non-nvidia, yang ingin saya ganti dengan container nvidia saat ada GPU, namun tampaknya dengan perbaikan Anda, jika saya menentukan beberapa file compose yml dengan "- f ", kolom" device_requests "keluar dari konfigurasi.

@proximous Apa yang Anda maksud dengan "keluar dari konfigurasi"? Apakah semua file compose memiliki versi 3.8? Bisakah Anda membagikan contoh agar lebih mudah untuk mereproduksi?

Mengalami masalah dengan kode di compose / service.py saat mencoba menggunakan opsi --scale dengan docker-compose up. Apakah ini tidak didukung?

Traceback (panggilan terakhir terakhir):
File "/ usr / local / bin / docker-compose", baris 11, dalam
load_entry_point ('docker-compose == 1.27.0.dev0', 'console_scripts', 'docker-compose') ()
File "/usr/local/lib/python3.6/site-packages/compose/cli/main.py", baris 67, di main
perintah()
File "/usr/local/lib/python3.6/site-packages/compose/cli/main.py", baris 123, di perform_command
handler (perintah, opsi_perintah)
File "/usr/local/lib/python3.6/site-packages/compose/cli/main.py", baris 1067, di atas
to_attach = up (Salah)
File "/usr/local/lib/python3.6/site-packages/compose/cli/main.py", baris 1063, di atas
cli = native_builder,
File "/usr/local/lib/python3.6/site-packages/compose/project.py", baris 648, di atas
get_deps,
File "/usr/local/lib/python3.6/site-packages/compose/parallel.py", baris 108, dalam parallel_execute
naikkan error_to_reraise
File "/usr/local/lib/python3.6/site-packages/compose/parallel.py", baris 206, dalam produser
hasil = func (obj)
File "/usr/local/lib/python3.6/site-packages/compose/project.py", baris 634, dalam lakukan
override_options = override_options,
File "/usr/local/lib/python3.6/site-packages/compose/service.py", baris 579, dalam execute_convergence_plan
renew_anonymous_volumes,
File "/usr/local/lib/python3.6/site-packages/compose/service.py", baris 509, di _execute_convergence_recreate
skala - len (wadah), terlepas, mulai
File "/usr/local/lib/python3.6/site-packages/compose/service.py", baris 479, di _execute_convergence_create
"Membuat"
File "/usr/local/lib/python3.6/site-packages/compose/parallel.py", baris 108, dalam parallel_execute
naikkan error_to_reraise
File "/usr/local/lib/python3.6/site-packages/compose/parallel.py", baris 206, dalam produser
hasil = func (obj)
File "/usr/local/lib/python3.6/site-packages/compose/service.py", baris 477, di
lambda service_name: create_and_start (self, service_name.number),
File "/usr/local/lib/python3.6/site-packages/compose/service.py", baris 456, di create_and_start
container = service.create_container (number = n, quiet = True)
File "/usr/local/lib/python3.6/site-packages/compose/service.py", baris 333, di create_container
before_container = before_container,
File "/usr/local/lib/python3.6/site-packages/compose/service.py", baris 936, di _get_container_create_options
one_off = one_off)
File "/usr/local/lib/python3.6/site-packages/compose/service.py", baris 1014, di _get_container_host_config
elemen.split (',') untuk elemen di device_request ['kapabilitas']]
File "/usr/local/lib/python3.6/site-packages/compose/service.py", baris 1014, di
elemen.split (',') untuk elemen di device_request ['kapabilitas']]
AttributeError: objek 'list' tidak memiliki atribut 'split'

Setelah debugging lebih lanjut, saya menemukan bahwa ketika menggunakan --scale, bahwa untuk beberapa alasan satu contoh memiliki device_requests ['kemampuan'] sebagai ['gpu']. Tetapi untuk semua penampung lain yang akan dimulai, device_request ['ability'] malah terlihat seperti [['gpu']].

Saya melakukan perbaikan sementara secara lokal untuk mengatasi masalah ini hanya agar penampung saya aktif dan berjalan mulai baris 1010 di compose / service.py:

``
untuk device_request di device_requests:
jika 'kemampuan' tidak ada di device_request:
terus
jika jenis (device_request ['kemampuan'] [0]) == daftar:
device_request ['kemampuan'] = [
elemen.split ('.') untuk elemen dalam device_request ['kemampuan'] [0]]
lain:
device_request ['kemampuan'] = [
elemen.split ('.') untuk elemen di device_request ['kapabilitas']]

`` ''

@proximous Apa yang Anda maksud dengan "keluar dari konfigurasi"? Apakah semua file compose memiliki versi 3.8? Bisakah Anda membagikan contoh agar lebih mudah untuk mereproduksi?

@visheratin lihat contoh ini, apakah saya salah mengharapkan hasil yang berbeda?

docker-compose.nogpu.yml:

version: '3.8'

services:
  df:
    build: miniconda-image.Dockerfile

docker-compose.gpu.yml:

version: '3.8'

services:
  df:
    build: nvidia-image.Dockerfile
    device_requests:
      - capabilities:
          - gpu

gunakan hanya nogpu.yml:

$ docker-compose -f docker-compose.nogpu.yml config
services:
  df:
    build:
      context: /home/jerry/gpu-test/miniconda-image.Dockerfile
version: '3'

gunakan hanya gpu.yml:

$ docker-compose -f docker-compose.gpu.yml config
services:
  df:
    build:
      context: /home/jerry/gpu-test/nvidia-image.Dockerfile
    device_requests:
    - capabilities:
      - gpu
version: '3'

chain config ymls yang dimulai dengan non-gpu yml (catatan ... kehilangan waktu proses):

$ docker-compose -f docker-compose.nogpu.yml -f docker-compose.gpu.yml config
services:
  df:
    build:
      context: /home/jerry/gpu-test/nvidia-image.Dockerfile
version: '3'

keluaran yang diharapkan:

$ docker-compose -f docker-compose.nogpu.yml -f docker-compose.gpu.yml config
services:
  df:
    build:
      context: /home/jerry/gpu-test/nvidia-image.Dockerfile
    device_requests:
      - capabilities:
          - gpu
version: '3'

(Jelas saya mencoba sesuatu yang lebih rumit dan ini hanya kasus yang disederhanakan untuk menyoroti perilaku yang tidak terduga.)

@jlaule @proximous Agar utas ini tetap pada topik, harap buat masalah di repo bercabang, saya akan memeriksanya ketika saya punya waktu.

Bagi mereka yang membutuhkan sesuatu sambil menunggu, saya hanya mengatur K3S (versi edge dari Kubernetes) dengan dukungan GPU dalam 30 menit menggunakan buruh pelabuhan sebagai waktu berjalan kontainer (yaitu menggunakan opsi --docker untuk menginstal skrip). Ikuti https://github.com/NVIDIA/k8s-device-plugin agar plugin perangkat Nvidia berfungsi.
Semoga membantu!

@EpicWink tidak masalah, dan maaf karena menyimpang dari topik :). Jika saya menemukan masalah khusus saya, saya akan mempostingnya di sini jika relevan.

Apakah Anda pernah menyelesaikan ini?

Tidak ada lagi yang seperti "/ usr / bin / nvidia-container-runtime". Masalah masih kritis.

Instal nvidia-docker2 seperti yang diperintahkan di sini

Saya telah menangani ini akhir-akhir ini dan saya pikir saya akan berbagi pendekatan saya.
masalah saya adalah bahwa saya perlu untuk menyebarkan tumpukan buruh pelabuhan dan tidak mau mendengarkan. pekerja galangan menulis saya telah bekerja dengan peretasan versi api buruh pelabuhan tetapi tidak terasa benar dan penerapan tumpukan tidak akan berfungsi apa pun.

jadi tanpa mengatur permintaan perangkat waktu proses apa pun dalam pembuatan buruh pelabuhan saya, saya menambahkan ini ke daemon saya:

{ "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, "default-runtime": "nvidia", "node-generic-resources": [ "NVIDIA-GPU=0" ] }

kamu juga bisa menggunakan GPU- {bagian pertama dari panduan gpu}
tapi ini lebih mudah. tidak perlu menginstal pip + atau semacamnya kecuali NV container toolkit. itu menyebarkan dan bekerja seperti pesona.

Tks banyak @haviduck , baru saja mencoba di mesin saya sendiri (Ubuntu 20.04, buruh pelabuhan CE 19.03.8) dan itu bekerja dengan sangat baik.
Untuk orang lain: jangan lupa untuk me-restart daemon docker Anda.

@pommedeterresautee ah saya sangat senang itu berhasil untuk orang lain! seharusnya menyebutkan isi ulang.

harus mengatakan setelah 3 minggu non stop dockering, saya cukup bingung bagaimana sepertinya tidak ada yang berhasil ..

@haviduck : Terima kasih! Akhirnya solusi sederhana yang berhasil. Saya telah menghabiskan begitu banyak waktu untuk mencoba menambahkan perangkat dll sehingga saya menyerah. Kemudian ini datang, mencobanya dan setelah beberapa menit saya memiliki transcoding perangkat keras di Plex yang berfungsi.

Saya akan menambahkan 2 sen saya untuk masalah ini ... Saya membaca banyak posting dan akhirnya solusinya cukup sederhana.

itu berhasil untuk saya dengan: (mungkin sedikit lebih rendah akan berhasil juga - tidak tahu ...)
docker-compose versi 1.27.4, build 40524192

  1. pada mesin host buruh pelabuhan, instal paket nvidia-container-toolkit dan nvidia-container-runtime
  2. pada mesin host buruh pelabuhan: ketik
    nvidia-smi dan periksa versi CUDA yang muncul di sebelah kanan
    image
  3. di mesin host buruh pelabuhan: ketik: (ganti versi cuda dengan yang telah Anda instal)
    buruh pelabuhan menjalankan --rm --gpus semua nvidia / cuda: 10.1-base nvidia-smi
    Anda harus mendapatkan hasil yang sama seperti saat menjalankan nvidia-smi di mesin host
  4. di file /etc/docker/daemon.json Anda harus melihat:
    "runtimes": {"nvidia": {"path": "/ usr / bin / nvidia-container-runtime", "runtimeArgs": []}}
  5. di YML docker-compose, Anda harus menambahkan:
    runtime: nvidia

itu dia !
terapkan menggunakan YML dan Anda akan memiliki dukungan GPU di docker-compose Anda

5. in your docker-compose YML you should add:
   **runtime: nvidia**

Ya ampun, seluruh utas ini tentang versi 3 yang tidak memiliki runtime.

Rilis 1.27.0+ telah menggabungkan format file v2 / v3, jadi seseorang dapat menggunakan runtime mana saja sekarang. Selain itu, spesifikasi untuk akselerator juga diterima (https://github.com/compose-spec/compose-spec/pull/100) meskipun belum diterapkan dalam docker-compose .

Saya akan menambahkan 2 sen saya untuk masalah ini ... Saya membaca banyak posting dan akhirnya solusinya cukup sederhana.

itu berhasil untuk saya dengan: (mungkin sedikit lebih rendah akan berhasil juga - tidak tahu ...)
docker-compose versi 1.27.4, build 4052419

  1. pada mesin host buruh pelabuhan, instal paket nvidia-container-toolkit dan nvidia-container-runtime
  2. pada mesin host buruh pelabuhan: ketik
    nvidia-smi dan periksa versi CUDA yang muncul di sebelah kanan
    image
  3. di mesin host buruh pelabuhan: ketik: (ganti versi cuda dengan yang telah Anda instal)
    buruh pelabuhan menjalankan --rm --gpus semua nvidia / cuda: 10.1-base nvidia-smi
    Anda harus mendapatkan hasil yang sama seperti saat menjalankan nvidia-smi di mesin host
  4. di file /etc/docker/daemon.json Anda harus melihat:
    "runtimes": {"nvidia": {"path": "/ usr / bin / nvidia-container-runtime", "runtimeArgs": []}}
  5. di YML docker-compose, Anda harus menambahkan:
    runtime: nvidia

itu dia !
terapkan menggunakan YML dan Anda akan memiliki dukungan GPU di docker-compose Anda

FYI, versi cuda yang bisa Anda lihat di output nvidia-smi mengacu pada versi driver nvidia cuda, alias driver nvidia Anda (mereka menyebutnya cuda juga, yang membingungkan). Nomor versi dalam gambar buruh pelabuhan, misalnya nvidia/cuda:10.1-base nvidia-smi mengacu pada versi nvidia toolkit (sekali lagi, membingungkan sistem penomoran versi yang sama, binatang yang berbeda).

Driver tersebut kompatibel dengan toolkit ini, sehingga Anda dapat menjalankan nvidia/cuda:<version>-base nvidia-smi Anda inginkan, selama <version> lebih kecil atau sama dengan versi driver.

Info lebih lanjut di sini: https://stackoverflow.com/questions/53422407/different-cuda-versions-shown-by-nvcc-and-nvidia-smi

Saya tidak melihat binari Docker Compose 1.27.4 tersedia untuk sistem berbasis ARM.

pip install docker-compose
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: docker-compose in /usr/local/lib/python3.6/dist-packages (1.26.2)

Hai @collabnix!

Apa keluaran dari pip --version ?

Compose 1.27 menjatuhkan dukungan untuk Python 2 sehingga mungkin Anda tidak melihat rilis 1.27.x jika sistem Anda memiliki Python 2.

@collabnix itu karena Anda telah menulis sudah terpasang, coba pip install --upgrade docker-compose

Sekarang saya dapat meningkatkan ke 1.27.4. Peningkatan pip berhasil. Terima kasih @kshcherban & @ chris-crone
Sungguh gila melihat sebagian besar proyek yang saya kerjakan di masa lalu dan yang menggunakan Python 2.7 benar-benar perlu ditingkatkan.

Upgrade docker-compose ke 1.27.4 menyelesaikan masalah.
(dapat ditingkatkan ke 1.19.3 nanti untuk menyelesaikan masalah)

$ cat /etc/docker/daemon.json 
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
version: '3.5'

    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=all       
    image: 'detectme'
    ipc: 'host'
    tty: true
    stdin_open: true
$ sudo docker-compose up -d --build
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.engine: 'runtime'
$ docker-compose --version
docker-compose version 1.17.1, build unknown
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo rm /usr/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

$ sudo docker-compose up -d --build
bekerja dengan baik dengan buruh pelabuhan-menulis.
di komputer host, periksa gpu yang digunakan oleh nvidia-smi.

@bayu-2020
@Tokopedia
Jika saya menggunakan dokcer-nvidia-devel (bukan runtime): nvidia / cuda: 10.1-cudnn7-devel-ubuntu18.04 di docker-hub
Apakah itu berhasil? Bagaimana saya harus mengedit file docker-compose.yaml?

Apakah halaman ini membantu?
4 / 5 - 1 peringkat

Masalah terkait

Hendrik-H picture Hendrik-H  ·  3Komentar

saulshanabrook picture saulshanabrook  ·  3Komentar

HackerWilson picture HackerWilson  ·  3Komentar

davidbarratt picture davidbarratt  ·  3Komentar

29e7e280-0d1c-4bba-98fe-f7cd3ca7500a picture 29e7e280-0d1c-4bba-98fe-f7cd3ca7500a  ·  3Komentar