وحدات 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/amd | gpu<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 all | docker run --device nvidia.com/gpu=all |
runtime: nvidia في Compose | devices: [nvidia.com/gpu=all] |
deploy.resources.reservations.devices في Compose | devices: [nvidia.com/gpu=all] |
gpus: all في Compose | devices: [nvidia.com/gpu=all] |
أجهزة /dev/dri أو /dev/kfd الخام، أو bind تحت /dev | rediacc.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 يُجعل مقبسه مرئيًا لخوادم المستودعات، لأن المواصفة تركّبه داخل الحاويات.