Compatibilité GPU

Compatibilité avec OpenGL ES

MediaPipe est compatible avec OpenGL ES jusqu'à la version 3.2 sur Android/Linux et jusqu'à ES 3.0 sur iOS. MediaPipe est également compatible avec Metal sur iOS.

OpenGL ES 3.1 ou version ultérieure est requis (sur les systèmes Android/Linux) pour exécuter des calculateurs et des graphiques d'inférence de machine learning.

Désactiver la compatibilité avec OpenGL ES

Par défaut, la création de MediaPipe (sans indicateur Bazel spécial) tente de compiler et d'associer les bibliothèques OpenGL ES (et pour iOS Metal).

Sur les plates-formes où OpenGL ES n'est pas disponible (consultez également la page Configuration d'OpenGL ES sur un ordinateur Linux), vous devez désactiver la compatibilité d'OpenGL ES avec:

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

Configuration d'OpenGL ES sur un ordinateur Linux

Sur un ordinateur Linux équipé de cartes vidéo compatibles avec OpenGL ES 3.1 ou version ultérieure, MediaPipe peut exécuter des calculs et un rendu GPU ainsi que des inférences TFLite sur les GPU.

Pour vérifier si votre GPU pour ordinateur Linux peut exécuter MediaPipe avec OpenGL ES:

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

Par exemple, il peut imprimer:

$ 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:

Si vous vous êtes connecté à votre ordinateur via SSH et que vous obtenez le résultat suivant lorsque vous demandez des informations sur le GPU:

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

Essayez de rétablir la connexion SSH avec l'option -X, puis réessayez. Exemple :

ssh -X <user>@<host>

Remarquez la présence du texte ES 3.20 ci-dessus.

Vous devez afficher ES 3.1 ou une version ultérieure pour effectuer une inférence TFLite sur le GPU dans MediaPipe. Avec cette configuration, compilez avec:

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

Si seul ES 3.0 ou une version antérieure est pris en charge, vous pouvez toujours créer des cibles MediaPipe qui ne nécessitent pas l'inférence TFLite sur GPU avec:

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

Compatibilité et configuration de TensorFlow CUDA sur les ordinateurs Linux

Le framework MediaPipe ne nécessite pas CUDA pour le calcul et le rendu GPU. Toutefois, MediaPipe peut fonctionner avec TensorFlow pour effectuer des inférences GPU sur les cartes vidéo compatibles avec CUDA.

Pour activer l'inférence GPU TensorFlow avec MediaPipe, la première étape consiste à suivre la documentation sur les GPU TensorFlow afin d'installer le logiciel NVIDIA requis sur votre bureau Linux.

Après l'installation, mettez à jour $PATH et $LD_LIBRARY_PATH, puis exécutez ldconfig avec:

$ 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

Nous vous recommandons de vérifier l'installation de CUPTI, CUDA, CuDNN et NVCC:

$ 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

Définir $TF_CUDA_PATHS permet de déclarer l'emplacement de la bibliothèque CUDA. Notez que l'extrait de code suivant ajoute également /usr/lib/x86_64-linux-gnu et /usr/include à $TF_CUDA_PATHS pour cudablas et libcudnn.

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

Pour que MediaPipe récupère les paramètres CUDA de TensorFlow, recherchez le fichier .bazelrc de TensorFlow, puis copiez les sections build:using_cuda et build:cuda dans le fichier .bazelrc de MediaPipe. Par exemple, à compter du 23 avril 2020, le paramètre CUDA de TensorFlow est le suivant:

# 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

Enfin, compilez MediaPipe avec le GPU TensorFlow avec deux autres indicateurs --config=cuda et --spawn_strategy=local. Exemple :

$ 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

Pendant l'exécution du binaire, il affiche les informations relatives à l'appareil GPU:

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

Vous pouvez surveiller l'utilisation du GPU pour vérifier s'il est utilisé pour l'inférence de modèle.

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

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