دعم وحدة معالجة الرسومات

دعم 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 على Linux Desktop)، عليك يجب إيقاف دعم OpenGL ES مع:

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

إعداد OpenGL ES على سطح المكتب الذي يعمل بنظام التشغيل Linux

يمكن تشغيل MediaPipe على سطح المكتب الذي يعمل بنظام التشغيل Linux والمزوّدة ببطاقات فيديو متوافقة مع OpenGL ES 3.1 أو الإصدارات الأحدث. تعمل وحدة معالجة الرسومات على الحوسبة والعرض وتنفيذ استنتاج TFLite على وحدة معالجة الرسومات.

للتحقّق مما إذا كانت وحدة معالجة الرسومات لسطح المكتب في 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:

إذا اتصلت بجهاز الكمبيوتر من خلال بروتوكول النقل الآمن ووجدت وقت البحث عن ستظهر لك معلومات وحدة معالجة الرسومات النتائج التالية:

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

حاوِل إعادة إنشاء اتصال بروتوكول النقل الآمن باستخدام الخيار "-X" ثم أعِد المحاولة. بالنسبة مثال:

ssh -X <user>@<host>

اطّلِع على نص ES 3.20 أعلاه.

يجب طباعة الإصدار 3.1 من معيار ES أو الإصدارات الأحدث لتتمكن من إجراء استنتاج تنسيق TFLite. على وحدة معالجة الرسومات في MediaPipe. باستخدام هذا الإعداد، يمكنك الإنشاء باستخدام:

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

في حال توفُّر الإصدار ES 3.0 أو الإصدارات الأقدم فقط، سيظل بإمكانك إنشاء أهداف MediaPipe لا تتطلب استنتاج TFLite على وحدة معالجة الرسومات من خلال:

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

دعم TensorFlow CUDA وإعدادها على سطح مكتب نظام التشغيل Linux

لا يتطلب إطار عمل MediaPipe استخدام CUDA للحوسبة والعرض من خلال وحدة معالجة الرسومات. ومع ذلك، يمكن أن يعمل MediaPipe مع TensorFlow لتنفيذ استنتاج وحدة معالجة الرسومات على بطاقات الفيديو التي تسمح باستخدام CUDA

لتفعيل استنتاج وحدة معالجة الرسومات TensorFlow باستخدام MediaPipe، عليك أولاً اتباع الـ مستندات وحدة معالجة الرسومات في 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، ابحث عن TensorFlow .bazelrc و انسخ القسم 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 من خلال علامتَين إضافيتَين --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

أثناء تشغيل البرنامج الثنائي، يطبع معلومات جهاز وحدة معالجة الرسومات:

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

يمكنك مراقبة استخدام وحدة معالجة الرسومات للتحقّق مما إذا كانت وحدة معالجة الرسومات تُستخدم في النموذج. الاستنتاج.

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

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