Obsługa GPU

Obsługa OpenGL ES

MediaPipe obsługuje platformę OpenGL ES do wersji 3.2 w systemach Android/Linux i do ES 3.0 w systemie iOS. MediaPipe obsługuje też Metal na urządzeniach z iOS.

Do uruchamiania kalkulatorów i wykresów wnioskowania na podstawie systemów uczących się wymagany jest standard OpenGL ES 3.1 lub nowszy (w systemach Android i Linux).

Wyłącz obsługę OpenGL ES

Domyślnie kompilacja MediaPipe (bez specjalnych flag bazelowych) próbuje skompilować i połączyć się z bibliotekami OpenGL ES (a w przypadku iOS także metalem).

Na platformach, które nie mają wersji OpenGL ES (zobacz Konfiguracja OpenGL ES na komputerze z Linuksem), wyłącz obsługę tego interfejsu za pomocą:

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

Konfiguracja OpenGL ES na komputerze z systemem Linux

Na komputerach z systemem Linux z kartami wideo obsługującymi OpenGL ES 3.1 lub nowszym MediaPipe może wykonywać obliczenia i renderowanie GPU, a także wnioskować na podstawie TFLite w GPU.

Aby sprawdzić, czy GPU w systemie Linux obsługuje MediaPipe z 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

Może na przykład wydrukować:

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

Jeśli połączysz się z komputerem przez SSH i poszukasz informacji o GPU, zobaczysz wyniki:

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

Nawiąż ponownie połączenie SSH za pomocą opcji -X i spróbuj jeszcze raz. Przykład:

ssh -X <user>@<host>

Zapoznaj się z tekstem ES 3.20 powyżej.

Aby wnioskować TFLite na GPU w MediaPipe, musisz mieć wydrukowany w wersji ES 3.1 lub nowszej. Przy takiej konfiguracji stwórz:

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

Jeśli obsługiwana jest tylko wersja ES 3.0 lub nowsza, nadal możesz tworzyć cele MediaPipe, które nie wymagają wnioskowania przez TFLite w przypadku GPU za pomocą:

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

Obsługa i konfiguracja TensorFlow CUDA na komputerze z systemem Linux

Platforma MediaPipe nie wymaga CUDA do obliczeń i renderowania GPU. MediaPipe może jednak współpracować z TensorFlow, aby wnioskować na podstawie GPU w przypadku kart graficznych, które obsługują CUDA.

Aby włączyć wnioskowanie z użyciem procesora graficznego TensorFlow w MediaPipe, najpierw wykonaj czynności opisane w dokumentacji GPU TensorFlow w celu zainstalowania wymaganego oprogramowania NVIDIA na komputerze z Linuksem.

Po instalacji zaktualizuj $PATH i $LD_LIBRARY_PATH oraz uruchom ldconfig przy użyciu:

$ 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

Zalecamy sprawdzenie instalacji CUPTI, CUDA, CuDNN i 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

Ustawienie $TF_CUDA_PATHS pozwala określić, gdzie znajduje się biblioteka CUDA. Ten fragment kodu dodaje też właściwości /usr/lib/x86_64-linux-gnu i /usr/include do pola $TF_CUDA_PATHS w przypadku obiektów cudablas i libcudnn.

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

Aby usługa MediaPipe pobierała ustawienia CUDA w TensorFlow, znajdź plik .bazelrc w TensorFlow i skopiuj sekcje build:using_cuda oraz build:cuda do pliku .bazelrc MediaPipe. Na przykład od 23 kwietnia 2020 r. ustawienie CUDA w TensorFlow będzie wyglądać tak:

# 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

Na koniec utwórz MediaPipe z GPU TensorFlow z 2 kolejnymi flagami --config=cuda i --spawn_strategy=local. Na przykład:

$ 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

Gdy plik binarny jest uruchomiony, wyświetlane są informacje o urządzeniu 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

Możesz monitorować wykorzystanie GPU, aby sprawdzić, czy jest on używany do wnioskowania na podstawie modelu.

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

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