Suporte a GPUs

Compatibilidade com OpenGL ES

O MediaPipe oferece suporte ao OpenGL ES até a versão 3.2 no Android/Linux e até o ES 3.0 no iOS. Além disso, o MediaPipe também é compatível com Metal no iOS.

O OpenGL ES 3.1 ou versão mais recente é necessário (em sistemas Android/Linux) para executar calculadoras e gráficos de inferência de aprendizado de máquina.

Desativar suporte ao OpenGL ES

Por padrão, a criação do MediaPipe (sem flags bazel especiais) tenta compilar e vincular a bibliotecas OpenGL ES (e, no iOS, também Metal).

Em plataformas em que o OpenGL ES não está disponível (consulte também Configuração do OpenGL ES no Linux Desktop), desative o suporte a OpenGL ES com:

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

Configuração do OpenGL ES no computador Linux

Em computadores Linux com placas de vídeo compatíveis com o OpenGL ES 3.1 ou mais recente, o MediaPipe pode executar a computação e a renderização de GPU e realizar a inferência do TFLite na GPU.

Para verificar se a GPU para computador Linux pode executar o MediaPipe com o 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

Por exemplo, ele pode mostrar:

$ 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 você se conectou ao computador por SSH e descobre que as informações da GPU são verificadas, a saída será exibida:

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

Tente restabelecer sua conexão SSH com a opção -X e tente novamente. Exemplo:

ssh -X <user>@<host>

Observe o texto do ES 3.20 acima.

É necessário ver o ES 3.1 ou uma versão mais recente impressa para realizar a inferência do TFLite na GPU no MediaPipe. Com essa configuração, crie usando:

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

Se apenas o ES 3.0 ou anterior for compatível, ainda será possível criar destinos do MediaPipe que não exijam inferência do TFLite na GPU com:

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

Suporte e configuração do TensorFlow CUDA em computadores Linux

O framework MediaPipe não requer CUDA para computação e renderização de GPU. No entanto, o MediaPipe pode trabalhar com o TensorFlow para realizar inferência de GPU em placas de vídeo compatíveis com CUDA.

Para ativar a inferência de GPU do TensorFlow com o MediaPipe, a primeira etapa é seguir a documentação da GPU do TensorFlow para instalar o software NVIDIA necessário na área de trabalho Linux.

Após a instalação, atualize $PATH e $LD_LIBRARY_PATH e execute ldconfig com:

$ 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

É recomendado verificar a instalação da 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

Definir $TF_CUDA_PATHS é a maneira de declarar onde a biblioteca CUDA está. O snippet de código a seguir também adiciona /usr/lib/x86_64-linux-gnu e /usr/include a $TF_CUDA_PATHS para cudablas e libcudnn.

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

Para fazer o MediaPipe receber as configurações CUDA do TensorFlow, encontre o .bazelrc do TensorFlow e copie as seções build:using_cuda e build:cuda para o arquivo .bazelrc do MediaPipe. Por exemplo, desde 23 de abril de 2020, a configuração CUDA do TensorFlow é a seguinte:

# 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 fim, crie o MediaPipe com a GPU do TensorFlow com mais duas sinalizações, --config=cuda e --spawn_strategy=local. Exemplo:

$ 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

Enquanto o binário está em execução, ele imprime as informações do dispositivo da 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

É possível monitorar o uso da GPU para verificar se ela é usada para inferência de modelo.

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

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