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:
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.
File CDI belum di-generate. Setelah NVIDIA Container Toolkit terinstal, kamu perlu menjalankan
nvidia-ctk cdi generateuntuk membuat file definisi CDI di/etc/cdi/. Tanpa file ini, Docker tidak punya referensi vendor GPU sama sekali, meskipun toolkit sudah terinstal.Docker daemon belum dikonfigurasi untuk menggunakan CDI. Docker harus secara eksplisit diaktifkan fitur CDI-nya melalui konfigurasi
daemon.json. Jika keyfeatures.cdibelum diset ketrue, Docker akan mengabaikan seluruh mekanisme CDI meskipun file-nya sudah ada.NVIDIA driver tidak terinstal atau tidak terdeteksi. Jika driver NVIDIA belum terinstal di host, maka utilitas
nvidia-smitidak akan berjalan, dan consequentlynvidia-ctktidak bisa mendeteksi GPU untuk di-generate ke file CDI.Docker daemon belum di-restart setelah konfigurasi. Perubahan di
daemon.jsontidak 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 keyfeatures.cdiatau nilainyafalse, 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