תמיכה ב-GPU

תמיכה ב-Open ES

MediaPipe תומך ב- OpenGL ES עד גרסה 3.2 ב-Android/Linux ועד ES 3.0 ב-iOS. נוסף על כך, MediaPipe תומך גם ב- Metal ב-iOS.

כדי להפעיל גרפים ומחשבי מסקנות ללמידת מכונה, צריך להתקין את OpenGL ES 3.1 ואילך (במערכות Android/Linux).

השבתת התמיכה ב-OpenGL ES

כברירת מחדל, יצירת MediaPipe (ללא דגלי bazel מיוחדים) מנסה להדר ולקשר אותה לספריות OpenGL ES (ועבור iOS גם Metal).

בפלטפורמות שבהן OpenGL ES לא זמין (ראו גם הגדרת OpenGL ES ב-Linux Desktop), כדאי להשבית את התמיכה ב-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 Desktop

MediaPipe framework לא מחייב CUDA עבור מחשוב ועיבוד של GPU. עם זאת, MediaPipe יכול לעבוד עם TensorFlow כדי לבצע מסקנות GPU בכרטיסי וידאו שתומכים ב-CUDA.

כדי להפעיל את ההסקה מ-TensorFlow GPU באמצעות MediaPipe, השלב הראשון הוא לפעול לפי התיעוד של TensorFlow GPU כדי להתקין את תוכנת 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 עם עוד שני דגלים --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%