รองรับ GPU

การรองรับ OpenGL ES

MediaPipe รองรับ OpenGL ES ถึงเวอร์ชัน 3.2 ใน Android/Linux และสูงสุด ES 3.0 ใน iOS นอกจากนี้ MediaPipe ยังรองรับเพลงเมทัลบน iOS ด้วย

ต้องใช้ OpenGL ES 3.1 ขึ้นไป (ในระบบ Android/Linux) สำหรับการเรียกใช้เครื่องคำนวณและกราฟการอนุมานแมชชีนเลิร์นนิง

ปิดใช้การรองรับ OpenGL ES

โดยค่าเริ่มต้น การสร้าง MediaPipe (ที่ไม่มีแฟล็ก Bazel) แบบพิเศษ) จะพยายามคอมไพล์และลิงก์กับไลบรารี OpenGL ES (และสำหรับ iOS ก็มี Metal ด้วย)

ในแพลตฟอร์มที่ OpenGL ES ไม่พร้อมใช้งาน (ดูเพิ่มเติมที่ การตั้งค่า OpenGL ES ในเดสก์ท็อป Linux) คุณควรปิดใช้การรองรับ OpenGL ES ด้วยสิ่งต่อไปนี้

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

การตั้งค่า OpenGL ES ในเดสก์ท็อป Linux

บนเดสก์ท็อป Linux ที่มีการ์ดวิดีโอที่รองรับ OpenGL ES 3.1 ขึ้นไป MediaPipe สามารถเรียกใช้การประมวลผลและแสดงผล GPU รวมถึงทำการอนุมาน TFLite บน GPU ได้

หากต้องการตรวจสอบว่า GPU ของเดสก์ท็อป Linux เรียกใช้ MediaPipe ที่มี OpenGL ES ได้หรือไม่ ให้ทำดังนี้

$ 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

ลองสร้างการเชื่อมต่อ SSH อีกครั้งด้วยตัวเลือก -X แล้วลองอีกครั้ง เช่น

ssh -X <user>@<host>

สังเกตข้อความ ES 3.20 ด้านบน

คุณต้องเห็น ES 3.1 ขึ้นไปที่พิมพ์เพื่อทำการอนุมาน TFLite บน GPU ใน MediaPipe ด้วยการตั้งค่านี้ ให้สร้างด้วย

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

หากรองรับเพียง ES 3.0 หรือต่ำกว่า คุณยังสามารถสร้างเป้าหมาย MediaPipe ที่ไม่ต้องใช้การอนุมาน TFLite บน GPU ด้วยสิ่งต่อไปนี้

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

การรองรับและการตั้งค่า TensorFlow CUDA ในเดสก์ท็อปของ Linux

เฟรมเวิร์ก MediaPipe ไม่จำเป็นต้องใช้ CUDA สำหรับการประมวลและการแสดงผลของ GPU อย่างไรก็ตาม MediaPipe สามารถทำงานร่วมกับ TensorFlow เพื่อทำการอนุมาน GPU บนการ์ดวิดีโอที่รองรับ CUDA ได้

หากต้องการเปิดใช้การอนุมาน TensorFlow GPU ด้วย MediaPipe ขั้นตอนแรกคือทำตามเอกสารประกอบเกี่ยวกับ GPU ของ TensorFlow เพื่อติดตั้งซอฟต์แวร์ 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 โปรดทราบว่าข้อมูลโค้ดต่อไปนี้จะเพิ่ม /usr/lib/x86_64-linux-gnu และ /usr/include ลงใน $TF_CUDA_PATHS สำหรับ cudablas และ libcudnn ด้วย

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

หากต้องการให้ MediaPipe รับการตั้งค่า CUDA ของ TensorFlow ให้ค้นหา .bazelrc ของ TensorFlow แล้วคัดลอกส่วน build:using_cuda และ build:cuda ลงในไฟล์ .bazelrc ของ MediaPipe ตัวอย่างเช่น ณ วันที่ 23 เมษายน 2020 การตั้งค่า CUDA ของ TensorFlow มีดังนี้

# 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

ขั้นตอนสุดท้าย สร้าง MediaPipe ด้วย TensorFlow GPU ที่มี Flag --config=cuda และ --spawn_strategy=local อีก 2 รายการ เช่น

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