Supporto GPU

Supporto OpenGL ES

MediaPipe supporta OpenGL ES fino alla versione 3.2 su Android/Linux e fino a ES 3.0 su iOS. MediaPipe supporta anche Metal su iOS.

Per l'esecuzione di calcolatrici e grafici di inferenza del machine learning, è richiesto OpenGL ES 3.1 o versioni successive (su sistemi Android/Linux).

Disattiva supporto OpenGL ES

Per impostazione predefinita, la creazione di MediaPipe (senza flag bazel speciali) tenta di compilare e collegare le librerie OpenGL ES (e per iOS anche Metal).

Sulle piattaforme in cui OpenGL ES non è disponibile (consulta anche Configurazione di OpenID ES su Linux per desktop), ti consigliamo di disattivare il supporto di OpenGL ES con:

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

Configurazione di OpenGL ES su computer Linux

Sui computer Linux con schede video che supportano OpenGL ES 3.1 e versioni successive, MediaPipe può eseguire calcolo e rendering delle GPU ed eseguire l'inferenza TFLite sulla GPU.

Per verificare se la tua GPU desktop Linux può eseguire MediaPipe con 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

Ad esempio, potrebbero essere stampate:

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

Se hai effettuato la connessione al computer tramite SSH e quando cerchi informazioni sulla GPU, vedrai l'output:

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

Prova a ristabilire la connessione SSH con l'opzione -X e riprova. Ad esempio:

ssh -X <user>@<host>

Osserva il testo ES 3.20 riportato sopra.

È necessario che la versione ES 3.1 o successiva venga stampata per eseguire l'inferenza TFLite sulla GPU in MediaPipe. Con questa configurazione, crea con:

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

Se è supportato solo ES 3.0 o versioni precedenti, puoi comunque creare target MediaPipe che non richiedono l'inferenza TFLite sulla GPU con:

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

Supporto e configurazione di TensorFlow CUDA su Linux per desktop

Il framework MediaPipe non richiede lo sconto CUDA per il calcolo e il rendering della GPU. Tuttavia, MediaPipe può utilizzare TensorFlow per eseguire l'inferenza della GPU sulle schede video che supportano CUDA.

Per abilitare l'inferenza della GPU TensorFlow con MediaPipe, il primo passaggio consiste nel seguire la documentazione relativa alle GPU di TensorFlow per installare il software NVIDIA richiesto sul tuo desktop Linux.

Dopo l'installazione, aggiorna $PATH e $LD_LIBRARY_PATH ed esegui ldconfig con:

$ 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

Ti consigliamo di verificare l'installazione di CUPTI, CUDA, CuDNN e 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

L'impostazione $TF_CUDA_PATHS consente di dichiarare la posizione della libreria CUDA. Tieni presente che il seguente snippet di codice aggiunge anche /usr/lib/x86_64-linux-gnu e /usr/include in $TF_CUDA_PATHS per cudablas e libcudnn.

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

Per fare in modo che MediaPipe ottenga le impostazioni CUDA di TensorFlow, trova .bazelrc di TensorFlow e copia le sezioni build:using_cuda e build:cuda nel file .bazelrc di MediaPipe. Ad esempio, a partire dal 23 aprile 2020, l'impostazione CUDA di TensorFlow è la seguente:

# 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

Infine, crea MediaPipe con la GPU TensorFlow con altri due flag --config=cuda e --spawn_strategy=local. Ad esempio:

$ 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

Mentre il programma binario è in esecuzione, stampa le informazioni sul dispositivo 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

Puoi monitorare l'utilizzo della GPU per verificare se viene utilizzata per l'inferenza del modello.

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

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