YOLO Vision 2026:

Triển khai YOLOv5 với DeepSparse của Neural Magic#

Chào mừng bạn đến với kỷ nguyên AI được phân phối bằng phần mềm.

Hướng dẫn này giải thích cách triển khai YOLOv5 bằng DeepSparse của Neural Magic.

DeepSparse là một runtime suy luận (inference runtime) với hiệu suất vượt trội trên CPU. Ví dụ, so với ONNX Runtime cơ bản, DeepSparse mang lại tốc độ nhanh gấp 5,8 lần cho YOLOv5s khi chạy trên cùng một máy!

YOLOv5 DeepSparse vs ONNX Runtime speed comparison chart

Lần đầu tiên, các tác vụ deep learning của bạn có thể đáp ứng các yêu cầu hiệu năng trong môi trường production mà không gặp phải sự phức tạp và tốn kém của các bộ gia tốc phần cứng. Nói một cách đơn giản, DeepSparse mang lại hiệu năng của GPU cùng sự đơn giản của phần mềm:

  • Triển khai linh hoạt: Chạy nhất quán trên cloud, trung tâm dữ liệu và edge với bất kỳ nhà cung cấp phần cứng nào từ Intel đến AMD và ARM.
  • Khả năng mở rộng vô hạn: Mở rộng theo chiều dọc lên hàng trăm nhân, mở rộng ra ngoài với Kubernetes tiêu chuẩn, hoặc hoàn toàn trừu tượng hóa với Serverless.
  • Tích hợp dễ dàng: Các API sạch để tích hợp model của bạn vào ứng dụng và giám sát nó trong môi trường production.

DeepSparse đạt được hiệu suất đẳng cấp GPU bằng cách nào?#

DeepSparse tận dụng độ thưa thớt (sparsity) của model để tăng tốc hiệu suất.

Sparsification thông qua pruning và quantization là một kỹ thuật được nghiên cứu rộng rãi, cho phép giảm kích thước và lượng tính toán cần thiết để thực thi mạng xuống nhiều bậc độ lớn, đồng thời vẫn duy trì accuracy cao. DeepSparse nhận thức được độ thưa (sparsity-aware), nghĩa là nó bỏ qua các tham số bằng không, làm giảm lượng tính toán trong một forward pass. Vì quá trình tính toán thưa bây giờ bị giới hạn bởi bộ nhớ (memory bound), DeepSparse thực thi mạng theo chiều sâu, chia nhỏ bài toán thành các Tensor Columns, là các dải tính toán dọc vừa vặn trong cache.

DeepSparse tensor columns for sparse neural network inference

Các mạng lưới thưa thớt với tính toán được nén, được thực thi theo chiều sâu trong cache, cho phép DeepSparse mang lại hiệu suất đẳng cấp GPU trên CPU!

Làm thế nào để tạo một phiên bản thưa thớt của YOLOv5 đã huấn luyện trên dữ liệu của tôi?#

Kho lưu trữ model mã nguồn mở của Neural Magic, SparseZoo, chứa các checkpoint đã được làm thưa trước của từng model YOLOv5. Bằng cách sử dụng SparseML được tích hợp với Ultralytics, bạn có thể fine-tune một checkpoint thưa trên dữ liệu của mình chỉ với một câu lệnh CLI duy nhất.

Xem tài liệu YOLOv5 của Neural Magic để biết thêm chi tiết.

Sử dụng DeepSparse#

Chúng ta sẽ đi qua một ví dụ về đánh giá benchmark và triển khai một phiên bản thưa thớt của YOLOv5s với DeepSparse.

Cài đặt DeepSparse#

Chạy lệnh sau để cài đặt DeepSparse. Chúng tôi khuyến nghị bạn sử dụng môi trường ảo (virtual environment) với Python.

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

Thu thập tệp ONNX#

DeepSparse chấp nhận model ở định dạng ONNX, được truyền dưới dạng:

  • Một stub SparseZoo xác định tệp ONNX trong SparseZoo
  • Một đường dẫn cục bộ đến model ONNX trong hệ thống tệp

Các ví dụ dưới đây sử dụng các checkpoint YOLOv5s dày (dense) và pruned-quantized tiêu chuẩn, được xác định bởi các stub SparseZoo sau:

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

Triển khai Model#

DeepSparse cung cấp các API tiện lợi để tích hợp model của bạn vào ứng dụng.

Để thử nghiệm các ví dụ triển khai dưới đây, hãy tải xuống một ảnh mẫu và lưu nó dưới tên basilica.jpg bằng câu lệnh sau:

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

Python API#

