Mengatasi Docker dan NVIDIA Container Toolkit ldcache Runtime Error

Mengatasi masalah Docker runtime error saat menjalankan container yang menggunakan NVIDIA GPU.

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.

Referensi