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%