Pipelines bao bọc quá trình tiền xử lý và hậu xử lý đầu ra xung quanh runtime, cung cấp một giao diện gọn gàng để thêm DeepSparse vào một ứng dụng. Tích hợp DeepSparse-Ultralytics bao gồm một Pipeline có sẵn nhận ảnh thô và trả về các bounding box.

Tạo một Pipeline và chạy 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)

Nếu bạn đang chạy trên môi trường cloud, bạn có thể gặp lỗi OpenCV không tìm thấy libGL.so.1. Bạn có thể cài đặt thư viện còn thiếu:

apt-get install libgl1

Hoặc sử dụng gói Ultralytics headless để tránh hoàn toàn các phụ thuộc GUI:

pip install ultralytics-opencv-headless

HTTP Server#

DeepSparse Server chạy trên nền tảng web framework FastAPI phổ biến và web server Uvicorn. Chỉ với một câu lệnh CLI duy nhất, bạn có thể dễ dàng thiết lập một endpoint dịch vụ model với DeepSparse. Server hỗ trợ bất kỳ Pipeline nào từ DeepSparse, bao gồm object detection với YOLOv5, cho phép bạn gửi ảnh thô tới endpoint và nhận về các bounding box.

Khởi chạy Server với YOLOv5s pruned-quantized:

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

Một yêu cầu (request) ví dụ, sử dụng package requests của 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#

Bạn cũng có thể sử dụng lệnh annotate để yêu cầu engine lưu một bức ảnh đã được chú thích lên ổ đĩa. Hãy thử --source 0 để chú thích cho nguồn cấp dữ liệu webcam trực tiếp của bạn!

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

Chạy câu lệnh trên sẽ tạo ra một thư mục annotation-results và lưu hình ảnh đã được chú thích bên trong.

YOLOv5 detection results with bounding boxes

Đánh giá hiệu suất (Benchmarking)#

Chúng tôi sẽ so sánh thông lượng (throughput) của DeepSparse với thông lượng của ONNX Runtime trên YOLOv5s, sử dụng tập lệnh benchmark của DeepSparse.

Các benchmark được chạy trên một instance AWS c6i.8xlarge (16 nhân).

So sánh hiệu suất Batch 32#

ONNX Runtime cơ bản#

Tại batch 32, ONNX Runtime đạt 42 hình ảnh/giây với YOLOv5s dense tiêu chuẩn:

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

Hiệu suất DeepSparse Dense#

Trong khi DeepSparse mang lại hiệu suất tốt nhất với các model thưa thớt được tối ưu hóa, nó cũng hoạt động tốt với YOLOv5s dense tiêu chuẩn.

Tại batch 32, DeepSparse đạt 70 hình ảnh/giây với YOLOv5s dense tiêu chuẩn, cải thiện hiệu suất 1,7 lần so với 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

Hiệu suất DeepSparse Sparse#

Khi độ thưa thớt được áp dụng cho model, hiệu suất của DeepSparse so với ONNX Runtime thậm chí còn mạnh mẽ hơn.

Tại batch 32, DeepSparse đạt 241 hình ảnh/giây với YOLOv5s pruned-quantized, cải thiện hiệu suất 5,8 lần so với 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

So sánh hiệu suất Batch 1#

DeepSparse cũng có thể đạt được tốc độ nhanh hơn ONNX Runtime cho tình huống batch 1 nhạy cảm với độ trễ (latency).

ONNX Runtime cơ bản#

Tại batch 1, ONNX Runtime đạt 48 hình ảnh/giây với YOLOv5s dense tiêu chuẩn.

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

Hiệu suất DeepSparse Sparse#

Tại batch 1, DeepSparse đạt 135 mục/giây với YOLOv5s pruned-quantized, tăng hiệu suất 2,8 lần so với 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

Vì các instance c6i.8xlarge có các tập lệnh VNNI, thông lượng (throughput) của DeepSparse có thể được đẩy lên cao hơn nữa nếu các trọng số (weights) được prune theo các khối 4.

Tại batch 1, DeepSparse đạt 180 mục/giây với YOLOv5s 4-block pruned-quantized, tăng hiệu suất 3,7 lần so với 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

Bắt đầu với DeepSparse#

Nghiên cứu hoặc Kiểm thử? DeepSparse Community hoàn toàn miễn phí cho mục đích nghiên cứu và kiểm thử. Bắt đầu với Tài liệu của họ.

Để biết thêm thông tin về việc triển khai YOLOv5 với DeepSparse, hãy xem tài liệu DeepSparse của Neural Magicbài viết blog của Ultralytics về tích hợp DeepSparse.

Những người đóng góp

Bình luận