انتقل إلى المحتوى الرئيسي انتقل إلى الملاحة انتقل إلى التذييل

GPU

منح مستودع إمكانية الوصول إلى وحدة معالجة رسومات عبر إذن جهاز CDI: عرض وحدات GPU في الجهاز، ومنح الأجهزة وسحبها لكل مستودع، وحجز بطاقة حجزًا حصريًا، والعمل على WSL.

وحدات GPU

لا يصل المستودع إلى وحدة معالجة الرسومات إلا عبر إذن جهاز. ينشر الجهاز وحدات GPU التي يملكها بوصفها أجهزة مسمّاة، ويمنح المشغّل المستودع الأسماء التي يحق له استخدامها. المستودع الذي لا إذن له لا يحصل على GPU، والفرع يبدأ بلا إذن حتى لو كان للمستودع الأصل إذن.

تتبع الأسماء واجهة Container Device Interface (CDI)، وهي المعيار الذي يستخدمه Docker 25 وما بعده لوصف الجهاز وكل ما تحتاجه الحاوية لاستخدامه. يأخذ اسم CDI الصيغة <vendor>/<class>=<device>، مثل nvidia.com/gpu=all.

ما هو إذن CDI

يشغّل كل مستودع خادم Docker الخاص به خلف بوابة API ترفض كل طريقة لتوصيل العتاد بحاوية، ولذلك لا يمكن الوصول إلى GPU بخيارات docker run. الإذن هو الباب الوحيد. فهو يسجّل اسم CDI دقيقًا لمستودع واحد، ثم تقبل البوابة طلب حاوية يسمّي ذلك الجهاز وحده.

  • يسري الإذن منذ طلب Docker التالي، دون إعادة تشغيل الخادم.
  • يسمّي الإذن جهازًا واحدًا بالضبط. منح nvidia.com/gpu=all يقبل nvidia.com/gpu=all ولا يقبل nvidia.com/gpu=0. ولإعطاء المستودع بطاقة واحدة يُمنح اسم تلك البطاقة.
  • يُفحص الإذن عند كتابته مقابل مواصفات الأجهزة في الجهاز، فيُرفض الاسم المكتوب خطأً بدل أن يُسجَّل.
  • يعود الإذن إلى المستودع الذي مُنح له. تحتاج الفروع والنسخ إلى إذن خاص بها.

إعداد الجهاز

يكتشف rdc machine setup <machine> وحدات GPU في الجهاز ويسجّل النتيجة في /etc/rediacc/gpu/inventory.json. وعند وجود GPU من NVIDIA يثبّت الإعداد أيضًا NVIDIA Container Toolkit وينشئ مواصفة CDI في /etc/cdi/nvidia.yaml. أما الجهاز الذي لا يملك GPU فيحصل على ملف جرد قوائمه فارغة.

يتحكم الخيار --install-nvidia-toolkit في renet setup بتثبيت الأداة:

القيمةالسلوك
autoتُثبَّت الأداة عند وجود GPU من NVIDIA. وهذه هي القيمة الافتراضية.
trueتُثبَّت الأداة في كل الأحوال.
falseتُتخطى الأداة ولا تُنشأ مواصفة NVIDIA.

لا يضبط الإعداد أي بيئة تشغيل للحاويات، لأن runc وحده هو المقبول. تُستخدم الأداة للمواصفة فقط، وتُعاد المواصفة عند كل إعداد لتواكب تغيّرات برنامج التشغيل.

نوعان من الأجهزة يأتيان من Rediacc نفسه ولا يحتاجان إلى مكونات مساحة المستخدم من الشركة المصنّعة، لأنهما يربطان عُقد الأجهزة فقط:

النوعالأجهزةالمصدر
rediacc.io/driجهاز لكل عقدة رسم، مثل rediacc.io/dri=renderD128/dev/dri/renderD<N>
rediacc.io/amdgpu<N> لكل بطاقة AMD، وall/dev/kfd مع عقدة الرسم الخاصة بالبطاقة

تأتي أجهزة NVIDIA من مواصفة الأداة: nvidia.com/gpu=all واسم لكل بطاقة. تحتاج حوسبة AMD إلى مساحة مستخدم ROCm داخل صورة الحاوية، لأن الإعداد لا يثبّت ROCm.

