YOLO Vision 2026:

نشر YOLOv5 باستخدام DeepSparse من Neural Magic#

مرحبًا بكم في الذكاء الاصطناعي المُقدَّم برمجيًا.

يشرح هذا الدليل كيفية نشر YOLOv5 باستخدام DeepSparse من Neural Magic.

DeepSparse هو بيئة تشغيل للاستدلال تتميز بأداء استثنائي على وحدات CPU. فعلى سبيل المثال، مقارنةً بخط الأساس الخاص بـ ONNX Runtime، يوفر DeepSparse تسريعًا بمقدار 5.8x لـ YOLOv5s، أثناء تشغيله على الجهاز نفسه!

YOLOv5 DeepSparse vs ONNX Runtime speed comparison chart

لأول مرة، يمكن لأحمال التعلم العميق تلبية متطلبات أداء الإنتاج دون تعقيد وتكاليف مسرّعات الأجهزة. وببساطة، يمنحك DeepSparse أداء وحدات GPU وسهولة البرمجيات:

  • عمليات النشر المرنة: شغّل باستمرار عبر السحابة ومركز البيانات والطرفية، مع أي مزود للأجهزة، من Intel إلى AMD وARM
  • قابلية التوسع اللامحدودة: وسّع رأسيًا إلى مئات النوى، أو أفقيًا باستخدام Kubernetes القياسي، أو بالاعتماد الكامل على Serverless
  • تكامل سهل: واجهات API نظيفة لدمج نموذجك في تطبيق ومراقبته في بيئة الإنتاج

كيف يحقق DeepSparse أداءً بمستوى GPU؟#

يستفيد DeepSparse من تناثر النموذج لتحقيق زيادة سرعة الأداء.

يُعدّ جعل النموذج متناثرًا من خلال التقليم والتكميم تقنية مدروسة على نطاق واسع، إذ تتيح تقليل الحجم والحوسبة اللازمين لتنفيذ الشبكة بمقدار كبير، مع الحفاظ على الدقة العالية. ويراعي DeepSparse التناثر، ما يعني أنه يتخطى المعلمات التي صُفّرت، ويقلل مقدار الحوسبة في المرور الأمامي. وبما أن الحوسبة المتناثرة أصبحت الآن مقيّدة بالذاكرة، ينفذ DeepSparse الشبكة بترتيب العمق، مقسمًا المشكلة إلى أعمدة Tensor، وهي أشرطة رأسية من الحوسبة تلائم ذاكرة التخزين المؤقت.

DeepSparse tensor columns for sparse neural network inference

تتيح الشبكات المتناثرة ذات الحوسبة المضغوطة، والمنفذة بترتيب العمق داخل ذاكرة التخزين المؤقت، لـ DeepSparse تقديم أداء بمستوى GPU على وحدات CPU!

كيف أنشئ نسخة متناثرة من YOLOv5 مدرَّبة على بياناتي؟#

يحتوي مستودع النماذج مفتوح المصدر الخاص بـ Neural Magic، SparseZoo، على نقاط تحقق متناثرة مسبقًا لكل نموذج من نماذج YOLOv5. وباستخدام SparseML، المدمج مع Ultralytics، يمكنك ضبط نقطة تحقق متناثرة بدقة وفق بياناتك باستخدام أمر CLI واحد.

اطّلع على وثائق Neural Magic الخاصة بـ YOLOv5 لمزيد من التفاصيل.

استخدام DeepSparse#

سنستعرض مثالًا لقياس أداء نسخة متناثرة من YOLOv5s ونشرها باستخدام DeepSparse.

تثبيت DeepSparse#

نفّذ الأمر التالي لتثبيت DeepSparse. نوصي باستخدام بيئة افتراضية مع Python.

pip install "deepsparse[server,yolo,onnxruntime]"

جمع ملف ONNX#

يقبل DeepSparse نموذجًا بتنسيق ONNX، يُمرَّر بإحدى الطريقتين التاليتين:

  • كائن SparseZoo التعريفي الذي يحدد ملف ONNX في SparseZoo
  • مسار محلي إلى نموذج ONNX في نظام الملفات

تستخدم الأمثلة أدناه نقاط التحقق القياسية الكثيفة ونقاط التحقق YOLOv5s المقلمة والمكمّمة، المحددة بواسطة كائنات SparseZoo التعريفية التالية:

zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

نشر نموذج#

يوفر DeepSparse واجهات API ملائمة لدمج نموذجك في تطبيق.

لتجربة أمثلة النشر أدناه، نزّل صورة نموذجية واحفظها باسم basilica.jpg باستخدام ما يلي:

wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg

واجهة Python البرمجية#

تغلف Pipelines المعالجة المسبقة ومعالجة المخرجات اللاحقة حول بيئة التشغيل، مما يوفر واجهة واضحة لإضافة DeepSparse إلى تطبيق. ويتضمن تكامل DeepSparse-Ultralytics مكوّن Pipeline جاهزًا للاستخدام يقبل الصور الخام ويُخرج مربعات الإحاطة.

أنشئ Pipeline وشغّل الاستدلال:

from deepsparse import Pipeline

# list of images in local filesystem
images = ["basilica.jpg"]

# create Pipeline
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
    task="yolo",
    model_path=model_stub,
)

# run inference on images, receive bounding boxes + classes
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)

