GPU 支持

OpenGL ES 支持

MediaPipe 在 Android/Linux 上最高支持 OpenGL ES 3.2 版,在 iOS 上最高支持 ES 3.0。此外,MediaPipe 还支持 iOS 上的 Metal。

(在 Android/Linux 系统上)需要 OpenGL ES 3.1 或更高版本才能运行机器学习推理计算器和图表。

停用 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 文本。

您需要看到输出的 ES 3.1 或更高版本,才能在 MediaPipe 中的 GPU 上执行 TFLite 推断。采用此设置后,可使用以下元素进行构建:

$ 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 框架不需要使用 CUDA 进行 GPU 计算和渲染。不过,MediaPipe 可以配合 TensorFlow 在支持 CUDA 的显卡上执行 GPU 推断。

如需使用 MediaPipe 启用 TensorFlow GPU 推断,首先要按照 TensorFlow GPU 文档中的说明在 Linux 桌面上安装所需的 NVIDIA 软件。

安装后,更新 $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 库位置的方式。请注意,以下代码段还会将 /usr/lib/x86_64-linux-gnu/usr/include 添加到 cudablas 和 libcudnn 的 $TF_CUDA_PATHS 中。

$ 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

最后,使用 TensorFlow GPU 构建 MediaPipe,并添加另外两个标志 --config=cuda--spawn_strategy=local。例如:

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