عرض وحدات GPU

rdc machine gpu list <machine>
rdc machine gpu list <machine> -o json

يعرض الجدول كل GPU باسمه وإصدار برنامج التشغيل والذاكرة، والمنصة (أصلية أو WSL)، وعمر الجرد، وكل اسم جهاز CDI يمكن منحه. يطبع -o json الجرد كما هو مسجَّل في الجهاز. وتُقرأ الأذونات القائمة حاليًا من الجهاز مباشرة.

المنح والسحب

rdc repo gpu grant <repo-ref> --device nvidia.com/gpu=all
rdc repo gpu revoke <repo-ref> --device nvidia.com/gpu=all

<repo-ref> هو اسم مستودع، مع جهاز اختياري، مثل gpu-a@wsl-gpu. يمكن تكرار الأمرين بقيم --device مختلفة. بعد المنح تبدأ الحاوية في ذلك المستودع ومعها الجهاز:

docker run --rm --device nvidia.com/gpu=all ubuntu:24.04 nvidia-smi -L

تُرفض الحاوية نفسها في مستودع بلا إذن، وتسمّي الرسالة الإذن الناقص.

الأذونات الحصرية

rdc repo gpu grant <repo-ref> --device nvidia.com/gpu=0 --exclusive

يحجز الإذن الحصري جهازًا لمستودع واحد. يُرفض إذا كان مستودع آخر يحمل الاسم نفسه، وما دام قائمًا يُرفض منح ذلك الاسم لأي مستودع آخر. يجري الفحص عند المنح، تحت قفل يشمل كل الأذونات في الجهاز.

الإذن الحصري حجز وليس مجدوِلًا. تظل حاويتان في المستودع المأذون نفسه تتشاركان البطاقة.

الصيغ المرفوضة

تبقى كل طريقة أخرى للوصول إلى GPU مرفوضة، سواء وُجد إذن أم لا. وتحلّ صيغة CDI محل كل واحدة منها.

المرفوضالبديل
docker run --gpus alldocker run --device nvidia.com/gpu=all
runtime: nvidia في Composedevices: [nvidia.com/gpu=all]
deploy.resources.reservations.devices في Composedevices: [nvidia.com/gpu=all]
gpus: all في Composedevices: [nvidia.com/gpu=all]
أجهزة /dev/dri أو /dev/kfd الخام، أو bind تحت /devrediacc.io/dri=renderD128 أو rediacc.io/amd=gpu0
قواعد cgroup للأجهزةإذن CDI للجهاز

تبدو خدمة Compose التي تستخدم جهازًا مأذونًا هكذا:

services:
  inference:
    image: ubuntu:24.04
    command: nvidia-smi -L
    devices:
      - nvidia.com/gpu=all

إضافة مجموعة مثل video أو render عبر group_add مقبولة لكنها لا تمنح شيئًا، لأن المجموعة لا تفتح الوصول إلى جهاز لم يُمنح للمستودع.

WSL

في WSL2 يوفّر برنامج تشغيل Windows وحدة GPU عبر /dev/dxg والمكتبات الموجودة تحت /usr/lib/wsl/lib. يبلّغ الجهاز عن منصته بالقيمة wsl، وينشئ الإعداد مواصفة NVIDIA بصيغة WSL:

nvidia-ctk cdi generate --mode=wsl --output=/etc/cdi/nvidia.yaml

يقع برنامج التشغيل في جانب Windows، ولذلك يُلتقط أي تحديث له في المرة التالية التي يُشغَّل فيها rdc machine setup. تعمل أوامر المنح والعرض والسحب كما تعمل في جهاز أصلي.

NVIDIA الأصلي

في جهاز NVIDIA أصلي تعيد خدمة nvidia-cdi-refresh التابعة للأداة إنشاء المواصفة بعد التثبيت وتغيّر برنامج التشغيل والإقلاع. يوجّهها الإعداد إلى /etc/cdi/nvidia.yaml، وهو دليل المواصفات الوحيد الذي يقرأه خادم Docker الخاص بالمستودع. وعند تشغيل nvidia-persistenced يُجعل مقبسه مرئيًا لخوادم المستودعات، لأن المواصفة تركّبه داخل الحاويات.