اختر هدف النشر
حدّد بيئة تشغيل وتنسيق تصدير انطلاقًا من الجهاز وميزانية زمن الاستجابة وأسطول الأجهزة، ثم تحقّق من الاختيار على الجهاز.

يستغرق YOLO26n نفسه 38.9 مللي ثانية لكل صورة على CPU باستخدام ONNX Runtime، و1.7 مللي ثانية على وحدة معالجة رسومية T4 باستخدام TensorRT في اختبارات YOLO26 المعيارية. اختر بيئة التشغيل الخاطئة، فإما أن تدفع تكلفة أجهزة تفوق حاجتك بكثير، أو تنشر كاميرات لا تستطيع مواكبة العمل. يحوّل هذا الدرس الاختيار إلى قرار مدته عشر دقائق، ويمكنك تبريره بأرقام قِيست على الجهاز نفسه.
عملي
ابدأ من الجهاز#
تُحدَّد بيئة التشغيل وفقًا لمكان إجراء الاستدلال، لا للعادة. اتبع شجرة القرار من أعلاها وتوقف عند أول خيار ينطبق:
ترتبط كل بيئة تشغيل بقيمة format= واحدة في وضع التصدير:
| الهدف | بيئة التشغيل | format= | انتبه إلى |
|---|---|---|---|
| وحدة معالجة رسومية من NVIDIA، أو Jetson | TensorRT | engine | لا يعمل المحرك إلا على عائلة وحدات معالجة الرسوميات وإصدار TensorRT اللذين أنشآه |
| وحدة CPU أو iGPU أو NPU من Intel | OpenVINO | openvino | مُحسّن لأجهزة Intel؛ قِس الأداء قبل استخدامه على أجهزة أخرى |
| أي وحدة CPU أو GPU | ONNX Runtime | onnx | اختر موفّر التنفيذ صراحةً |
| iPhone أو iPad أو Mac | CoreML | coreml | يُجرى التصدير على macOS أو Linux، وليس Windows |
| Android أو جهاز مضمّن | LiteRT | litert | يتطلب INT8 بيانات معايرة data |
| وحدة NPU من Snapdragon | Qualcomm QNN | qnn | للتصدير الكمّي فقط؛ مرّر هدف Hexagon على النحو name |
| Raspberry Pi، ووحدة معالجة مركزية ARM | NCNN | ncnn | أسرع تنسيق في دليل Raspberry Pi |
| المتصفح | ONNX Runtime Web | onnx | التزم بنماذج n أو s |
على منصات Apple الحديثة، يمكنك أيضًا التصدير بتنسيق Core AI الأحدث من Apple (format=coreai، ويُصدَّر على macOS 26+ باستخدام Apple silicon أو Linux بمعمارية x86-64). هل أنت جديد على التصدير؟ يشرح درس التصدير للنشر الأساسيات.
إذا كنت تفضّل عدم تشغيل خوادم الاستدلال مطلقًا، تنشر Ultralytics Platform النموذج بوصفه نقطة نهاية مخصصة في واحدة من 42 منطقة، وتُظهر علامة تبويب Deployments في ملفك الشخصي مواقع تشغيل كل منها:

