Apa yang Dikeluhkan Error Ini

Ketika kamu mencoba menjalankan container Docker dengan akses GPU, kamu mungkin menemui pesan error berikut:

docker: Error response from daemon: failed to discover gpu vendor from cdi: no known gpu vendor found.

Pesan error ini muncul secara verbatim persis seperti di atas, biasanya saat kamu menjalankan perintah docker run dengan flag --gpus all atau ketika Docker mencoba mengalokasikan GPU melalui mekanisme CDI (Container Device Interface). Dalam bahasa Indonesia, error ini berarti: "Gagal menemukan vendor GPU dari CDI: tidak ditemukan vendor GPU yang dikenali." Docker sedang berusaha mengidentifikasi apakah GPU kamu berasal dari NVIDIA, AMD, atau Intel, tetapi gagal total karena tidak ada informasi vendor GPU yang bisa ditemukan di sistem.

Kenapa error ini muncul? Secara teknis, Docker versi terbaru (25.0 ke atas) mulai mengadopsi CDI sebagai mekanisme standar untuk mengekspos perangkat hardware ke container. CDI menggantikan metode lama yang bergantung pada nvidia-container-runtime. Ketika Docker diminta untuk memberikan akses GPU, ia akan mencari file konfigurasi CDI yang berisi definisi perangkat GPU. Jika file-file tersebut tidak ada, atau jika utilitas yang bertugas membuat file CDI (nvidia-ctk) belum dijalankan, maka Docker tidak bisa menemukan vendor GPU apa pun, dan error ini pun muncul. Ini adalah masalah konfigurasi, bukan masalah hardware rusak.

Akar Masalahnya

Berikut adalah root cause yang paling sering menyebabkan error ini, diurutkan dari yang paling sering terjadi:

  1. NVIDIA Container Toolkit belum terinstal. Ini adalah penyebab paling dominan. Tanpa toolkit ini, Docker tidak punya mekanisme untuk berkomunikasi dengan GPU NVIDIA. Banyak pengguna mengira cukup menginstal NVIDIA driver saja, padahal diperlukan lapisan tambahan khusus untuk integrasi Docker-GPU.

  2. File CDI belum di-generate. Setelah NVIDIA Container Toolkit terinstal, kamu perlu menjalankan nvidia-ctk cdi generate untuk membuat file definisi CDI di /etc/cdi/. Tanpa file ini, Docker tidak punya referensi vendor GPU sama sekali, meskipun toolkit sudah terinstal.

  3. Docker daemon belum dikonfigurasi untuk menggunakan CDI. Docker harus secara eksplisit diaktifkan fitur CDI-nya melalui konfigurasi daemon.json. Jika key features.cdi belum diset ke true, Docker akan mengabaikan seluruh mekanisme CDI meskipun file-nya sudah ada.

  4. NVIDIA driver tidak terinstal atau tidak terdeteksi. Jika driver NVIDIA belum terinstal di host, maka utilitas nvidia-smi tidak akan berjalan, dan consequently nvidia-ctk tidak bisa mendeteksi GPU untuk di-generate ke file CDI.

  5. Docker daemon belum di-restart setelah konfigurasi. Perubahan di daemon.json tidak langsung efektif. Docker daemon harus di-restart agar konfigurasi baru terbaca dan fitur CDI diaktifkan.

