Asistencia de GPU

Compatibilidad con OpenGL ES

MediaPipe es compatible con OpenGL ES hasta la versión 3.2 en Android y Linux y hasta ES 3.0 en iOS. Además, MediaPipe también es compatible con Metal en iOS.

Se requiere OpenGL ES 3.1 o versiones posteriores (en sistemas Android/Linux) para ejecutar calculadoras y gráficos de inferencia de aprendizaje automático.

Inhabilitar la compatibilidad con OpenGL ES

De forma predeterminada, la compilación de MediaPipe (sin marcas especiales de Bazel) intenta compilar y vincular con bibliotecas OpenGL ES (y para iOS también Metal).

En las plataformas donde OpenGL ES no está disponible (consulta también OpenGL ES Setup on Linux Desktop), debes inhabilitar la compatibilidad con OpenGL ES con lo siguiente:

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

Configuración de OpenGL ES en computadoras de escritorio Linux

En computadoras de escritorio Linux con tarjetas de video compatibles con OpenGL ES 3.1 y versiones posteriores, MediaPipe puede ejecutar el procesamiento y la renderización de GPU, así como realizar inferencias de TFLite en la GPU.

Para comprobar si tu GPU de escritorio Linux puede ejecutar MediaPipe con OpenGL ES, haz lo siguiente:

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

Por ejemplo, puede imprimir lo siguiente:

$ 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 te conectaste a tu computadora a través de SSH y verificas que, cuando buscas información de la GPU, verás el resultado:

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

Intenta restablecer la conexión SSH con la opción -X y vuelve a intentarlo. Por ejemplo:

ssh -X <user>@<host>

Observa el texto de ES 3.20 anterior.

Debes ver ES 3.1 o una versión posterior impresa para realizar la inferencia de TFLite en la GPU en MediaPipe. Con esta configuración, compila con lo siguiente:

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

Si solo se admite ES 3.0 o versiones anteriores, puedes compilar objetivos de MediaPipe que no requieran inferencia de TFLite en GPU con lo siguiente:

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

Configuración y compatibilidad con CUDA de TensorFlow en Linux Desktop

El framework de MediaPipe no requiere CUDA para el procesamiento y la renderización de GPU. Sin embargo, MediaPipe puede trabajar con TensorFlow para realizar inferencias de GPU en tarjetas de video compatibles con CUDA.

Para habilitar la inferencia de GPU de TensorFlow con MediaPipe, el primer paso es seguir la documentación de GPU de TensorFlow para instalar el software necesario de NVIDIA en tu computadora de escritorio Linux.

Después de la instalación, actualiza $PATH y $LD_LIBRARY_PATH, y ejecuta ldconfig con el siguiente comando:

$ 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

Se recomienda verificar la instalación de CUPTI, CUDA, CuDNN y 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

Mediante la configuración de $TF_CUDA_PATHS, se declara la ubicación de la biblioteca CUDA. Ten en cuenta que el siguiente fragmento de código también agrega /usr/lib/x86_64-linux-gnu y /usr/include a $TF_CUDA_PATHS para cudablas y libcudnn.

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

Para que MediaPipe obtenga la configuración CUDA de TensorFlow, busca .bazelrc de TensorFlow y copia las secciones build:using_cuda y build:cuda en el archivo .bazelrc de MediaPipe. Por ejemplo, desde el 23 de abril de 2020, la configuración de CUDA de TensorFlow es la siguiente:

# 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

Por último, compila MediaPipe con la GPU de TensorFlow con dos marcas más, --config=cuda y --spawn_strategy=local. Por ejemplo:

$ 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

Mientras se ejecuta el objeto binario, imprime la información del 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

Puedes supervisar el uso de la GPU para verificar si se usa para la inferencia del modelo.

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

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