يتناول نشر نقطة نهاية واستدعاؤها هذا المسار. أما بقية هذه الدورة فتتناول تشغيلك للنموذج بنفسك.
حوّل هدف FPS إلى ميزانية بالمللي ثانية#
«الوقت الفعلي» ليس متطلبًا؛ بل المطلوب رقم محدد. احسبه قبل إجراء أي اختبار للأداء:
| الانتقال | مثال: 20 FPS لكل كاميرا |
|---|---|
| ميزانية الإطار = 1000 ÷ FPS | 50 ms |
| اطرح زمن فك الترميز (RTSP، بدقة 1080p) | نحو 10 ms |
| اطرح زمن التتبع والعدّ والمصارف | نحو 5 ms |
| اطرح هامشًا احتياطيًا بنسبة 20% لمواجهة الارتفاعات | 10 ms |
| المتبقي للنموذج | نحو 25–30 ms |
ثم طبّق قواعد اتخاذ القرار التالية:
- إذا تجاوز YOLO26n ميزانية النموذج على وحدة المعالجة المركزية للجهاز، فانتقل إلى مسرّع (GPU أو iGPU أو NPU)، أو قلّص
imgszقبل أي شيء آخر؛ تسرد معايير YOLO26 زمن YOLO26n البالغ 38.9 ms على ONNX باستخدام CPU و1.7 ms على T4 باستخدام TensorRT. - إذا كان على جهاز واحد خدمة عدة كاميرات، فاقسم ميزانية النموذج على عدد الكاميرات.
- إذا ضم الأسطول أكثر من بضعة أنواع من الأجهزة، ففضّل بيئات التشغيل التي لا تتطلب إصدارات مخصّصة لكل جهاز، أو خطط لإنشاء إصدار لكل فئة من الأجهزة.
- إذا كان رمز الاستدعاء مكتوبًا بـ Swift أو Kotlin أو C++، فتحقق من توفر SDK لبيئة التشغيل باللغة المعنية قبل الالتزام بها.
اختبر أداء الخيارات المرشحة على الجهاز#
تُعدّ المواصفات الفنية واختبارات الأداء التي أجراها الآخرون نقطة بداية. لكن القرار يُتخذ على العتاد الذي ستنشر عليه، وبناءً على الإطارات البطيئة لا المتوسط: فبيئة التشغيل السريعة عند القيمة الوسيطة، لكنها تتوقف عند إطار واحد من كل عشرين، ستظل تُسقط إطارات. يصدّر هذا البرنامج النصي كل خيار مرشح، ويقيس زمن 100 عملية استدلال على إطار حقيقي، ثم يقيّم كل خيار وفق النسبة المئوية الخامسة والتسعين (p95):
from ultralytics import YOLO
from ultralytics.utils.downloads import safe_download
BUDGET_MS = 30 # the model's share of a 20 FPS frame budget
CANDIDATES = ("onnx", "openvino") # runtimes the decision tree allows on this machine
if __name__ == "__main__": # exports and inference can start worker processes on macOS and Windows
frame = str(safe_download("https://ultralytics.com/images/bus.jpg")) # use a real frame from your camera
for fmt in CANDIDATES:
model = YOLO(YOLO("yolo26n.pt").export(format=fmt))
for _ in range(5): # warm up: the first calls include one-time setup
model(frame, verbose=False)
runs = sorted(model(frame, verbose=False)[0].speed["inference"] for _ in range(100))
p50, p95 = runs[49], runs[94]
verdict = "meets" if p95 <= BUDGET_MS else "misses"
print(f"{fmt:9s} p50 {p50:5.1f} ms p95 {p95:5.1f} ms {verdict} the {BUDGET_MS} ms budget")على حاسوب Apple silicon المحمول المستخدم لاختبار هذه الدورة، مع مشاركة مهام أخرى لوحدة المعالجة المركزية:
onnx p50 30.0 ms p95 46.4 ms misses the 30 ms budget
openvino p50 22.8 ms p95 113.5 ms misses the 30 ms budgetاقرأها سطرًا سطرًا:
speed["inference"]هو الزمن الذي استغرقه النموذج لمعالجة ذلك الإطار، دون فك الترميز أو الرسم، ما يتيح مقارنة بيئات التشغيل على نحو عادل.- يتفوق OpenVINO في القيمة الوسيطة، لكنه يتراجع في p95 بفارق يزيد على الضعف. لو اعتمدت على المتوسطات، لشحنت بيئة التشغيل التي تتوقف في أوقات الازدحام؛ أما عند التقييم وفق p95، فـ ONNX Runtime هو الخيار الأكثر استقرارًا على هذا الجهاز.
- كلاهما يتجاوز الميزانية، لذا فالخطوة التالية هنا هي استخدام
imgszأصغر، أو مسرّع، أو عدد أقل من الكاميرات لكل جهاز، وليس تجربة بيئة تشغيل أخرى لوحدة المعالجة المركزية.
لإجراء مقارنة سريعة للدقة والسرعة عبر التنسيقات، يصدّر وضع Benchmark كل تنسيق ويُجري التحقق منه وقياس زمنه:
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 format=onnxاحذف format= لاختبار كل تنسيق يدعمه الجهاز. لا يضم COCO8 سوى أربع صور للتحقق، لذا تعامل مع عمود mAP فيه بوصفه اختبارًا سريعًا لسلامة المسار، واستخدم ملف YAML لمجموعة بياناتك لاتخاذ قرارات الدقة.
مواطن الخلل#
العَرَض: حقق النموذج 60 FPS على محطة العمل، لكنه يسقط الإطارات على الجهاز. الحل: اختبر الأداء على عتاد النشر أو على أقرب جهاز متاح، وشغّله تحت الحمل المتوقع في بيئة الإنتاج (عمليات أخرى وكاميرات أخرى).
العَرَض: يتعذر تحميل .engine المبني على GPU في مركز بيانات على Jetson Orin. الحل: ابنِه على الجهاز المستهدف وقت التثبيت (يستغرق بناء YOLO26n FP16 نحو 5 دقائق على Jetson Orin، وفقًا لوثائق تصدير Platform)، أو احتفظ ببناء لكل فئة أجهزة وإصدار TensorRT، واشحن .pt أو .onnx كي يتمكن أي جهاز من إعادة البناء.
يقيس yolo benchmark الأداء عند imgsz الذي تحدده. إذا كان التشغيل في بيئة الإنتاج عند imgsz=1280، فاختبر الأداء عند 1280: يزداد الحساب مع عدد البكسلات، لذا تقلّل أرقام 640 من تقدير أداء نشر 1280 بنحو أربعة أضعاف.
للأجهزة الطرفية أربعة أسئلة إضافية#
تشرح أدلة Raspberry Pi وNVIDIA Jetson وDeepStream على Jetson الأهداف الشائعة بالتفصيل. قبل اعتماد جهاز طرفي، أجب عن الأسئلة التالية:
- بدء التشغيل البارد: أين يُبنى محرك TensorRT، ومن ينتظر اكتمال بنائه؟
- الطاقة والحرارة: هل يستطيع الغلاف الحفاظ على تشغيل النموذج بأقصى FPS طوال اليوم؟
- الذاكرة: هل تتوفر مساحة لمخازن الإطارات وحالة المتعقّب بجوار النموذج؟ يقلّص INT8 حصة النموذج إلى النصف.
- التحديثات: كيف يصل إصدار جديد من
best.ptإلى 1,000 جهاز؟ تحافظ صورة Docker على اتساق الأجهزة.
عرض الحل
موجز تطبيقي لمشروع توسيع نطاق تحليلات تجارة التجزئة:
| السؤال | الإجابة |
|---|---|
| الجهاز | 40 حاسوبًا صغيرًا داخل المتاجر مزودة بمعالجات Intel Core Ultra، من دون GPU منفصلة |
| FPS والكاميرات | 10 FPS لكل كاميرا، وكاميرتان لكل جهاز |
| الجهة المستدعية | خدمة Python على Linux |
| الأسطول | 40 جهازًا، تُحدَّث باستخدام صورة Docker |
الميزانية: 1000 ÷ 10 = 100 ms لكل إطار؛ وبعد طرح نحو 15 ms لفك الترميز والتتبع وهامش احتياطي بنسبة 20%، يتبقى نحو 65 ms، موزعة على كاميرتين، أي نحو 30 ms لكل عملية استدلال. تشير شجرة القرار إلى OpenVINO (لوحدة معالجة Intel المركزية)، مع ONNX Runtime خيارًا احتياطيًا؛ لذا، على أحد أجهزة المتجر:
python pick_runtime.py # CANDIDATES = ("onnx", "openvino"), BUDGET_MS = 30يُظهر اختبار أداء وحدة المعالجة المركزية Core Ultra 7 155H في وثائق OpenVINO أن YOLO26n يستغرق 13.4 ms باستخدام OpenVINO FP32؛ لذا يُفترض أن يلائم yolo26n الميزانية بهامش مريح. إذا كان p95 على الجهاز الفعلي أقل من 30 ms أثناء تشغيل مساري الكاميرتين، فاعتمد OpenVINO. وإذا تجاوز ذلك، فجرّب GPU المدمجة في الجهاز باستخدام device="intel:gpu" قبل شراء عتاد جديد.