Wie starte ich ein OpenCL-Programm im Docker-Container mit AMDGPU-Pro?

7

Ich habe eine neue Ubuntu 16.04-Installation, bei der nur der AMDGPU-Pro-Treiber (proprietär) und die Docker-Engine (von apt.dockerproject.org PPA) installiert sind.

Ich möchte OpenCL-Programme in Docker-Containern ausführen. Ich denke: Der Kernel wird gemeinsam genutzt, daher sollten die GPU-Module für die Container verfügbar sein. Was fehlt, sind die Bibliotheken für den Zugriff auf die Module.

Ich habe einen Container eingerichtet und ein OpenCL-Programm darin kompiliert. Wenn Sie das darin enthaltene Programm ausführen, wird zurückgegeben, dass keine Geräte gefunden wurden. Also habe ich die Binärdatei auf den Host kopiert und die Ausführung der Binärdatei dort funktioniert (meine beiden GPU-Geräte wurden erkannt).

Ich habe versucht, einen neuen Container (von Ubuntu: 16.04) zu erstellen und die Binärdatei und alle erforderlichen Bibliotheken aus dem zum Kompilieren verwendeten Container UND dem Ordner /usr/lib/x86_64-linux-gnu/amdgpu-provom Host zu kopieren .

Leider hat das auch nicht funktioniert. Was könnte ich vermissen?

Janito Vaqueiro Ferreira Filho
quelle

Antworten:

12

Hat es geschafft, es zum Laufen zu bringen. Zusammenfassung:

  • Sie müssen dem Container die Bibliotheken aus / usr / lib / x86_64-linux-gnu / amdgpu-pro hinzufügen
  • Sie müssen die Konfigurationsdateien aus / etc / OpenCL zum Container hinzufügen
  • Der Container muss auf das Gerät / dev / dri zugreifen können

Hier ist ein Beispielskript zum Erstellen des Docker-Images: https://gist.github.com/anonymous/fea9c0a9e986eeda7cf58e47f47c89f2

Und hier ist ein Beispielbefehl zum Ausführen eines Containers mit dem erstellten Image:

docker run -it --device /dev/dri:/dev/dri climage

Falls jemand auf ein ähnliches Problem stößt, werde ich auch auflisten, wie ich die "Lösung" herausgefunden habe:

  • Führen Sie die Test-Binärdatei auf dem Host mit strace aus, um alle Systemaufrufe aufzulisten
    • strace ./cltest &> host.strace
  • Führen Sie die Test-Binärdatei im Container aus und verwenden Sie strace, um alle Systemaufrufe aufzulisten
    • docker run --rm --security-opt seccomp:unconfined -v $(pwd):/external climage strace /external/cltest &> ./container.strace
  • Vergleichen Sie die beiden Ausgänge entweder manuell oder mit etwas ähnlichem vimdiff
    • vimdiff container.strace host.strace
  • Sehen Sie, wo sich die Befehlsergebnisse unterscheiden. In einigen Fällen wurden Dateien nicht gefunden, also habe ich sie hinzugefügt. In anderen Fällen hatte der Container keine Berechtigung zum Öffnen der Datei (die sich in / dev / dri befand, sodass ich darauf zugreifen konnte) das Gerät)
Janito Vaqueiro Ferreira Filho
quelle