Hỗ trợ GPU

Hỗ trợ OpenGL ES

MediaPipe hỗ trợ OpenGL ES lên đến phiên bản 3.2 trên Android/Linux và tối đa ES 3.0 trên iOS. Ngoài ra, MediaPipe cũng hỗ trợ Metal trên iOS.

Yêu cầu OpenGL ES 3.1 trở lên (trên hệ thống Android/Linux) để chạy đồ thị và máy tính suy luận trong học máy.

Tắt tính năng hỗ trợ OpenGL ES

Theo mặc định, việc tạo MediaPipe (không có cờ bazel đặc biệt) sẽ cố gắng biên dịch và liên kết dựa vào thư viện OpenGL ES (và đối với iOS cũng như Metal).

Trên các nền tảng không có OpenGL ES (xem thêm Thiết lập OpenGL ES trên Máy tính Linux), bạn sẽ tắt tính năng hỗ trợ OpenGL ES bằng:

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

Thiết lập OpenGL ES trên máy tính Linux

Trên máy tính để bàn Linux có thẻ video hỗ trợ OpenGL ES 3.1 trở lên, MediaPipe có thể chạy Tính toán và kết xuất GPU, cũng như thực hiện suy luận TFLite trên GPU.

Cách kiểm tra xem GPU máy tính Linux của bạn có thể chạy MediaPipe với OpenGL ES hay không:

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

Ví dụ: tính năng này có thể in:

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

Nếu bạn đã kết nối với máy tính của mình qua SSH và tìm thời điểm bạn thăm dò Thông tin GPU bạn thấy kết quả:

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

Hãy thử thiết lập lại kết nối SSH bằng tuỳ chọn -X rồi thử lại. Ví dụ:

ssh -X <user>@<host>

Hãy chú ý đến văn bản ES 3.20 ở trên.

Bạn cần xem phiên bản ES 3.1 trở lên được in để thực hiện suy luận TFLite trên GPU trong MediaPipe. Với chế độ thiết lập này, hãy tạo bản dựng bằng:

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

Nếu chỉ hỗ trợ ES 3.0 trở xuống, bạn vẫn có thể xây dựng các mục tiêu MediaPipe không yêu cầu suy luận TFLite trên GPU với:

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

Hỗ trợ và thiết lập TensorFlow CUDA trên máy tính Linux

Khung MediaPipe không yêu cầu CUDA để tính toán và kết xuất GPU. Tuy nhiên, MediaPipe có thể kết hợp với TensorFlow để suy luận GPU trên những thẻ video hỗ trợ CUDA.

Để bật suy luận GPU TensorFlow bằng MediaPipe, bước đầu tiên là phải theo thời gian Tài liệu về GPU TensorFlow để cài đặt phần mềm NVIDIA cần thiết trên máy tính Linux của bạn.

Sau khi cài đặt, hãy cập nhật $PATH$LD_LIBRARY_PATH rồi chạy ldconfig bằng:

$ 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

Bạn nên xác minh việc cài đặt CUPTI, CUDA, CuDNN và 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

Đặt $TF_CUDA_PATHS là cách để khai báo vị trí của thư viện CUDA. Ghi chú đoạn mã sau cũng thêm /usr/lib/x86_64-linux-gnu/usr/include vào $TF_CUDA_PATHS cho cudablas và libcudnn.

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

Để thiết lập MediaPipe lấy chế độ cài đặt CUDA của TensorFlow, hãy tìm chế độ cài đặt CUDA của TensorFlow .bazelrc và sao chép phần build:using_cudabuild:cuda vào tệp .bazelrc của MediaPipe . Ví dụ: kể từ ngày 23 tháng 4 năm 2020, chế độ cài đặt CUDA của TensorFlow là sau:

# 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

Cuối cùng, hãy xây dựng MediaPipe bằng GPU TensorFlow với thêm 2 cờ --config=cuda--spawn_strategy=local. Ví dụ:

$ 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

Khi đang chạy, tệp nhị phân sẽ in thông tin về thiết bị 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

Bạn có thể theo dõi mức sử dụng GPU để xác minh xem GPU có được sử dụng cho mô hình hay không suy luận.

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

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