Saya adalah salah satu pengguna Immich dan saya memanfaatkan NVIDIA Container Toolkit supaya Immich container dapat melakukan encoding dan decoding video menggunakan GPU; selain itu, dengan NVIDIA Container Toolkit, Immich juga bisa menggunakan CUDA core untuk fitur machine learning-nya. Namun, beberapa hari lalu setelah melakukan full system upgrade mesin Arch Linux, saya mengalami beberapa kendala saat mencoba menjalankan Immich container tersebut.
Di artikel ini, saya ingin berbagi pengalaman saya memperbaiki error-error yang terjadi terkait NVIDIA container toolkit, docker runtime, dan format “baru” docker compose yang digunakan untuk NVIDIA Docker runtime.
Prosesnya juga saya dokumentasikan dalam bentuk video di bawah ini:
NVIDIA Container Runtime
Error pertama yang saya hadapi saat mencoba menjalankan Immich container menggunakan NVIDIA adalah sebagai berikut:
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running prestart hook #0: exit status 1, stdout: , stderr: Using requested mode 'cdi' invoking the NVIDIA Container Runtime Hook directly (e.g. specifying the docker --gpus flag) is not supported. Please use the NVIDIA Container Runtime (e.g. specify the --runtime=nvidia flag) instead.
Error tersebut sepertinya terkait dengan adanya update NVIDIA Container Runtime. Setelah melakukan pencarian terkait pesan error yang saya alami diatas, saya menemukan sebuah post di reddit yang membahas mengenai signal 9 error; dan di kolom komentar, salah satu user dapat memperbaiki signal 9 error tersebut dengan mengubah konfigurasi docker compose-nya dari :
1 runtime: nvidia
2 deploy:
3 resources:
4 reservations:
5 devices:
6 - driver: nvidia
7 count: 1
8 capabilities:
9 - gpu
10 - compute
11 - video
menjadi:
1 runtime: nvidia
2 deploy:
3 resources:
4 reservations:
5 devices:
6 - driver: nvidia
7 device_ids:
8 - nvidia.com/gpu=all
9 capabilities:
10 - gpu
11 - compute
12 - video
Tapi, setelah mencoba mengimplementasikannya ke konfigurasi docker compose
untuk hwaccel.transcoding.yml
dan hwaccel.ml.yml
, saya mendapatkan error
lainnya.
Invalid Runtime Name: NVIDIA
Jadi, saat menjalankan perintah docker compose up
dengan konfigurasi yang
sudah saya sesuaikan dengan konfigurasi diatas, saya mendapati error berikut:
Error response from daemon: unknown or invalid runtime name: nvidia
Kali ini saya mendapatkan solusi untuk error tersebut dari dokumentasi
mengenai Docker di Arch Linux Wiki.
Disana dikatakan bahwa kita perlu membuat (atau menambahkan) konfigurasi
berikut di /etc/docker/daemon.json
:
1{
2 "runtimes": {
3 "nvidia": {
4 "path": "/usr/bin/nvidia-container-runtime",
5 "runtimeArgs": []
6 }
7 }
8}
Setelah membuat konfigurasi tersebut, saya merestart docker service. Dan
untuk memastikan bahwa NVIDIA runtime benar-benar sudah tersedia, saya cek
menggunakan perintah docker info | grep runtime
:
1Runtimes: io.containerd.runc.v2 nvidia runc
2Default Runtime: runc
Dari output diatas, bisa dipastikan bahwa runtime nvidia
sudah tersedia, dan
seharusnya error sebelumnya sudah tidak terjadi lagi.
Docker CDI Runtime
Oke, jadi Nvidia runtime sudah tersedia, kini saatnya mencoba menjalankan
Immich container lagi dengan menjalankan docker compose down && docker compose up
. Tapi, sayangnya, saya mengalami error lain sebagai berikut:
Error response from daemon: failed to create task for container: failed to create task: OCI runtime create failed: could not apply required modification to 0CI specification: error modifying OCI spec: failed to inject CDI devices: failed to inject devices: failed to stat CDI host device "/dev/dri/card0": no such file or directory
Kali ini, saya menemukan solusi untuk error diatas langsung dari repositori Nvidia Container Toolkit di GitHub. Di [issue #1246] nvidia-container-toolkit-issue-1246, biuniun memberikan penjelasan mengapa error tersebut terjadi, sekaligus memberikan solusi untuk kita.
Pada intinya, kita perlu menjalankan perintah berikut:
1sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
2sudo nvidia-ctk config --in-place --set nvidia-container-runtime.mode=cdi && sudo systemctl restart docker
Setelah menjalankan perintah-perintah diatas, Immich container sudah dapat berjalan seperti sebelumnya.