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

Chào mừng bạn đến với AI được cung cấp dưới dạng phần mềm.

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

DeepSparse là một runtime suy luận với hiệu suất vượt trội trên CPU. Ví dụ: so với baseline của ONNX Runtime, 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 khối lượng công việc học sâu của bạn có thể đáp ứng các yêu cầu hiệu suất của sản xuất mà không cần sự phức tạp và chi phí của các bộ tăng tốc phần cứng. Nói một cách đơn giản, DeepSparse mang đến cho bạn hiệu suất của GPU và 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 lõi, mở rộng theo chiều ngang với Kubernetes tiêu chuẩn hoặc trừu tượng hóa hoàn toàn với Serverless
  • Dễ dàng tích hợp: 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 như thế nào?

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

Việc làm thưa thớt thông qua cắt tỉa (pruning) và lượng tử hóa (quantization) là một kỹ thuật được nghiên cứu rộng rãi, cho phép giảm đáng kể kích thước và tài nguyên tính toán cần thiết để thực thi mạng, trong khi vẫn duy trì độ chính xác cao. DeepSparse nhận biết được sự thưa thớt, 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 lần chuyển tiếp (forward pass). Vì tính toán thưa thớt hiện bị giới hạn bởi bộ nhớ, DeepSparse thực thi mạng theo chiều sâu, chia nhỏ vấn đề thành các Tensor Columns, các dải tính toán dọc vừa vặn trong bộ nhớ cache.

DeepSparse tensor columns for sparse neural network inference

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

Làm cách nào để tạo phiên bản thưa thớt của YOLOv5 được 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 thớt trước của mỗi model YOLOv5. Sử dụng SparseML, vốn được tích hợp với Ultralytics, bạn có thể tinh chỉnh (fine-tune) một checkpoint thưa thớt trên dữ liệu của mình bằng một 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ẽ xem qua một ví dụ về việc benchmarking và triển khai 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 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 tiêu chuẩn (dày) và đã cắt tỉa-lượng tử hóa, đượ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ử các ví dụ triển khai dưới đây, hãy tải xuống một hình ảnh mẫu và lưu nó dưới dạng basilica.jpg với 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 sạch để thêm DeepSparse vào ứng dụng. Tích hợp DeepSparse-Ultralytics bao gồm một Pipeline sẵn sàng sử dụng, chấp nhận các hình ảnh thô và xuất ra các khung giới hạn (bounding boxes).

Tạo một Pipeline và chạy suy luận:

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 cloud, bạn có thể gặp lỗi OpenCV không thể 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 framework web FastAPI phổ biến và máy chủ web Uvicorn. Chỉ với một 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. Máy chủ hỗ trợ bất kỳ Pipeline nào từ DeepSparse, bao gồm phát hiện đối tượng với YOLOv5, cho phép bạn gửi hình ảnh thô đến endpoint và nhận lại các bounding box.

Khởi động Server với YOLOv5s đã cắt tỉa-lượng tử hóa:

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

Một ví dụ yêu cầu, sử dụng gói requests của 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"]

Annotate CLI

Bạn cũng có thể sử dụng lệnh annotate để công cụ lưu ảnh đã chú thích trên đĩa. Thử --source 0 để chú thích 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 lệnh trên sẽ tạo một thư mục annotation-results và lưu hình ảnh đã chú thích bên trong.

YOLOv5 detection results with bounding boxes

Benchmarking hiệu suất

Chúng ta 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 benchmarking của DeepSparse.

Các benchmark được chạy trên instance AWS c6i.8xlarge (16 lõi).

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

Baseline ONNX Runtime

Ở batch 32, ONNX Runtime đạt 42 ảnh/giây với YOLOv5s dày 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

Mặc dù DeepSparse cung cấp 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 dày tiêu chuẩn.

Ở batch 32, DeepSparse đạt 70 ảnh/giây với YOLOv5s dày tiêu chuẩn, một cải tiến hiệu suất 1.7x 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, mức tăng hiệu suất của DeepSparse so với ONNX Runtime thậm chí còn mạnh mẽ hơn.

Ở batch 32, DeepSparse đạt 241 ảnh/giây với YOLOv5s đã cắt tỉa-lượng tử hóa, một cải tiến hiệu suất 5.8x 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 so với ONNX Runtime cho kịch bản batch 1 nhạy cảm với độ trễ.

Baseline ONNX Runtime

Ở batch 1, ONNX Runtime đạt 48 ảnh/giây với YOLOv5s dày, 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

Ở batch 1, DeepSparse đạt 135 mục/giây với YOLOv5s đã cắt tỉa-lượng tử hóa, tăng 2.8x hiệu suất 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 chỉ dẫn VNNI, thông lượng của DeepSparse có thể được đẩy cao hơn nếu các trọng số được cắt tỉa theo khối 4.

Ở batch 1, DeepSparse đạt 180 mục/giây với YOLOv5s đã cắt tỉa-lượng tử hóa theo khối 4, tăng 3.7x hiệu suất 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 miễn phí cho mục đích nghiên cứu và kiểm thử. Hãy 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 đăng trên blog của Ultralytics về tích hợp DeepSparse.

Bình luận