GPU-Unterstützung

OpenGL ES-Unterstützung

MediaPipe unterstützt OpenGL ES bis Version 3.2 unter Android/Linux und bis ES 3.0 unter iOS. Außerdem unterstützt MediaPipe Metal auf iOS-Geräten.

Zum Ausführen von Inferenzrechnern und Grafiken für maschinelles Lernen ist OpenGL ES 3.1 oder höher (auf Android-/Linux-Systemen) erforderlich.

OpenGL ES-Unterstützung deaktivieren

Beim Erstellen von MediaPipe (ohne spezielle Baizel-Flags) wird standardmäßig versucht, Bibliotheken mit OpenGL ES (und für iOS auch Metal-Bibliotheken) zu kompilieren und zu verknüpfen.

Auf Plattformen, auf denen OpenGL ES nicht verfügbar ist (siehe auch OpenGL ES-Einrichtung unter Linux Desktop), sollten Sie die Unterstützung von OpenGL ES folgendermaßen deaktivieren:

$ bazel build --define MEDIAPIPE_DISABLE_GPU=1 <my-target>

OpenGL ES-Einrichtung auf Linux-Computern

Auf Linux-Desktops mit Grafikkarten, die OpenGL ES 3.1 und höher unterstützen, kann MediaPipe GPU-Computing und -Rendering ausführen sowie TFLite-Inferenzen auf der GPU ausführen.

So prüfen Sie, ob Ihre Linux-Desktop-GPU MediaPipe mit OpenGL ES ausführen kann:

$ sudo apt-get install mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev
$ sudo apt-get install mesa-utils
$ glxinfo | grep -i opengl

Es könnte beispielsweise Folgendes ausgegeben werden:

$ glxinfo | grep -i opengl
...
OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 430.50
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:

Wenn Sie über SSH eine Verbindung zu Ihrem Computer hergestellt haben und nach GPU-Informationen suchen, sehen Sie die Ausgabe:

glxinfo | grep -i opengl
Error: unable to open display

Stellen Sie die SSH-Verbindung mit der Option -X wieder her und versuchen Sie es noch einmal. Beispiel:

ssh -X <user>@<host>

Beachten Sie den obigen ES 3.20-Text.

Sie müssen ES 3.1 oder höher gedruckt sehen, um TFLite-Inferenz auf einer GPU in MediaPipe ausführen zu können. Bei dieser Einrichtung erstellen Sie mit:

$ bazel build --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 <my-target>

Wenn nur ES 3.0 oder niedriger unterstützt wird, können Sie trotzdem MediaPipe-Ziele erstellen, die keine TFLite-Inferenz auf GPU benötigen:

$ bazel build --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 --copt -DMEDIAPIPE_DISABLE_GL_COMPUTE <my-target>

Unterstützung und Einrichtung von TensorFlow CUDA unter Linux Desktop

Das MediaPipe-Framework erfordert für GPU-Computing und -Rendering kein CUDA. MediaPipe kann jedoch in Kombination mit TensorFlow GPU-Inferenzen auf Grafikkarten ausführen, die CUDA unterstützen.

Wenn Sie TensorFlow GPU-Inferenz mit MediaPipe aktivieren möchten, müssen Sie zuerst die in der TensorFlow GPU-Dokumentation beschriebene NVIDIA-Software auf dem Linux-Desktop installieren.

Aktualisieren Sie nach der Installation $PATH und $LD_LIBRARY_PATH und führen Sie ldconfig mit folgendem Befehl aus:

$ export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
$ export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64,/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
$ sudo ldconfig

Wir empfehlen, die Installation von CUPTI, CUDA, CuDNN und NVCC zu prüfen:

$ ls /usr/local/cuda/extras/CUPTI
/lib64
libcupti.so       libcupti.so.10.1.208  libnvperf_host.so        libnvperf_target.so
libcupti.so.10.1  libcupti_static.a     libnvperf_host_static.a

$ ls /usr/local/cuda-10.1
LICENSE  bin  extras   lib64      libnvvp           nvml  samples  src      tools
README   doc  include  libnsight  nsightee_plugins  nvvm  share    targets  version.txt

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243

$ ls /usr/lib/x86_64-linux-gnu/ | grep libcudnn.so
libcudnn.so
libcudnn.so.7
libcudnn.so.7.6.4

Durch Festlegen von $TF_CUDA_PATHS wird angegeben, wo sich die CUDA-Bibliothek befindet. Beachten Sie, dass mit dem folgenden Code-Snippet auch /usr/lib/x86_64-linux-gnu und /usr/include für „cudablas“ und „libcudnn“ in $TF_CUDA_PATHS eingefügt werden.

$ export TF_CUDA_PATHS=/usr/local/cuda-10.1,/usr/lib/x86_64-linux-gnu,/usr/include

Damit MediaPipe die CUDA-Einstellungen von TensorFlow abrufen kann, suchen Sie nach der .bazelrc-Datei von TensorFlow und kopieren Sie die Abschnitte build:using_cuda und build:cuda in die .bazelrc-Datei von MediaPipe. Seit dem 23. April 2020 lautet die CUDA-Einstellung von TensorFlow beispielsweise so:

# This config refers to building with CUDA available. It does not necessarily
# mean that we build CUDA op kernels.
build:using_cuda --define=using_cuda=true
build:using_cuda --action_env TF_NEED_CUDA=1
build:using_cuda --crosstool_top=@local_config_cuda//crosstool:toolchain

# This config refers to building CUDA op kernels with nvcc.
build:cuda --config=using_cuda
build:cuda --define=using_cuda_nvcc=true

Erstellen Sie abschließend MediaPipe mit TensorFlow GPU und den beiden weiteren Flags --config=cuda und --spawn_strategy=local. Beispiel:

$ bazel build -c opt --config=cuda --spawn_strategy=local \
    --define no_aws_support=true --copt -DMESA_EGL_NO_X11_HEADERS \
    mediapipe/examples/desktop/object_detection:object_detection_tensorflow

Während die Binärdatei ausgeführt wird, werden die GPU-Geräteinformationen ausgegeben:

I external/org_tensorflow/tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1
I external/org_tensorflow/tensorflow/core/common_runtime/gpu/gpu_device.cc:1544] Found device 0 with properties: pciBusID: 0000:00:04.0 name: Tesla T4 computeCapability: 7.5 coreClock: 1.59GHz coreCount: 40 deviceMemorySize: 14.75GiB deviceMemoryBandwidth: 298.08GiB/s
I external/org_tensorflow/tensorflow/core/common_runtime/gpu/gpu_device.cc:1686] Adding visible gpu devices: 0

Sie können die GPU-Nutzung überwachen, um zu prüfen, ob die GPU für Modellinferenz verwendet wird.

$ nvidia-smi --query-gpu=utilization.gpu --format=csv --loop=1

0 %
0 %
4 %
5 %
83 %
21 %
22 %
27 %
29 %
100 %
0 %
0%