پشتیبانی از GPU

پشتیبانی OpenGL ES

MediaPipe از OpenGL ES تا نسخه 3.2 در Android/Linux و تا ES 3.0 در iOS پشتیبانی می کند. علاوه بر این، MediaPipe از Metal در iOS نیز پشتیبانی می کند.

OpenGL ES 3.1 یا بالاتر (در سیستم‌های Android/Linux) برای اجرای ماشین‌حساب‌ها و نمودارهای استنتاج یادگیری ماشین مورد نیاز است.

پشتیبانی OpenGL ES را غیرفعال کنید

به‌طور پیش‌فرض، ساخت MediaPipe (بدون پرچم‌های ویژه بازل) تلاش می‌کند تا کتابخانه‌های OpenGL ES (و برای iOS نیز Metal) را کامپایل و پیوند دهد.

در پلتفرم هایی که OpenGL ES در دسترس نیست (همچنین به تنظیمات OpenGL ES در لینوکس دسکتاپ مراجعه کنید)، باید پشتیبانی OpenGL ES را با موارد زیر غیرفعال کنید:

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

راه اندازی OpenGL ES روی دسکتاپ لینوکس

در دسکتاپ لینوکس با کارت‌های ویدئویی که از OpenGL ES 3.1+ پشتیبانی می‌کنند، MediaPipe می‌تواند محاسبات و رندر GPU را اجرا کند و استنتاج TFLite را روی GPU انجام دهد.

برای بررسی اینکه آیا GPU دسکتاپ لینوکس شما می‌تواند 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 در بالا توجه کنید.

برای انجام استنتاج TFLite بر روی GPU در MediaPipe، باید نسخه ES 3.1 یا بالاتر را چاپ شده ببینید. با این تنظیمات، ساخت با:

$ 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 روی دسکتاپ لینوکس

چارچوب MediaPipe برای محاسبه و رندر GPU به CUDA نیاز ندارد. با این حال، MediaPipe می‌تواند با TensorFlow برای استنتاج GPU روی کارت‌های ویدیویی که از CUDA پشتیبانی می‌کنند، کار کند.

برای فعال کردن استنتاج TensorFlow GPU با MediaPipe، اولین قدم این است که مستندات TensorFlow GPU را دنبال کنید تا نرم‌افزار 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 را نیز به $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 را با GPU TensorFlow با دو پرچم دیگر --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%