Asistencia de GPU

Compatibilidad con OpenGL ES

MediaPipe admite OpenGL ES hasta la versión 3.2 en Android/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 superior (en sistemas Android/Linux) para ejecutar con 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 de Bazel especiales) intenta compilar y vincular con bibliotecas OpenGL ES (y, para iOS, también Metal).

En plataformas donde OpenGL ES no está disponible (consulta también la sección OpenGL ES Setup en Linux Desktop), puedes debes inhabilitar la compatibilidad con OpenGL ES con:

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

Configuración de OpenGL ES en computadoras de escritorio con Linux

En computadoras de escritorio Linux con tarjetas de video compatibles con OpenGL ES 3.1 o versiones posteriores, se puede ejecutar MediaPipe Procesamiento y renderización con GPU, y realiza inferencia de TFLite en GPU.

Para comprobar si tu GPU de escritorio de 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 descubres que cuando solicitas La información de la GPU verás el siguiente 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.

Es necesario imprimir ES 3.1 o una versión superior para realizar la inferencia de TFLite en la GPU y en MediaPipe. Con esta configuración, podrás compilar 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, aún puedes compilar destinos de MediaPipe que No requieren la 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>

Compatibilidad y configuración con CUDA de TensorFlow en computadoras de escritorio Linux

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

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

Después de la instalación, actualiza $PATH y $LD_LIBRARY_PATH, y ejecuta 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

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

Configurar $TF_CUDA_PATHS es la forma de declarar dónde se encuentra la biblioteca CUDA. Nota que el siguiente fragmento de código también agrega /usr/lib/x86_64-linux-gnu y /usr/include en $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 hacer que MediaPipe obtenga la configuración CUDA de TensorFlow, encuentra el .bazelrc y copia las secciones build:using_cuda y build:cuda en el archivo .bazelrc de MediaPipe. . Por ejemplo, a partir del 23 de abril de 2020, la configuración CUDA de TensorFlow será la lo 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, se imprime la información del dispositivo de la 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 está usando para el modelo. la inferencia.

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

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