OpenGL ES 支持
MediaPipe 在 Android/Linux 上支持最高版本为 3.2 的 OpenGL ES,最高版本为 ES 3.0 。此外,MediaPipe 还支持 iOS 上的 Metal。
需要 OpenGL ES 3.1 或更高版本(在 Android/Linux 系统上)才能运行 机器学习推理计算器和图表。
停用 OpenGL ES 支持
默认情况下,构建 MediaPipe(没有特殊的 bazel 标志)会尝试编译 和链接 OpenGL ES(以及 iOS 也包括 Metal)库。
在不支持 OpenGL ES 的平台上(另请参阅 OpenGL ES Setup on Linux Desktop) 应通过以下命令停用 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 或更高版本的打印,才能执行 TFLite 推理 。对于此设置,请使用以下代码进行构建:
$ bazel build --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 <my-target>
如果仅支持 ES 3.0 或更低版本,您仍然可以构建 MediaPipe 目标, 具有以下特征的 GPU 不需要 TFLite 推断:
$ 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 搭配使用,在显卡上执行 GPU 推理, 支持 CUDA。
要使用 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_cuda
和 build: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%