it-swarm.com.de

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

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

Ich möchte OpenCL-Programme in Docker-Containern ausführen. Ich glaube, 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 darin ein OpenCL-Programm kompiliert. Wenn Sie das Programm ausführen, wird angezeigt, dass keine Geräte gefunden wurden. Also habe ich die Binärdatei auf den Host kopiert und dort funktioniert die Ausführung der Binärdatei (beide GPU-Geräte wurden erkannt).

Ich habe versucht, einen neuen Container (von Ubuntu: 16.04) zu erstellen und die Binärdatei sowie alle erforderlichen Bibliotheken aus dem für die Kompilierung verwendeten Container UND dem Ordner /usr/lib/x86_64-linux-gnu/amdgpu-pro vom Host zu kopieren.

Leider hat das auch nicht geklappt. Was könnte mir fehlen?

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

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

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

Und hier ist ein Beispielbefehl, um einen Container mit dem erstellten Image auszuführen:

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

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

  • Führen Sie die Test-Binärdatei im 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 Ausgaben entweder manuell oder mit etwas wie vimdiff
    • vimdiff container.strace Host.strace
  • Sehen Sie, wo sich die Befehlsergebnisse unterscheiden. In einigen Fällen wurden Dateien nicht gefunden, und ich fügte sie hinzu. In anderen Fällen hatte der Container keine Berechtigung zum Öffnen der Datei (die sich in/dev/dri befand und auf die ich zugreifen durfte) das Gerät)