إذا كنت تعمل في السحابة، فقد يظهر خطأ يفيد بأن OpenCV لا يستطيع العثور على libGL.so.1. يمكنك إما تثبيت المكتبة المفقودة:

apt-get install libgl1

أو استخدام حزمة Ultralytics من دون واجهة رسومية، التي تتجنب تبعيات واجهة المستخدم الرسومية بالكامل:

pip install ultralytics-opencv-headless

خادم HTTP#

يعمل DeepSparse Server فوق إطار الويب الشائع FastAPI وخادم الويب Uvicorn. وباستخدام أمر CLI واحد فقط، يمكنك إعداد نقطة نهاية لخدمة نموذج بسهولة مع DeepSparse. ويدعم Server أي Pipeline من DeepSparse، بما في ذلك اكتشاف الكائنات باستخدام YOLOv5، ما يتيح لك إرسال الصور الخام إلى نقطة النهاية واستلام مربعات الإحاطة.

شغّل Server باستخدام YOLOv5s المُقَلَّم والمكمَّم:

deepsparse.server \
  --task yolo \
  --model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

مثال على طلب باستخدام حزمة requests الخاصة بـ Python:

import json
from contextlib import ExitStack

import requests

# list of images for inference (local files on client side)
path = ["basilica.jpg"]

# send request over HTTP to /predict/from_files endpoint
url = "http://0.0.0.0:5543/predict/from_files"
with ExitStack() as stack:
    files = [("request", stack.enter_context(open(img, "rb"))) for img in path]
    resp = requests.post(url=url, files=files)

# response is returned in JSON
annotations = json.loads(resp.text)  # dictionary of annotation results
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]

واجهة CLI للتعليق التوضيحي#

يمكنك أيضًا استخدام أمر التعليق التوضيحي ليحفظ المحرك صورة مشروحة على القرص. جرّب --source 0 لإضافة تعليقات توضيحية إلى بث كاميرا الويب المباشر!

deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg

سيؤدي تشغيل الأمر أعلاه إلى إنشاء مجلد annotation-results وحفظ الصورة المشروحة بداخله.

YOLOv5 detection results with bounding boxes

قياس الأداء#

سنقارن معدل إنتاجية DeepSparse بمعدل إنتاجية ONNX Runtime على YOLOv5s، باستخدام برنامج DeepSparse النصي لقياس الأداء.

أُجريت اختبارات الأداء على مثيل AWS من نوع c6i.8xlarge (16 نواة).

مقارنة الأداء عند حجم دفعة 32#

خط أساس ONNX Runtime#

عند حجم دفعة 32، يحقق ONNX Runtime معدل 42 صورة/ثانية باستخدام YOLOv5s الكثيف القياسي:

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntime

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 41.9025

أداء DeepSparse الكثيف#

على الرغم من أن DeepSparse يقدم أفضل أداء مع النماذج المتناثرة المحسّنة، فإنه يعمل جيدًا أيضًا مع YOLOv5s الكثيف القياسي.

عند حجم دفعة 32، يحقق DeepSparse معدل 70 صورة/ثانية باستخدام YOLOv5s الكثيف القياسي، أي تحسن في الأداء بمقدار 1.7x مقارنةً بـ ORT!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 69.5546

أداء DeepSparse المتناثر#

عند تطبيق التناثر على النموذج، تكون مكاسب أداء DeepSparse مقارنةً بـ ONNX Runtime أكبر.

عند حجم دفعة 32، يحقق DeepSparse معدل 241 صورة/ثانية باستخدام YOLOv5s المُقَلَّم والمكمَّم، أي تحسن في الأداء بمقدار 5.8x مقارنةً بـ ORT!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 241.2452

مقارنة الأداء عند حجم دفعة 1#

يستطيع DeepSparse أيضًا تحقيق زيادة في السرعة مقارنةً بـ ONNX Runtime في سيناريو حجم الدفعة 1 الحساس لزمن الاستجابة.

خط أساس ONNX Runtime#

عند حجم دفعة 1، يحقق ONNX Runtime معدل 48 صورة/ثانية باستخدام YOLOv5s القياسي الكثيف.

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntime

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 48.0921

أداء DeepSparse المتناثر#

عند حجم دفعة 1، يحقق DeepSparse معدل 135 عنصرًا/ثانية باستخدام YOLOv5s المُقَلَّم والمكمَّم، أي مكسب في الأداء بمقدار 2.8x مقارنةً بـ ONNX Runtime!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 1 -nstreams 1

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 134.9468

بما أن مثيلات c6i.8xlarge تتضمن تعليمات VNNI، يمكن زيادة معدل إنتاجية DeepSparse إذا قُلّمت الأوزان في كتل من 4.

عند حجم دفعة 1، يحقق DeepSparse معدل 180 عنصرًا/ثانية باستخدام YOLOv5s المُقَلَّم والمكمَّم في كتل من 4، أي مكسب في الأداء بمقدار 3.7x مقارنةً بـ ONNX Runtime!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 179.7375

ابدأ استخدام DeepSparse#

هل تجري بحثًا أو اختبارًا؟ إن DeepSparse Community مجاني للبحث والاختبار. ابدأ من خلال الوثائق.

لمزيد من المعلومات حول نشر YOLOv5 باستخدام DeepSparse، راجع وثائق DeepSparse الخاصة بـ Neural Magic ومنشور مدونة Ultralytics حول تكامل DeepSparse.

التعليقات