Compatibilité avec les 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. En outre, 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 l'exécution des calculateurs et des graphiques d'inférence de ML.

Désactiver la prise en charge d'OpenGL ES

Par défaut, la compilation de MediaPipe (sans indicateur Bauel spécial) tente de compiler et un lien vers les bibliothèques OpenGL ES (et pour iOS, aussi vers Metal).

Sur les plates-formes où OpenGL ES n'est pas disponible (voir aussi OpenGL ES Setup on Linux Desktop), vous devez désactiver la prise en charge d'OpenGL ES avec:

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

Configuration d'OpenGL ES sur un ordinateur Linux

Sur les ordinateurs de bureau Linux équipés de cartes vidéo compatibles avec OpenGL ES 3.1 ou version ultérieure, MediaPipe peut s'exécuter Calcul et rendu GPU, et inférence TFLite sur le GPU.

Pour vérifier si votre GPU Linux pour ordinateur 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 afficher:

$ 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 constatez à quel moment vous informations GPU s'affichent dans le résultat:

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

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

ssh -X <user>@<host>

Notez le texte ES 3.20 ci-dessus.

Vous devez imprimer ES 3.1 ou version ultérieure pour effectuer l'inférence TFLite sur le GPU dans MediaPipe. Avec cette configuration, créez avec:

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

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

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

Prise en charge et configuration de TensorFlow CUDA sur ordinateur de bureau Linux

Le framework MediaPipe ne nécessite pas CUDA pour le calcul et le rendu GPU. Toutefois, MediaPipe peut utiliser TensorFlow pour effectuer des inférences GPU sur des cartes vidéo prend en charge CUDA.

Pour activer l'inférence GPU TensorFlow avec MediaPipe, vous devez d'abord suivre la Documentation sur les GPU TensorFlow pour installer le logiciel NVIDIA requis sur votre bureau Linux.

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

$ 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. Remarque que l'extrait de code suivant ajoute également /usr/lib/x86_64-linux-gnu et /usr/include dans $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 obtienne les paramètres CUDA de TensorFlow, .bazelrc et Copiez les sections build:using_cuda et build:cuda dans le fichier .bazelrc de MediaPipe . Par exemple, depuis le 23 avril 2020, le paramètre CUDA de TensorFlow est suivantes:

# 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, créez MediaPipe avec un GPU TensorFlow avec deux autres options --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 que le binaire est en cours d'exécution, il affiche les informations sur 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 si le GPU est utilisé pour le modèle. l'inférence.

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

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