GPU のサポート

OpenGL ES のサポート

MediaPipe は、Android/Linux ではバージョン 3.2 まで、iOS では ES 3.0 までの OpenGL ES をサポートしています。また、MediaPipe は iOS の Metal もサポートしています。

ML 推論計算ツールおよびグラフを実行するには、OpenGL ES 3.1 以降(Android/Linux システム上)が必要です。

OpenGL ES のサポートを無効にする

デフォルトでは、MediaPipe をビルドすると(特別な bazel フラグなし)、OpenGL ES(iOS の場合は Metal)ライブラリに対してコンパイルとリンクが試行されます。

OpenGL ES を使用できないプラットフォームでは(Linux デスクトップでの OpenGL ES の設定もご覧ください)、次のコマンドで OpenGL ES のサポートを無効にする必要があります。

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

Linux デスクトップでの OpenGL ES の設定

OpenGL ES 3.1 以降をサポートするビデオカードを搭載した Linux デスクトップでは、MediaPipe は GPU のコンピューティングとレンダリングを実行し、GPU で TFLite 推論を実行できます。

Linux デスクトップ GPU が OpenGL ES で MediaPipe を実行できるかどうかを確認するには:

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

たとえば、次のように出力されます。

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

SSH 経由でコンピュータに接続し、GPU 情報をプローブしたときに次の出力が表示されます。

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

-X オプションを使用して SSH 接続を再確立してから、もう一度お試しください。次に例を示します。

ssh -X <user>@<host>

上記の ES 3.20 のテキストに注目してください。

MediaPipe の GPU で TFLite 推論を実行するには、ES 3.1 以降が出力されている必要があります。このセットアップで、次のようにビルドします。

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

ES 3.0 以前のみがサポートされている場合でも、以下を使用して GPU で TFLite 推論を必要としない MediaPipe ターゲットをビルドできます。

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

Linux デスクトップでの TensorFlow CUDA のサポートと設定

MediaPipe フレームワークでは、GPU コンピューティングとレンダリングに CUDA は必要ありません。ただし、MediaPipe は TensorFlow と連携して、CUDA をサポートするビデオカードに対して GPU 推論を実行できます。

MediaPipe を使用して TensorFlow GPU 推論を有効にするには、最初のステップとして、TensorFlow GPU のドキュメントに従って、必要な NVIDIA ソフトウェアを Linux デスクトップにインストールします。

インストール後、$PATH$LD_LIBRARY_PATH を更新し、次のコマンドで ldconfig を実行します。

$ 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

CUPTI、CUDA、CuDNN、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

$TF_CUDA_PATHS を設定すると、CUDA ライブラリの場所を宣言できます。次のコード スニペットでは、cudablas と libcudnn の $TF_CUDA_PATHS にも /usr/lib/x86_64-linux-gnu/usr/include が追加されます。

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

MediaPipe が TensorFlow の CUDA 設定を取得できるようにするには、TensorFlow の .bazelrc を見つけて、build:using_cudabuild:cuda セクションを MediaPipe の .bazelrc ファイルにコピーします。たとえば、2020 年 4 月 23 日の時点で、TensorFlow の CUDA 設定は次のようになります。

# 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

最後に、さらに 2 つのフラグ --config=cuda--spawn_strategy=local を指定して、TensorFlow GPU で MediaPipe をビルドします。次に例を示します。

$ 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

バイナリの実行中に、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

GPU の使用状況をモニタリングして、モデルの推論に GPU が使用されているかどうかを確認できます。

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

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