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

مرحبًا بك في عالم الذكاء الاصطناعي المعتمد على البرمجيات.

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

DeepSparse هو بيئة تشغيل استدلال ذات أداء استثنائي على وحدات المعالجة المركزية (CPUs). على سبيل المثال، مقارنةً بخط أساس ONNX Runtime، يوفر DeepSparse تسريعًا بمقدار 5.8 ضعف لنموذج YOLOv5s عند التشغيل على نفس الجهاز!

YOLOv5 DeepSparse vs ONNX Runtime speed comparison chart

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

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

كيف يحقق DeepSparse أداءً بمستوى وحدات معالجة الرسومات؟

يستفيد DeepSparse من تفرق النموذج (model sparsity) لتحقيق تسريع الأداء.

تعد التفرقة (Sparsification) من خلال التقليم (pruning) والكمية (quantization) تقنية مدروسة على نطاق واسع، وتسمح بتقليل حجم الحوسبة المطلوبة لتنفيذ الشبكة بأضعاف، مع الحفاظ على دقة عالية. DeepSparse مدرك للتفرقة، مما يعني أنه يتخطى المعاملات الصفرية، مما يقلل من حجم الحوسبة في التمريرة الأمامية. وبما أن الحوسبة المتفرقة أصبحت الآن مقيدة بالذاكرة، يقوم DeepSparse بتنفيذ الشبكة بعمق، مقسمًا المشكلة إلى أعمدة موتر (Tensor Columns)، وهي شرائط عمودية من الحوسبة تتناسب مع ذاكرة التخزين المؤقت.

DeepSparse tensor columns for sparse neural network inference

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

كيف يمكنني إنشاء نسخة متفرقة من YOLOv5 تم تدريبها على بياناتي؟

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

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

استخدام 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 واجهات برمجة تطبيقات (APIs) مريحة لدمج نموذجك في تطبيق ما.

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

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

Python API

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

أنشئ 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 غير المرئية (headless) التي تتجنب تبعيات واجهة المستخدم الرسومية تمامًا:

pip install ultralytics-opencv-headless

خادم HTTP

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

قم بتشغيل الخادم باستخدام نموذج YOLOv5s المقلم والمكمم:

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

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

import json

import requests

# list of images for inference (local files on client side)
path = ["basilica.jpg"]
files = [("request", open(img, "rb")) for img in path]

# send request over HTTP to /predict/from_files endpoint
url = "http://0.0.0.0:5543/predict/from_files"
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 التعليق التوضيحي (Annotate)

يمكنك أيضًا استخدام أمر annotate لجعل المحرك يحفظ صورة مع تعليقات توضيحية على القرص. جرب --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 (Batch 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.7 ضعف مقارنة بـ 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.8 ضعف مقارنة بـ 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.8 ضعف مقارنة بـ 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.7 ضعف مقارنة بـ 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.

التعليقات