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 ES 3.0 trên iOS. Ngoài ra, MediaPipe cũng hỗ trợ Metal trên iOS.

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

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

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

Trên các nền tảng không hỗ trợ OpenGL ES (xem thêm bài viết Thiết lập OpenGL ES trên máy tính Linux), bạn nên 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 Linux có thẻ video hỗ trợ OpenGL ES 3.1 trở lên, MediaPipe có thể chạy điện toán và kết xuất GPU, đồng thời thực hiện dự đoán TFLite trên GPU.

Cách kiểm tra xem GPU trên máy tính có chạy Linux có 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ụ: ứng dụ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 đã kết nối với máy tính thông qua SSH và tìm thấy khi thăm dò thông tin GPU, bạn sẽ 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>

Chú ý đến văn bản ES 3.20 ở trên.

Bạn cần xem bản in của ES 3.1 trở lên để thực hiện dự đoán TFLite trên GPU trong MediaPipe. Theo cách thiết lập này, hãy xây dựng bằng:

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

Nếu chỉ hỗ trợ phiên bản ES 3.0 trở xuống, bạn vẫn có thể tạo các mục tiêu MediaPipe mà không cần đến khả năng dự đoán TFLite trên GPU bằng:

$ 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 để thực hiện dự đoán về GPU trên những thẻ video hỗ trợ CUDA.

Để có thể dự đoán GPU TensorFlow bằng MediaPipe, bước đầu tiên là làm theo 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.

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

Việc đặt $TF_CUDA_PATHS là cách để khai báo vị trí của thư viện CUDA. Lưu ý rằng đoạn mã sau đây 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

Để làm cho MediaPipe có được các chế độ cài đặt CUDA của TensorFlow, hãy tìm .bazelrc của TensorFlow rồi 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 như 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 tạo MediaPipe bằng GPU TensorFlow với hai cờ khác là --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

Trong khi chạy, tệp nhị phân sẽ in ra thông tin 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 dùng để dự đoán mô hình hay không.

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

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