Untuk memastikan penyebab mana yang kamu alami, jalankan urutan diagnosis berikut:

  • Jalankan nvidia-smi. Jika gagal, masalahnya adalah driver tidak terinstal (penyebab #4).
  • Jalankan nvidia-ctk --version. Jika gagal, masalahnya adalah toolkit tidak terinstal (penyebab #1).
  • Periksa isi direktori /etc/cdi/. Jika kosong, masalahnya adalah file CDI belum di-generate (penyebab #2).
  • Periksa file /etc/docker/daemon.json. Jika tidak ada key features.cdi atau nilainya false, masalahnya adalah CDI belum diaktifkan di Docker (penyebab #3).
  • Jika semua di atas sudah benar tapi error masih muncul, masalahnya kemungkinan adalah Docker daemon belum di-restart (penyebab #5).

Cara Memperbaiki

Langkah 1: Verifikasi Driver NVIDIA

Pertama, pastikan driver NVIDIA sudah terinstal dan GPU terdeteksi oleh sistem host.

nvidia-smi

Output yang diharapkan menunjukkan tabel informasi GPU, seperti nama GPU, versi driver, versi CUDA, dan penggunaan memori. Jika perintah ini gagal dengan pesan "command not found" atau "NVIDIA-SMI has failed", kamu perlu menginstal driver NVIDIA terlebih dahulu. Di Ubuntu, kamu bisa menginstalnya dengan:

sudo apt-get update
sudo apt-get install nvidia-driver-535
sudo reboot

Setelah reboot, verifikasi kembali dengan nvidia-smi.

Langkah 2: Instal NVIDIA Container Toolkit

Inilah komponen kunci yang paling sering terlewat. Instal toolkit ini dengan menambahkan repository-nya terlebih dahulu:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
  sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

Setelah instalasi, verifikasi:

nvidia-ctk --version

Output yang diharapkan adalah nomor versi, misalnya NVIDIA container toolkit version 1.15.0.

Langkah 3: Generate File CDI

Sekarang generate file definisi CDI yang akan dikenali oleh Docker:

sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

Verifikasi bahwa file sudah terbentuk:

ls -la /etc/cdi/
cat /etc/cdi/nvidia.yaml

Output yang diharapkan adalah file YAML yang berisi definisi perangkat GPU dengan nama vendor nvidia.com/gpu, lengkap dengan atribut seperti indeks GPU, UUID, dan jalur device node.

Langkah 4: Konfigurasi Docker Daemon untuk CDI

Edit atau buat file /etc/docker/daemon.json untuk mengaktifkan fitur CDI:

sudo nvidia-ctk configure --runtime=docker

Perintah ini secara otomatis akan memodifikasi daemon.json dan menambahkan konfigurasi yang diperlukan. Kamu juga bisa melakukannya secara manual dengan memastikan file berisi setidaknya:

{
  "features": {
    "cdi": true
  }
}

Jika file sudah memiliki konfigurasi lain, gabungkan tanpa menghapus konfigurasi yang sudah ada.

Langkah 5: Restart Docker Daemon

sudo systemctl restart docker

Langkah 6: Verifikasi Solusi Berhasil

Jalankan container test untuk memastikan GPU bisa diakses melalui Docker:

docker run --rm --gpus all ubuntu nvidia-smi

Output yang diharapkan adalah tabel nvidia-smi yang sama seperti saat kamu menjalankannya di host. Jika ini berhasil, error sudah teratasi.

Solusi Jangka Panjang

Solusi di atas bersifat permanen jika dilakukan secara lengkap. Namun, ada beberapa konfigurasi tambahan yang memastikan error ini tidak pernah kembali muncul meskipun sistem mengalami update atau reboot.

Pertama, pastikan file CDI di-regenerate secara otomatis setiap kali driver NVIDIA di-update. Kamu bisa membuat systemd service atau cron job yang menjalankan nvidia-ctk cdi generate setiap boot:

sudo tee /etc/systemd/system/nvidia-cdi-generate.service <<'EOF'
[Unit]
Description=Generate NVIDIA CDI specification
After=nvidia-persistenced.service

[Service]
Type=oneshot
ExecStart=/usr/bin/nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable nvidia-cdi-generate.service

Dengan service ini, setiap kali sistem boot, file CDI akan di-generate ulang secara otomatis. Ini mencegah kondisi di mana file CDI hilang atau outdated setelah update driver.

Kedua, gunakan flag --gpus secara eksplisit daripada mengandalkan auto-detection. Ini adalah best practice karena meminimalkan ambiguitas. Misalnya, untuk menggunakan GPU pertama saja:

docker run --rm --gpus device=0 ubuntu nvidia-smi

Ketiga, untuk pengguna yang tidak ingin menggunakan CDI dan lebih memilih mekanisme lama (NVIDIA Runtime), kamu bisa mengkonfigurasi Docker untuk menggunakan nvidia sebagai default runtime. Edit /etc/docker/daemon.json:

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

Pendekatan ini bypass CDI sepenuhnya, tapi tidak disarankan untuk Docker versi 25.0+ karena CDI adalah arah pengembangan ke depan.

Perbedaan antar OS:

  • Ubuntu/Debian: Langkah-langkah di atas sudah lengkap. Repository NVIDIA Container Toolkit tersedia dalam format .deb.
  • RHEL/CentOS/Fedora: Ganti perintah apt dengan dnf/yum, dan gunakan repository format .rpm:
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
  sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

sudo dnf install -y nvidia-container-toolkit
  • Windows (WSL2): Pastikan NVIDIA driver untuk Windows sudah terinstal (bukan driver Linux). Di dalam WSL2, driver di-expose secara otomatis. Instal NVIDIA Container Toolkit di dalam distro WSL2 sama seperti Ubuntu, tapi pastikan Docker Desktop sudah dikonfigurasi untuk menggunakan WSL2 backend dan fitur GPU diaktifkan dari Settings Docker Desktop.

Langkah Lanjutan

Jika semua solusi di atas sudah dilakukan tapi error masih muncul, ada beberapa kemungkinan yang perlu diperiksa lebih dalam.

Periksa versi Docker kamu. CDI sebagai fitur stabil hanya tersedia di Docker versi 25.0 ke atas. Jika kamu menggunakan versi lebih lama, mekanisme CDI mungkin belum didukung atau masih bersifat experimental. Periksa versi dengan:

docker version

Jika versi di bawah 25.0, pertimbangkan untuk meng-upgrade Docker atau menggunakan nvidia-container-runtime sebagai pendekatan alternatif seperti yang dibahas di bagian fix permanen.

Periksa log Docker daemon secara detail. Log ini sering mengandung informasi yang lebih spesifik tentang kegagalan CDI:

sudo journalctl -u docker.service --no-pager -n 50

Atau jika menggunakan syslog:

sudo cat /var/log/syslog | grep docker | grep cdi

Cari pesan yang mengandung kata "cdi", "nvidia", atau "gpu". Log mungkin menunjukkan bahwa Docker tidak bisa membaca file CDI karena permission issue, atau bahwa file CDI ada tapi formatnya tidak valid.

Permission issue pada file CDI. Pastikan file CDI bisa dibaca oleh Docker daemon:

sudo chmod 644 /etc/cdi/nvidia.yaml

**Konflik dengan instalasi lama n