نشر AMD Xilinx لـUltralytics YOLO باستخدام Vitis AI#
سيأتي قريباً دعم التصدير الأصلي من Ultralytics لأجهزة AMD Xilinx. وإلى ذلك الحين، يشرح هذا الدليل منظومة أجهزة AMD Xilinx وبرامجها، ويوضح كيفية نشر Ultralytics YOLO26 اليوم باستخدام أدوات Vitis AI من AMD، بدءاً من تصدير ONNX أو نقطة تحقق PyTorch.
تُشغّل أجهزة AMD Xilinx كثيراً من الكاميرات الصناعية وأنظمة الرؤية للسيارات والروبوتات والطائرات المسيّرة ومنتجات التصوير الطبي في العالم. وهي تجمع معالجات Arm مع المنطق القابل للبرمجة، وتضم في الأجهزة الأحدث محركات AI مخصصة، ما يتيح لشريحة واحدة التقاط الفيديو ومعالجته مسبقاً وتشغيل الكشف عن الكائنات والاستجابة للنتائج مع زمن استدلال منخفض ويمكن التنبؤ به.
يشرح هذا الدليل ماهية كل عائلة من أجهزة AMD Xilinx، وكيفية تشغيل AI عليها، والعوامل التي يدعمها كل مسرّع من أجل Ultralytics YOLO، كما يعرض سير العمل خطوة بخطوة لنشر نماذج YOLO على أجهزة Zynq UltraScale+ وKria وVersal.
ما هي AMD Xilinx؟#
ابتكرت Xilinx مجال مصفوفات البوابات المنطقية القابلة للبرمجة ميدانياً (FPGA) في ثمانينيات القرن الماضي، وأصبحت مورداً رائداً لـأنظمة SoC المتكيفة وFPGAs. أكملت AMD استحواذها على Xilinx في فبراير 2022، وتُباع خطوط المنتجات الآن تحت علامة AMD التجارية باسم AMD Zynq وAMD Kria وAMD Versal وAMD Vitis.
يشير الاسمان إلى المنتجات نفسها. تسوّقها AMD باسم «أنظمة SoC المتكيفة وFPGAs»، لكن المهندسين ما زالوا يستخدمون اسم «Xilinx» على نطاق واسع. تحتفظ أرقام القطع بالبادئة XC (على سبيل المثال xczu7ev)، وما زال مستودع Vitis AI الأقدم وصور Docker متاحين تحت الاسم Xilinx على GitHub وDocker Hub. يستخدم هذا الدليل تسمية «AMD Xilinx» لتتمكن من العثور عليه بأي من الاسمين.
المصطلحات والمفاهيم الأساسية#
يستخدم النشر على AMD Xilinx مصطلحات خاصة به. يشرح الجدول أدناه جميع المصطلحات الواردة في هذا الدليل.
| المصطلح | ما المقصود به |
|---|---|
| FPGA | مصفوفة بوابات منطقية قابلة للبرمجة ميدانياً: شريحة تُهيّأ دوائرها المنطقية الرقمية بعد التصنيع بتحميل تصميم يُسمى تدفق البتات. ويمكنها تنفيذ عتاد مخصص مثل مسارات الفيديو أو مسرّعات الشبكات العصبية. |
| المنطق القابل للبرمجة (PL) | نسيج FPGA داخل نظام AMD Xilinx SoC. في أجهزة Zynq وKria، يُبنى مسرّع AI ضمن PL. |
| نظام المعالجة (PS) | أنوية CPU الصلبة من Arm ووحدات التحكم في الذاكرة والأجهزة الطرفية في نظام SoC. يشغّل Linux وتطبيقك وأي طبقات من النموذج يتعذر على المسرّع تنفيذها. |
| نظام SoC متكيف / MPSoC | نظام على شريحة يجمع نظام معالجة مع منطق قابل للبرمجة، ويضم أيضاً محركات AI في كثير من أجهزة Versal. يشير MPSoC إلى نظام متعدد المعالجات على شريحة. |
| محرك AI (AIE، AIE-ML، AIE-MLv2) | مصفوفات من معالجات متجهية مدمجة في العتاد في كثير من أجهزة Versal، ومنها سلسلة Versal AI Edge التي يتناولها هذا الدليل، وهي مصممة للتعلم الآلي ومعالجة الإشارات. |
| DPU | وحدة معالجة التعلم العميق: مسرّع الشبكات العصبية INT8 من AMD، يُوفّر كملكية فكرية IP مدمجة في PL (على سبيل المثال DPUCZDX8G في أجهزة Zynq UltraScale+ وKria). وتعبر الأحجام مثل B512 إلى B4096 عن ذروة العمليات لكل دورة ساعة. |
| NPU / NPU IP | وحدة معالجة الشبكات العصبية: مسرّع الاستدلال من الجيل الحالي لدى AMD، ويحل محل DPU في إصدارات Vitis AI الحديثة. تصف AMD ملكية NPU الفكرية بأنها مسرّع برمجي يجمع محركات AI مع المنطق القابل للبرمجة، ولذلك يحتاج أيضاً إلى تصميم عتاد مطابق. راجع مدخل مسرد NPU. |
| Vitis AI | سلسلة أدوات AMD لنشر الشبكات العصبية على أجهزة AMD Xilinx. وتشمل التكميم والترجمة البرمجية وبيئات التشغيل والأمثلة وبيئات Docker. |
| AMD Quark | مكتبة AMD الحالية لـتكميم النماذج، وتستخدمها آلية العمل على Versal AI Edge Gen 2 لتحويل نموذج FP32 بتنسيق ONNX إلى نموذج INT8. |
| التكميم وPTQ وQAT | تحويل الأوزان والتنشيطات من FP32 إلى INT8. يستخدم التكميم بعد التدريب (PTQ) صور المعايرة. يعمل التدريب الواعي بالتكميم (QAT) على ضبط النموذج بدقة لاستعادة الدقة. |
| صور المعايرة | مجموعة صغيرة وممثّلة من الصور تمر عبر النموذج أثناء PTQ لاختيار مقياس INT8 لكل موتر. |
| BF16 والدقة المختلطة | BFloat16 تنسيق فاصلة عائمة بدقة 16 بت يحافظ على نطاق FP32. تستخدم الدقة المختلطة INT8 لمعظم الشبكة وBF16 للطبقات الحساسة. |
| XIR | التمثيل الوسيط لـXilinx: تنسيق الرسم البياني الذي ينتجه مترجم DPU وتقرأه بيئة التشغيل. |
.xmodel | رسم بياني XIR متسلسل. يكتب المكمّم .xmodel مكمّماً، ثم يحوّله مترجم DPU إلى .xmodel مترجم يتضمن تعليمات DPU وأوزاناً مكمّمة وأي رسوم فرعية لوحدة CPU. يتطلب النموذج المترجم إعداد DPU المطابق. |
arch.json / بصمة DPU | الملف الذي يصف إعداداً محدداً لـDPU. يحتاج إليه مترجم DPU، ولن يعمل .xmodel المترجم لبصمة معينة على بصمة أخرى. |
| لقطة | دليل النموذج المترجم الذي تنتجه آلية عمل NPU على Versal AI Edge (VEK280). ويرتبط بمتغير واحد من NPU IP. |
.rai | ملف النموذج المترجم الذي تنتجه آلية عمل NPU على Versal AI Edge Gen 2. |
| VART / VART-ML | مكتبات Vitis AI Runtime التي تحمّل النماذج المترجمة وتشغّلها على اللوحة، مع واجهات API للغتين C++ وPython. |
| ONNX Runtime Vitis AI EP | VitisAIExecutionProvider الخاص بـONNX Runtime، والذي يترجم نماذج ONNX ويشغّلها على وحدات AMD NPU. |
| الرجوع إلى CPU / تقسيم الرسم البياني | عندما يتعذر على المسرّع تشغيل أحد العوامل، يقسّم المترجم النموذج عادةً إلى رسوم فرعية للمسرّع وCPU، ويضيف كل تقسيم عملية نقل بيانات قد تهيمن على زمن الاستجابة. وفي بعض الحالات، تفرض عوامل معينة تشغيل النموذج بأكمله على CPU أو تؤدي إلى فشل الترجمة. |
عائلات أجهزة AMD Xilinx للذكاء الاصطناعي الطرفي#
تنقسم أجهزة AMD Xilinx المخصصة للذكاء الاصطناعي الطرفي إلى ثلاث عائلات. تستخدم Zynq وKria وحدة DPU في المنطق القابل للبرمجة، بينما تستخدم أجهزة Versal AI Edge التي يتناولها هذا الدليل وحدة NPU على محركات AI.
| العائلة | ماهيتها | CPU التطبيق | مسرّع AI | أمثلة على اللوحات |
|---|---|---|---|---|
| Zynq UltraScale+ MPSoC | معالجات Arm ومنطق FPGA على شريحة واحدة، بأحجام تتراوح من ZU1 إلى ZU19 | Arm Cortex-A53 ثنائي أو رباعي النوى | DPU مدمجة في المنطق القابل للبرمجة | ZCU104، وZCU102، ولوحات مخصصة |
| وحدة Kria K26 على شريحة | وحدة جاهزة للإنتاج مبنية حول Zynq UltraScale+ MPSoC | Arm Cortex-A53 رباعي النوى | DPU مدمجة في المنطق القابل للبرمجة | مجموعة KV260 Vision AI Starter Kit، ومجموعة KR260 Robotics Starter Kit |
| سلسلة Versal AI Edge | أنظمة SoC متكيفة؛ تشغّل مكونات AIE-ML مثل VE2302 وVE2802 وحدة NPU | Arm Cortex-A72 ثنائي النواة | وحدة NPU على محركات AIE-ML AI والمنطق القابل للبرمجة PL | VEK280 |
| سلسلة Versal AI Edge Gen 2 | نظام SoC متكيف من الجيل التالي مع محركات AI من نوع AIE-MLv2 | حتى ثمانية معالجات Arm Cortex-A78AE | وحدة NPU على محركات AIE-MLv2 AI والمنطق القابل للبرمجة PL | VEK385 |
Zynq UltraScale+ MPSoC#
تجمع كل شريحة Zynq UltraScale+ نظام معالجة Arm، يضم أنوية Cortex-A53 ثنائية (CG) أو رباعية (EG وEV) النوى وأنوية Cortex-R5F للوقت الحقيقي، مع منطق FPGA. وتضيف أجهزة EV برنامج ترميز فيديو H.264/H.265 مدمجاً في العتاد. لتشغيل الشبكات العصبية، يدمج المصممون وحدة DPU في المنطق إلى جانب مسارات الكاميرا والفيديو. وفي الأجهزة الصغيرة، تتنافس DPU على المساحة مع بقية التصميم.
وحدات Kria على شريحة#
تضم وحدة Kria K26 نظام Zynq UltraScale+ MPSoC والذاكرة والطاقة في وحدة جاهزة للإنتاج، ما يجنبك تصميم المعالج والذاكرة والنظام الفرعي للطاقة بنفسك. وتُركّب الوحدة على لوحة ناقلة، إما لوحة مجموعة بدء التشغيل أو تصميمك الخاص. وهي تشغّل مجموعة KV260 Vision AI Starter Kit للكاميرات الذكية ومجموعة KR260 Robotics Starter Kit لـالروبوتات. وبما أن K26 مبنية على Zynq UltraScale+، فهي تستخدم آلية عمل DPU نفسها. وتشمل مجموعة منتجات Kria وحدات أخرى أيضاً، لذا تحقّق من المعالج المستخدم في وحدتك قبل اختيار آلية العمل.
أنظمة Versal SoC المتكيفة#
Versal هي عائلة أنظمة SoC المتكيفة من AMD. وتضيف سلسلتا AI Edge وAI Core فيها محركات AI مدمجة في العتاد إلى جانب أنوية Arm والمنطق القابل للبرمجة، في حين لا تضم بعض سلاسل Versal الأخرى محركات AI. تعمل ملكية NPU الفكرية من AMD على محركات AI والمنطق القابل للبرمجة معاً، وتستهدف Vitis AI مكونات AIE-ML من سلسلة AI Edge، مثل VE2302 وVE2802. وتُعد سلسلة Versal AI Edge (مجموعة التقييم VEK280) وسلسلة Versal AI Edge Gen 2 (مجموعة التقييم VEK385) الهدفين الحاليين من AMD للذكاء الاصطناعي الطرفي ومحور إصدارات Vitis AI الحالية.
كيفية تشغيل AI على أجهزة AMD Xilinx: DPU مقابل NPU#
تتبع معظم عمليات نشر AI على أجهزة AMD Xilinx النمط نفسه. يشغّل المسرّع الطبقات التي يدعمها، ويشغّل CPU Arm المعالجة المسبقة والمعالجة اللاحقة وأي طبقات يتعذر على المسرّع تنفيذها، بينما تنسّق بيئة تشغيل على اللوحة بينهما.
graph LR
A[Camera / video input]:::start --> B[Arm CPU<br>Linux, preprocessing,<br>post-processing]:::proc
B <--> C[AI accelerator<br>DPU in programmable logic<br>or NPU on AI Engines + PL]:::out
B --> D[Application<br>alerts, control, display]:::start
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef out fill:#9C27B0,color:#fffأصدرت AMD جيلين من المسرّعات، لكل منهما سلسلة أدوات وملف نموذج مترجم خاصان به. يتناول هذا الدليل Vitis AI 3.5 لوحدة DPU وVitis AI 6.3 لوحدة NPU؛ راجع وثائق AMD الحالية للاطلاع على الإصدارات الأحدث.
| آلية العمل | العتاد | سلسلة الأدوات | المكمّم | المُخرَج المترجم | بيئة التشغيل على اللوحة | الحالة |
|---|---|---|---|---|---|---|
| DPU | Zynq UltraScale+ وKria | Vitis AI 3.5 (Docker) | vai_q_pytorch | .xmodel | VART | مترجم ثابت ومستودع نماذج وملكية DPU الفكرية |
| NPU (Versal AI Edge) | VEK280 وأجزاء Versal AI Edge الأخرى | Vitis AI 6.3 (Docker) | مدمج في تدفق اللقطات | لقطة | VART-ML | نشط |
| NPU (Versal AI Edge Gen 2) | VEK385 وأجزاء Gen 2 الأخرى | Vitis AI 6.3 (Docker) | AMD Quark | .rai | ONNX Runtime Vitis AI EP أو VART-ML | نشط |
يُعد Vitis AI 3.5 الإصدار الأخير الذي يتضمن تحديثات لمترجم DPU ومجموعة النماذج. وتحافظ الإصدارات اللاحقة في مستودع Xilinx/Vitis-AI على المترجم ومجموعة النماذج وIP الخاص بـ Zynq UltraScale+ DPU دون تغيير، مع تحديث بيئة التشغيل والتوافق مع إصدارات AMD الأحدث من الأدوات (راجع ملاحظات إصدار Vitis AI 5.0)، كما توضح وثائق Vitis AI الحالية من AMD أن NPU هو البديل لبنية DPU المهملة. ويمكن مواصلة شحن منتجات Zynq UltraScale+ وKria الحالية باستخدام DPU، لكن دعم المشغّلات فيه لن يتوسع؛ لذلك تتطلب البنى الأحدث للنماذج التعديلات الموضحة في توافق نماذج YOLO.
تحتوي معالجات AMD Ryzen AI في الحواسيب أيضًا على NPU، لكنها تستخدم حزمة Ryzen AI Software المنفصلة بدلًا من تدفقات Vitis AI المضمنة الواردة في هذا الدليل. وبالنسبة إلى وحدات GPU من AMD Instinct وRadeon، راجع تكامل AMD GPU.
ما تدفق Vitis AI الذي أحتاج إليه؟#
اختر التدفق بحسب الجهاز الموجود على لوحتك:
graph TD
A[Start: which AMD device<br>is on your board?]:::start --> B{Device family?}:::decide
B -->|Zynq UltraScale+ MPSoC<br>or Kria K26| C[DPU flow<br>Vitis AI 3.5]:::proc
B -->|Versal AI Edge<br>VEK280| D[NPU snapshot flow<br>Vitis AI 6.3]:::proc
B -->|Versal AI Edge Gen 2<br>VEK385| E[NPU Quark flow<br>Vitis AI 6.3]:::proc
C --> F[Train YOLO with Hard-Swish<br>then compile to .xmodel]:::out
D --> G[Run your model on calibration<br>images to capture a snapshot]:::out
E --> H[Quantize ONNX with Quark<br>then compile to .rai]:::out
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fffتوافق نماذج YOLO والمشغّلات المدعومة#
لا يسرّع المسرّع إلا المشغّلات التي ينفذها عتاديًا. عندما يحتوي النموذج على مشغّل غير مدعوم، يوجّه المترجم عادةً ذلك الجزء من الشبكة إلى Arm CPU، وتضيف كل عملية انتقال ذهابًا وإيابًا بين المسرّع ووحدة CPU زمن استجابة. ولا يمكن تقسيم بعض المشغّلات: ففي NPU الخاص بـ Versal AI Edge Gen 2، تدرج AMD مشغّلات مثل NonZero وNonMaxSuppression التي قد تجبر النموذج بأكمله على العمل على CPU. ويُعد دعم المشغّلات العامل الأهم في تحديد مدى جودة أداء نموذج YOLO على عتاد AMD Xilinx.
graph LR
subgraph S1 [Stock YOLO26 on the DPU]
A1[Conv]:::out --> A2[SiLU<br>CPU]:::error --> A3[Conv]:::out --> A4[SiLU<br>CPU]:::error --> A5[...]:::proc
end
subgraph S2 [Hard-Swish YOLO26 on the DPU]
B1[Backbone<br>Conv + Hard-Swish<br>DPU]:::out --> B2[C2PSA attention<br>CPU]:::error --> B3[Neck<br>DPU]:::out --> B4[C3k2 attention<br>CPU]:::error --> B5[Detect head<br>DPU]:::out --> B6[Sigmoid and<br>post-processing<br>CPU]:::error
end
classDef proc fill:#2196F3,color:#fff
classDef out fill:#9C27B0,color:#fff
classDef error fill:#F44336,color:#fffيوضح الجدول مكان تشغيل كل مشغّل في نموذج YOLO26. يحتوي تصدير ONNX عادي لنموذج YOLO26n على 87 عملية تنشيط SiLU، يُصدّر كل منها بوصفها Sigmoid وMul، إضافة إلى 4 مشغّلات MatMul و2 من مشغّلات Softmax ضمن كتلتي الانتباه فيه: كتلة C2PSA في نهاية العمود الفقري (الطبقة 10)، وكتلة C3k2 المفعّل فيها الانتباه التي تنتج خرج P5 (الطبقة 22).
| المشغّل | موضع ظهوره في YOLO | DPU (Zynq UltraScale+ وKria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|---|
| الالتفاف + تطبيع الدفعات | كل كتلة Conv | ✅ | ✅ |
| تنشيط SiLU | كل كتلة Conv (التنشيط الافتراضي) | ❌ يعمل على CPU؛ استبدله بـ Hard-Swish | ✅ |
| Hard-Swish وReLU وReLU6 وLeakyReLU | التنشيطات الاختيارية المحددة في YAML النموذج | ✅ مدمج في الالتفاف | ✅ |
| Sigmoid | درجات الفئات في رأس الكشف | ❌ يعمل على CPU (عادةً كجزء من المعالجة اللاحقة) | ✅ |
| MatMul بين عمليتي تنشيط | كتل الانتباه (C2PSA؛ YOLO26 C3k2) | ❌ يعمل على CPU | ✅ |
| Softmax | كتل الانتباه؛ DFL في YOLOv8 وYOLO11 | ❌ يعمل على CPU | ✅ |
| إعادة التشكيل، تبديل المحاور | كتل الانتباه | ⚠️ يُدمج متى أمكن، وإلا فيعمل على CPU | ✅ |
| تقسيم، اقتطاع | كتل C3k2 وC2f | ⚠️ يُحوّل إلى شرائح؛ تحقّق من تقرير المترجم | ✅ |
| تغيير الحجم (رفع دقة بأقرب جار) | رفع دقة العنق | ✅ | ✅ |
| MaxPool وConcat وAdd | كتلة SPPF ودمج السمات | ✅ | ✅ |
| TopK وGatherElements | رأس YOLO26 الخالي من NMS (nms=False) | ❌ يعمل على CPU | ⚠️ تقسيم على CPU في المضيف Arm |
| NonMaxSuppression | فقط عند التصدير باستخدام nms=True | ❌ يعمل على CPU | ❌ قد يجبر النموذج على العمل على CPU |
المصادر: المشغّلات المدعومة في AMD UG1414، ودعم مشغّلات PyTorch، وقوائم المشغّلات المدعومة وتقسيم CPU وغير المدعومة في Versal AI Edge Gen 2. يعتمد الدعم أيضًا على إعداد DPU وأنماط الرسم البياني؛ لذا تحقّق دائمًا من تقرير التقسيم الصادر عن المترجم.
يزيل YOLO26 خسارة البؤرة التوزيعية (DFL)، ولذلك لا تحتاج مخرجات الصناديق فيه إلى فك ترميز softmax، بخلاف YOLO11 وYOLOv8. كما يضيف كتلة انتباه ثانية مقارنةً بـ YOLO11؛ لذا قارن تقارير المترجم الخاصة بالهدف واختبارات الأداء على الجهاز قبل اختيار نموذج. تحافظ عمليات التصدير التي لا يُضبط فيها nms على الرأس one-to-many، وتحتاج إلى NMS على CPU مثل نماذج YOLO الأخرى. صدّر باستخدام nms=False لاستخدام رأس YOLO26 one-to-one الخالي من NMS بدلًا من ذلك، إذ يستبدل NMS بعملية اختيار خفيفة لـ top-k تعمل على CPU.
جهّز YOLO26 للعمل على DPU باستخدام Hard-Swish#
لا يدمج DPU في عمليات الالتفاف إلا ReLU وReLU6 وLeakyReLU وHard-Swish وHard-Sigmoid. وHard-Swish تقريب ملائم للعتاد لـ SiLU، ما يجعله البديل الطبيعي. تقبل ملفات YAML الخاصة بنماذج Ultralytics مفتاح activation لتغيير التنشيط الافتراضي لكتل Conv (دليل إعداد YAML للنماذج).
انسخ yolo26.yaml إلى yolo26-hswish.yaml وأضف سطرًا واحدًا ضمن المعلمات:
# Parameters
nc: 80 # number of classes
activation: nn.Hardswish() # default Conv activation, DPU-native
end2end: True # whether to use end-to-end modeثم أنشئ النموذج، وانقل أوزان YOLO26 المدرّبة مسبقًا، وأجرِ الضبط الدقيق على مجموعة بياناتك:
from ultralytics import YOLO
# # أنشئ YOLO26n بتنشيطات Hard-Swish؛ يشير الحرف 'n' في الاسم إلى المقياس nano
model = YOLO("yolo26n-hswish.yaml").load("yolo26n.pt") # # انقل الأوزان المدرّبة مسبقًا
# # اضبط النموذج بدقة ليتكيف مع Hard-Swish
model.train(data="coco8.yaml", epochs=100, imgsz=640)ليس للتنشيطات أوزان، لذا تُنقل جميع الأوزان المدرّبة مسبقًا. يحتوي رسم ONNX المُصدّر بعد ذلك على 87 مشغّل HardSwish ولا يحتوي على SiLU. استبدل coco8.yaml بـمجموعة بياناتك، وقارن الدقة بنموذج SiLU باستخدام وضع Val قبل النشر.
- الاستبدال أثناء التكميم: اضبط
"convert_silu_to_hswish": trueفي إعداد JSON الخاص بمكمّم PyTorch ضمن Vitis AI 3.5 لاستبدال SiLU أثناء التكميم. يوفر ذلك جولة تدريب، لكنه غالبًا ما يقلل الدقة؛ ويمكن للضبط الدقيق السريع أو QAT من AMD استعادة جزء منها. راجع دليل إعداد vai_q_pytorch. - LeakyReLU: ينفذ DPU LeakyReLU بميل سالب ثابت قدره 26/256 (نحو 0.1). إذا استخدمت LeakyReLU، فدرّب باستخدام
activation: nn.LeakyReLU(0.1015625)لتتطابق قيم الميل في التدريب والنشر.
التعامل مع كتل الانتباه على DPU#
يطبق YOLO26 الانتباه عند أدنى دقة (شبكة 20×20 عند إدخال بحجم 640) في موضعين: كتلة C2PSA في الطبقة 10، وكتلة C3k2 المفعّل فيها الانتباه في الطبقة 22. يحتوي YOLO11 على كتلة C2PSA واحدة. على DPU، تعمل مشغّلات MatMul وSoftmax الخاصة بها على CPU، ما يقسم النموذج إلى رسوم فرعية متناوبة بين DPU وCPU. لديك ثلاثة خيارات:
-
اقبل كتل CPU. عندئذٍ يحتوي
.xmodelالمُجمّع على رسوم فرعية لوحدة CPU؛ لذا شغّله باستخدام Graph Runner من AMD، الذي ينفذ الرسوم الفرعية لـ DPU وCPU معًا عندما يتوفر تنفيذ على CPU لكل مشغّل؛ وإلا فعليك تنفيذ المشغّلات الناقصة وتسجيلها. حساب الانتباه صغير عند 20×20، لكن كل عملية نقل إضافية بين DPU وCPU تزيد زمن الاستجابة؛ لذا قِس الأداء على لوحتك. -
استخدم YAML خاليًا من الانتباه. في ملف YAML الخاص بـ Hard-Swish، استبدل طبقة C2PSA بـ
nn.Identityحتى تظل فهارس الطبقات التي تستخدمهاConcatوDetectصالحة، وعطّل الانتباه في الطبقة 22:backbone: # ... layers 0-9 unchanged - [-1, 1, nn.Identity, []] # 10 C2PSA removed; keeps later layer indices valid head: # ... layers 11-21 unchanged - [-1, 1, C3k2, [1024, True, 0.5, False]] # 22 (P5/32-large), attention disabled - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)لن يحتوي رسم ONNX المُصدّر عندئذٍ على مشغّلات MatMul أو Softmax. ولن تعود أوزان الانتباه صالحة (تُنقل 624 من أصل 666 وزنًا في YOLO26n)، لذا أطل مدة الضبط الدقيق وقارن الدقة باستخدام وضع Val.
-
استخدم نموذجًا خاليًا من الانتباه مثل YOLOv8، الذي استخدمته AMD في أمثلة DPU الخاصة بها.
في Versal AI Edge Gen 2، تُدرج مشغّلات الانتباه ضمن المشغّلات المدعومة على NPU؛ لذا لا تكون هذه التغييرات ضرورية عادةً. أكّد موضع التنفيذ في تقرير المترجم، لأن AMD تشير إلى أن المشغّلات المدعومة قد تنتقل مع ذلك إلى CPU بسبب قيود الإعداد أو الذاكرة.
لمحة سريعة عن توافق النماذج#
| النموذج | DPU (Zynq UltraScale+ وKria) | NPU (Versal AI Edge Gen 2) |
|---|---|---|
| YOLO26 | التدريب باستخدام Hard-Swish؛ تتحول كتلتا الانتباه إلى رسوم فرعية لـ CPU؛ لا يستخدم DFL | من المتوقع أن يعمل دون تغييرات؛ تحقّق من ذلك على لوحتك |
| YOLO11 | التدريب باستخدام Hard-Swish؛ تعمل C2PSA وSoftmax الخاصة بـ DFL على CPU | من المتوقع أن يعمل دون تغييرات؛ تحقّق من ذلك على لوحتك |
| YOLOv8 | التدريب باستخدام Hard-Swish؛ تعمل Softmax الخاصة بـ DFL على CPU | درس AMD حول YOLOv8m (Vitis AI 6.3، وVEK385، وINT8 مع ذيل BF16): يُظهر تقرير المترجم 1,181 مشغّلًا (99.915%) و99.994% من GOPs على NPU، دون تغييرات على النموذج |
انشر YOLO26 على AMD Xilinx اليوم#
إلى أن يتوفر التصدير الأصلي، يتبع النشر أربع خطوات:
graph LR
A[1. Train or fine-tune<br>Ultralytics YOLO]:::start --> B{Target?}:::decide
B -->|Versal NPU| C[2. Export to ONNX<br>model.export]:::proc
B -->|Zynq or Kria DPU| D[2. Keep the trained<br>PyTorch checkpoint]:::proc
C --> E[3. Quantize and compile<br>Vitis AI 6.3 Docker]:::proc
D --> F[3. Quantize and compile<br>Vitis AI 3.5 Docker]:::proc
E --> G[4. Run on the board<br>VART-ML or ONNX Runtime]:::out
F --> H[4. Run on the board<br>VART]:::out
G -.->|accuracy check| A
H -.->|accuracy check| A
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fffالخطوة 1: تدريب النموذج أو ضبطه بدقة#
درّب باستخدام بياناتك عبر وضع Train أو على منصة Ultralytics. بالنسبة إلى أهداف DPU، ابدأ من ملف YAML الخاص بـ Hard-Swish. سجّل خط أساس باستخدام وضع Val لتتمكن لاحقًا من قياس أثر التكميم في الدقة.
الخطوة 2: التصدير إلى ONNX لأهداف NPU#
يُعد ONNX مدخلًا مشتركًا لتدفقات NPU من AMD. يكمّم تدفق DPU نقطة تحقق PyTorch المدرّبة مباشرةً داخل صورة Docker لـ Vitis AI 3.5، لذا يمكن لمستخدمي DPU تخطي هذه الخطوة. صدّر بحجم دفعة ثابت يساوي 1 وبإصدار opset تدعمه AMD؛ إذ يستخدم درس AMD حول YOLOv8m لـ Versal AI Edge Gen 2 الإصدار 17 من opset.
from ultralytics import YOLO
# # حمّل النموذج الذي درّبته في الخطوة 1
model = YOLO("runs/detect/train/weights/best.pt")
# # صدّر إلى ONNX بشكل ثابت ليستخدمه مترجم AMD
model.export(format="onnx", opset=17, imgsz=640) # # يُنشئ الملف 'best.onnx' بجوار 'best.pt'راجع تكامل ONNX ووسيطات التصدير للاطلاع على جميع الخيارات. إذا لم يُضبط nms، فنفّذ NMS على CPU بعد الاستدلال؛ أما في YOLO26، فيحدد nms=False الرأس الخالي من NMS بدلًا من ذلك. لا تضمن NMS باستخدام nms=True، لأن AMD تدرج NonMaxSuppression ضمن المشغّلات التي قد تجبر النموذج بأكمله على العمل على CPU.
تتضمن صور Docker من AMD إصدارها الخاص من ONNX Runtime مع Vitis AI Execution Provider. يتحقق Ultralytics من وجود ONNX Runtime أثناء التصدير، وقد يثبّت الحزمة القياسية بدلًا منه. صدّر على أي جهاز وانسخ الملف .onnx إلى الحاوية، أو اضبط YOLO_AUTOINSTALL=false عند تشغيل Ultralytics داخل صورة Docker من AMD.
الخطوة 3: التكميم والتجميع باستخدام Vitis AI#
تستخدم مسارات العمل أدناه صور Docker من AMD على مضيف Linux بمعمارية x86-64. لا تحتاج إلى اللوحة في هذه الخطوة. اختر علامة التبويب الخاصة بجهازك:
- شغّل صورة Docker لـ Vitis AI 6.3 من AMD والمخصصة لـ Versal AI Edge Gen 2. راجع متطلبات النظام.
- كمّم نموذج ONNX إلى INT8 باستخدام AMD Quark وإعداد
VINT8. يتطلب الحد الأدنى لإعداد AMD أيضًاInt32Bias=Falseوenable_npu_cnn=TrueوDedicatedQDQPair=TrueوQuantizeAllOpTypes=True. يقرأ Quark بيانات المعايرة عبر قارئ بيانات تكتبه أنت؛ لذا طبّق المعالجة المسبقة نفسها المستخدمة في الاستدلال: تغيير الحجم بأسلوب letterbox إلى حجم التصدير، وترتيب قنوات RGB، والتحجيم إلى المجال 0–1، وتنسيق NCHW، على صور ممثلة من مجموعة بياناتك. - استبعد الرسم البياني الفرعي للمعالجة اللاحقة من التكميم. يحذّر البرنامج التعليمي لـ YOLOv8m من AMD من أن تكميمه يؤدي إلى حالات كشف فائتة. في مثال YOLOv8m هذا، يشغّل المترجم بعد ذلك الجزء الختامي بدقة BF16 على NPU؛ وتظل العمليات غير المدعومة في الجزء الختامي، مثل اختيار top-k في YOLO26، تعمل على CPU.
- اختر بيئة التشغيل الخاصة باللوحة قبل التجميع. يعمل التجميع القياسي مع ONNX Runtime، الذي يشغّل العمليات غير المتوافقة مع NPU، مثل اختيار top-k في YOLO26، على CPU نفسه، كما يعمل مع VART-ML فقط عندما تُنفَّذ جميع العمليات على NPU. لتشغيل نموذج يُبقي عمليات CPU ضمن VART-ML، أضف تمريرات تقسيم CPU من AMD إلى
vitisai_config.json. لا يمكن تشغيل هذه العناصر عبر ONNX Runtime. - أجرِ التجميع بإنشاء جلسة ONNX Runtime باستخدام
VitisAIExecutionProviderوvitisai_config.jsonيحدّد الجهاز المستهدف. يكتب التجميع ملف.raiفي دليل ذاكرة التخزين المؤقت. راجع تجميع نموذج.
لتجاوز التكميم، جمّع نموذج ONNX بدقة FP32 مباشرةً، وسيحوّله المترجم إلى BF16. يتطلب التجميع ترخيصًا لمترجم AMD AI Engine؛ راجع صفحة الترخيص لدى AMD.
الخطوة 4: التشغيل والتحقق على اللوحة#
جهّز اللوحة أولًا. يجب أن تشغّل تصميمًا عتاديًا وصورة Linux يتضمنان إعداد المسرّع الذي أُجري التجميع له، بالإضافة إلى إصدار Vitis AI runtime المطابق. راجع أدلة الإعداد لدى AMD لأهداف Zynq UltraScale+ وKria DPU وVersal AI Edge (VEK280) وVersal AI Edge Gen 2 (VEK385).
ثم انسخ العناصر التي تحتاج إليها بيئة التشغيل:
| آلية العمل | العناصر المطلوب نسخها إلى اللوحة | بيئة التشغيل على اللوحة |
|---|---|---|
| DPU (Zynq UltraScale+ وKria) | .xmodel مُجمّع | VART؛ Graph Runner للرسوم البيانية الفرعية التي تعمل على CPU |
| NPU (Versal AI Edge، VEK280) | دليل اللقطة | VART-ML |
| NPU (Versal AI Edge Gen 2)، ORT | نموذج ONNX بدقة FP32 أو نموذج ONNX مكمّم مستخدم في التجميع، وvitisai_config.json، ودليل ذاكرة التخزين المؤقت المُجمّع | ONNX Runtime مع Vitis AI EP |
| NPU (Versal AI Edge Gen 2)، VART-ML | ملف .rai (مع تمريرات تقسيم CPU إذا كانت أي عملية تعمل على CPU)، بالإضافة إلى إعداد تشغيل VART-ML | VART-ML |
في تدفقات عمل NPU، يفكّ الرسم البياني المُصدّر بتنسيق ONNX ترميز الصناديق ويطبّق دالة sigmoid لدرجات الفئات مسبقًا، لذا لا يفعل المضيف سوى تفسير المخرجات:
nmsغير معيّن: تُخرج نماذج الكشف موترًا(1, 4 + nc, anchors)يتألف منxywhصندوقًا ودرجات لكل فئة. اختر الفئة الأفضل لكل مرساة، وحوّل الصناديق إلى إحداثيات الزوايا، وصفِّ النتائج حسب مستوى الثقة وشغّل NMS؛ تنفّذ دالة Ultralyticsnon_max_suppressionكل هذه الخطوات.nms=False(YOLO26): يُخرج النموذج موترًا(1, max_det, 6)من[x1, y1, x2, y2, score, class]صفوف، ولا يتطلب سوى تطبيق عتبة ثقة.
في الحالتين، أعد تحجيم الصناديق من الصورة المدخلة المحاطة بحواشٍ إلى أبعاد الصورة الأصلية. تحتاج الرسوم البيانية المقطوعة قبل خطوة فك الترميز فقط إلى فك ترميز الصناديق على المضيف. على DPU، تحتفظ مخازن VART بقيم INT8 ذات فاصلة ثابتة: استعلم عن شكل كل موتر ومقياس fix_point، وكمِّم المدخلات وأزل التكميم من المخرجات قبل تطبيق الخطوات أعلاه. يعيد Graph Runner مخرجات الرسم البياني الكامل، بينما يعيد مشغّل DPU فقط مخرجات الرسوم البيانية الفرعية الوسيطة لـ DPU، التي يجب أن يُكمل برنامجك حسابها. التنسيقات أعلاه هي تنسيقات ONNX (عرض CPU): يستخدم VART-ML افتراضيًا عروض الموترات العتادية، التي قد تختلف في الشكل ونوع البيانات وتخطيط الذاكرة؛ لذا اضبط أنواع موترات الإدخال والإخراج للمشغّل على عروض CPU أو حوّل التنسيق العتادي بنفسك (راجع نظرة عامة على بنية VART-ML لدى AMD).
قارن الدقة على الجهاز بخط الأساس FP32 من الخطوة 1 باستخدام مجموعة التحقق الخاصة بك ومقاييس الأداء نفسها، مثل mAP. توضّح نتائج YOLOv8m المنشورة من AMD على VEK385 كلفة الدقة المترتبة على النشر باستخدام INT8:
| إعداد YOLOv8m | العتاد | mAP50-95 (COCO) |
|---|---|---|
| ONNX بدقة FP32 | CPU المضيف | 49.95 |
| BF16 | NPU في VEK385 | 50.29 |
| VINT8 مكمّم، والجزء الختامي بدقة FP32 | CPU المضيف | 48.75 |
| VINT8 مع جزء ختامي بدقة BF16 | NPU في VEK385 | 48.38 |
المصدر: البرنامج التعليمي لـ YOLOv8m على Versal AI Edge Gen 2 من AMD، ويتضمن أيضًا متوسط زمن استدلال قدره 10.69 ms عبر 100 تشغيل لـ VART عند dp_size=1.
يتطلب شحن YOLO من Ultralytics ضمن منتج AMD Xilinx تجاري الامتثال لـ ترخيص AGPL-3.0 أو الحصول على ترخيص Ultralytics للمؤسسات.
تطبيقات واقعية#
تشيع أجهزة AMD Xilinx في كل مكان يتطلب فيه تشغيل رؤية الذكاء الاصطناعي في الوقت الفعلي، باستهلاك منخفض للطاقة وبالقرب من المستشعر:
- السلامة الصناعية وسلامة مواقع الإنشاء: اكتشف الأشخاص والآلات بالقرب من المعدات الثقيلة، وراقب مناطق العمل باستخدام كشف الكائنات وعدّ الكائنات.
- الرؤية للسيارات والمركبات المخصصة للطرق الوعرة: شغّل الإدراك المعتمد على الكاميرات على مكوّنات مؤهلة للاستخدام في السيارات، دعمًا لـالمركبات ذاتية القيادة وأنظمة مساعدة السائق.
- الكاميرات الذكية وتحليلات الفيديو: اجمع بين التقاط الفيديو وترميزه والاستدلال باستخدام YOLO على شريحة واحدة لأنظمة الأمن وتحليلات الفيديو.
- الرؤية الآلية وفحص الجودة: اقرن التقاط الصور عالي السرعة المعتمد على FPGA مع تجزئة المثيلات أو التصنيف باستخدام YOLO للكشف عن العيوب على خط الإنتاج.
- الروبوتات والطائرات المسيّرة: استخدم وحدات Kria KR260 أو Versal لتقدير الوضعية وكشف الكائنات الموجّهة والملاحة بزمن استجابة حتمي.
الملخص#
تشغّل أجهزة AMD Xilinx نماذج YOLO عبر جيلين من المسرّعات. يستخدم DPU في Zynq UltraScale+ وKria تدفق عمل Vitis AI 3.5 المجمّد وينتج ملفات .xmodel. ويتطلب دوال تنشيط أصلية لـ DPU مثل Hard-Swish، كما يشغّل عمليات الانتباه على CPU. يستخدم NPU في Versal AI Edge وVersal AI Edge Gen 2 إصدارات Vitis AI الحالية. يدعم NPU من الجيل الثاني SiLU وعمليات الانتباه، ويشغّل مثال YOLOv8m من AMD على VEK385 بالكامل تقريبًا على NPU، بينما يعتمد دعم العمليات على NPU الأقدم في VEK280 على إصدار Vitis AI والدقة.
سيُتاح قريبًا التصدير الأصلي من Ultralytics لأجهزة AMD Xilinx. وحتى ذلك الحين، درّب باستخدام Ultralytics، وصدّر إلى ONNX لأهداف Versal NPU أو احتفظ بنقطة تحقق PyTorch لأهداف DPU، ثم أجرِ التجميع باستخدام Vitis AI كما هو موضح أعلاه. للاطلاع على أهداف النشر الأخرى، راجع دليل خيارات نشر النماذج وأفضل ممارسات النشر وعمليات تكامل المسرّعات مثل Hailo وRockchip RKNN وAxelera.
الأسئلة الشائعة#
نعم. أكملت AMD استحواذها على Xilinx في فبراير 2022، وتُباع منتجات Xilinx الآن بوصفها أنظمة SoC تكيفية وFPGA من AMD: AMD Zynq وAMD Kria وAMD Versal وAMD Vitis. لا يزال المهندسون يستخدمون اسم Xilinx على نطاق واسع، وتحافظ أرقام القطع على البادئة
XC.ليس بعد. سيُتاح قريبًا التصدير الأصلي من Ultralytics لأجهزة AMD Xilinx. حاليًا، صدّر إلى ONNX باستخدام
model.export(format="onnx")لأهداف Versal NPU، أو كمِّم نقطة تحقق PyTorch المدرّبة باستخدامvai_q_pytorchلأهداف Zynq UltraScale+ وKria DPU، ثم أجرِ التجميع باستخدام أدوات Vitis AI من AMD كما هو موضح في انشر YOLO26 على AMD Xilinx اليوم.DPU (وحدة معالجة التعلم العميق) هو مسرّع INT8 الأقدم من AMD. وهو مدمج في المنطق القابل للبرمجة بأجهزة Zynq UltraScale+ وKria، ويُجمّع باستخدام Vitis AI 3.5، وينتج ملفات
.xmodel. وقد حلّ NPU محلّه في إصدارات Vitis AI الحالية. وفي أجهزة Versal AI Edge، يجمع NPU بين AI Engines مُعزّزة والمنطق القابل للبرمجة، ويدعم INT8 وBF16 والدقة المختلطة، كما يدعم مزيدًا من العمليات، ومنها SiLU والانتباه على Versal AI Edge Gen 2.ملف
.xmodelهو رسم بياني XIR مُسلسَل تستخدمه سلسلة أدوات AMD DPU. يكتب المُكمِّم.xmodelمكمّمًا، ثم يحوّله المترجمvai_c_xirإلى.xmodelمُجمّع يتضمن تسلسل تعليمات DPU وأوزان INT8 مكمّمة وأي رسوم بيانية فرعية يجب تشغيلها على CPU. يستهدف الملف المُجمّع إعداد DPU محددًا، موصوفًا ببصمةarch.json، ويعمل على اللوحة عبر Vitis AI Runtime (VART)، أو عبر Graph Runner عندما يتضمن رسومًا بيانية فرعية تعمل على CPU.لا. يسرّع DPU دوال التنشيط ReLU وReLU6 وLeakyReLU وHard-Swish وHard-Sigmoid فقط، ويشغّل Sigmoid وSoftmax وMatMul بين دالتي تنشيط على CPU. درّب YOLO باستخدام
activation: nn.Hardswish()في ملف YAML الخاص بالنموذج لإبقاء عمليات الالتفاف على DPU، وراجع التعامل مع كتل الانتباه على DPU للاطلاع على خيارات الانتباه. تدعم وحدات NPU في Versal AI Edge Gen 2 دوال SiLU وSoftmax وMatMul محليًا.تستخدم KV260 نظام Zynq UltraScale+ MPSoC مزودًا بـ DPU، لذا اتبع تدفق عمل DPU. درّب نموذج YOLO26 يستخدم Hard-Swish، وكمّمه باستخدام
vai_q_pytorchفي صورة Docker الخاصة بـ Vitis AI 3.5، واجمعه باستخدامvai_c_xirمعarch.jsonالخاص بـ KV260، ثم شغّل.xmodelالناتج على اللوحة باستخدام VART، أو Graph Runner إذا كان يتضمن رسومًا بيانية فرعية تعمل على CPU.لا. يجري التكميم والتجميع في صور Docker الخاصة بـ Vitis AI من AMD على مضيف Linux بمعمارية x86-64. لا تحتاج إلى اللوحة إلا لتشغيل النموذج المُجمّع وقياس زمن الاستجابة والدقة على الجهاز.
يمكن تشغيل أي مهمة إذا أمكن تجميع عملياتها لمسرّعك. تعمل العمليات غير المدعومة عادةً على CPU، لكن بعضها قد يجبر النموذج بأكمله على العمل على CPU أو يؤدي إلى فشل التجميع. يُعد كشف الكائنات عبء العمل الأكثر شيوعًا، وهو ما تستخدمه أمثلة AMD نفسها. وبالنسبة إلى التجزئة وتقدير الوضعية والمهام الأخرى، تحقّق من تقرير تقسيم المترجم للتأكد من أن الطبقات الثقيلة تعمل على المسرّع.