نشر YOLOv5 باستخدام DeepSparse من Neural Magic#
مرحبًا بك في عالم الذكاء الاصطناعي المعتمد على البرمجيات.
يشرح هذا الدليل كيفية نشر YOLOv5 باستخدام DeepSparse من Neural Magic.
DeepSparse هو محرك استدلال (inference runtime) يقدم أداءً استثنائيًا على وحدات المعالجة المركزية (CPUs). على سبيل المثال، مقارنةً بأساسيات ONNX Runtime، يوفر DeepSparse تسريعًا بمقدار 5.8 ضعف لنموذج YOLOv5s عند التشغيل على نفس الجهاز!
لأول مرة، يمكن لأحمال عمل التعلم العميق الخاصة بك تلبية متطلبات الأداء للإنتاج دون تعقيدات وتكاليف مسرعات الأجهزة. باختصار، يمنحك DeepSparse أداء وحدات معالجة الرسوميات وبساطة البرمجيات:
- عمليات نشر مرنة: تشغيل متسق عبر السحابة، ومراكز البيانات، والحافة مع أي مزود أجهزة من Intel إلى AMD إلى ARM
- قابلية توسع لا نهائية: توسع رأسيًا إلى مئات النوى، أو أفقيًا باستخدام Kubernetes القياسي، أو مع تجريد كامل باستخدام تقنيات Serverless
- تكامل سهل: واجهات برمجة تطبيقات (APIs) نظيفة لدمج نموذجك في تطبيق ومراقبته أثناء التشغيل
كيف يحقق DeepSparse أداءً بمستوى وحدات معالجة الرسومات (GPUs)؟#
يستفيد DeepSparse من تفرُّد النموذج (model sparsity) لتحقيق سرعته الفائقة.
يُعد التناثر (Sparsification) من خلال التقليم (pruning) والكمّ الكمي (quantization) تقنية مدروسة على نطاق واسع، مما يسمح بتقخيمات بحجم الحجم والحوسبة اللازمة لتنفيذ الشبكة مع الحفاظ على دقة عالية. يعتبر DeepSparse واعياً بالتناثر، مما يعني أنه يتخطى المعلمات الصفرية، مما يقلل من حجم الحوسبة في تمرير أمامي. وبما أن الحوسبة المتناثرة مرتبطة الآن بالذاكرة، فإن DeepSparse ينفذ الشبكة عمودياً، مقسماً المشكلة إلى أعمدة Tensor، وهي أشرطة رأسية للحوسبة تتناسب مع الذاكرة المخبأة.
الشبكات المتفرقة ذات الحسابات المضغوطة، التي يتم تنفيذها عمقيًا في ذاكرة التخزين المؤقت، تسمح لـ DeepSparse بتقديم أداء بمستوى GPU على وحدات المعالجة المركزية (CPUs)!
كيف يمكنني إنشاء نسخة متفرقة من YOLOv5 تم تدريبها على بياناتي؟#
يحتوي مستودع النماذج مفتوح المصدر التابع لـ Neural Magic، SparseZoo، على نقاط تفتيش متناثرة مسبقاً لكل نموذج YOLOv5. باستخدام SparseML، المدمج مع Ultralytics، يمكنك ضبط نقطة تفتيش متناثرة على بياناتك باستخدام أمر CLI واحد.
راجع وثائق YOLOv5 الخاصة بـ Neural Magic لمزيد من التفاصيل.
استخدام DeepSparse#
سنسير خلال مثال لقياس أداء ونشر نسخة متفرقة من YOLOv5s باستخدام DeepSparse.
تثبيت DeepSparse#
قم بتشغيل الأمر التالي لتثبيت DeepSparse. نوصي باستخدام بيئة افتراضية مع Python.
pip install "deepsparse[server,yolo,onnxruntime]"جمع ملف ONNX#
يقبل DeepSparse نموذجًا بتنسيق ONNX، يتم تمريره إما كـ:
- رابط (stub) من 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 واجهات برمجة تطبيقات مريحة لدمج نموذجك في تطبيق ما.
لتجربة أمثلة النشر أدناه، قم بسحب صورة نموذجية واحفظها باسم basilica.jpg باستخدام ما يلي:
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpgPython API#
يقوم Pipelines بتغليف المعالجة المسبقة ومعالجة المخرجات بعد التشغيل حول وقت التشغيل، مما يوفر واجهة نظيفة لإضافة DeepSparse إلى التطبيق. يتضمن تكامل DeepSparse-Ultralytics Pipeline جاهز للاستخدام يقبل الصور الخام ويخرج صناديق الإحاطة (bounding boxes).
أنشئ Pipeline وقم بتشغيل الاستدلال (inference):
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 التي تتجنب تبعيات واجهة المستخدم الرسومية (GUI) تمامًا:
pip install ultralytics-opencv-headlessخادم HTTP#
يعمل خادم DeepSparse Server فوق إطار عمل الويب الشهير FastAPI وخادم الويب Uvicorn. باستخدام أمر CLI واحد فقط، يمكنك بسهولة إعداد نقطة نهاية خدمة نموذجية باستخدام DeepSparse. يدعم الخادم أي خط أنابيب من DeepSparse، بما في ذلك اكتشاف الكائنات باستخدام YOLOv5، مما يتيح لك إرسال صور خام إلى نقطة النهاية واستلام صناديق الإحاطة.
قم بتشغيل الخادم مع نموذج 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"]واجهة سطر الأوامر للتعليق التوضيحي (Annotate CLI)#
يمكنك أيضاً استخدام أمر 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 وحفظ الصورة المشروحة بداخله.
قياس أداء الأداء#
سنقارن إنتاجية DeepSparse بإنتاجية ONNX Runtime على YOLOv5s، باستخدام سكربت قياس الأداء الخاص بـ DeepSparse.
تم تشغيل المعايير (benchmarks) على مثيل 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 (Batch 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 مجاني للبحوث والاختبار. ابدأ باستخدام التوثيق الخاص بهم.
لمزيد من المعلومات حول نشر YOLOv5 باستخدام DeepSparse، راجع توثيق DeepSparse لـ Neural Magic ومنشور مدونة Ultralytics حول تكامل DeepSparse.