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 có hiệu năng vượt trội trên CPU. Ví dụ, so với đường cơ sở ONNX Runtime, DeepSparse nhanh hơn 5,8 lần đối với YOLOv5s khi chạy trên cùng một máy!
Lần đầu tiên, workload deep learning của bạn có thể đáp ứng yêu cầu hiệu năng của môi trường production mà không cần đế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 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 mọi nhà cung cấp phần cứng, từ Intel đến AMD và ARM
- Khả năng mở rộng vô hạn: Scale dọc lên hàng trăm core, scale ngang với Kubernetes tiêu chuẩn hoặc trừu tượng hóa hoàn toàn với Serverless
- Tích hợp dễ dàng: API rõ ràng để tích hợp model vào ứng dụng và giám sát model trong môi trường production
DeepSparse đạt hiệu năng cấp GPU bằng cách nào?#
DeepSparse tận dụng tính thưa của model để tăng tốc hiệu năng.
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 hàng chục lần kích thước và năng lực tính toán cần thiết để thực thi một network, đồng thời vẫn duy trì độ chính xác cao. DeepSparse nhận biết sparsity, nghĩa là bỏ qua các parameter đã được đưa về 0, qua đó giảm lượng tính toán trong một forward pass. Vì phép tính thưa hiện bị giới hạn bởi memory, DeepSparse thực thi network theo chiều sâu, chia bài toán thành các Tensor Column — các dải tính toán dọc vừa với cache.
Các network thưa với phép tính được nén, thực thi theo chiều sâu trong cache, cho phép DeepSparse mang đến hiệu năng cấp GPU trên CPU!
Làm thế nào để tạo phiên bản thưa của YOLOv5 được train trên dữ liệu của tôi?#
Repository model mã nguồn mở SparseZoo của Neural Magic chứa các checkpoint đã được sparsify trước của từng model YOLOv5. Với 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ỉ bằng một lệnh CLI.
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ẽ thực hiện một ví dụ benchmark và triển khai phiên bản thưa 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ị sử dụng virtual environment với Python.
pip install "deepsparse[server,yolo,onnxruntime]"Thu thập file ONNX#
DeepSparse chấp nhận một model ở định dạng ONNX, được truyền vào dưới một trong các dạng sau:
- Một stub SparseZoo xác định một file ONNX trong SparseZoo
- Một path cục bộ đến model ONNX trong filesystem
Các ví dụ dưới đây sử dụng checkpoint YOLOv5s dense tiêu chuẩn và checkpoint YOLOv5s đã pruning-quantization, được xác định bằng 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-noneTriển khai model#
DeepSparse cung cấp các API thuận tiện để tích hợp model vào ứng dụng.
Để thử các ví dụ triển khai dưới đây, hãy tải một ảnh mẫu xuống và lưu ảnh đó dưới dạng basilica.jpg bằng lệnh sau:
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpgPython API#
Pipelines bao bọc bước tiền xử lý và hậu xử lý output quanh runtime, cung cấp một interface rõ ràng để thêm DeepSparse vào ứng dụng. Tích hợp DeepSparse-Ultralytics bao gồm sẵn Pipeline, nhận ảnh thô và xuất ra các bounding box.
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, có thể bạn sẽ gặp lỗi cho biết OpenCV không tìm thấy libGL.so.1. Bạn có thể cài đặt library còn thiếu:
apt-get install libgl1Hoặc sử dụng package Ultralytics headless, package này hoàn toàn không cần các dependency GUI:
pip install ultralytics-opencv-headlessHTTP Server#
DeepSparse Server chạy trên framework web FastAPI phổ biến và web server Uvicorn. Chỉ với một lệnh CLI, bạn có thể dễ dàng thiết lập endpoint service cho model bằng DeepSparse. Server hỗ trợ mọi Pipeline từ DeepSparse, bao gồm object detection với YOLOv5, cho phép bạn gửi ảnh thô đến endpoint và nhận về các bounding box.
Khởi chạy Server với YOLOv5s đã pruning-quantization:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneMột request mẫu 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 để engine lưu ảnh đã chú thích vào ổ đĩa. Hãy thử --source 0 để chú thích feed 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.jpgChạy lệnh trên sẽ tạo một thư mục annotation-results và lưu ảnh đã chú thích vào bên trong.
Benchmark hiệu năng#
Chúng ta sẽ so sánh throughput của DeepSparse với throughput của ONNX Runtime trên YOLOv5s bằng script benchmark của DeepSparse.
Các benchmark được chạy trên một instance AWS c6i.8xlarge (16 core).
So sánh hiệu năng với batch 32#
Đường cơ sở ONNX Runtime#
Ở batch 32, ONNX Runtime đạt 42 ả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.9025Hiệu năng dense của DeepSparse#
Mặc dù DeepSparse đạt hiệu năng tốt nhất với các model thưa đã được tối ưu, nó cũng hoạt động tốt với YOLOv5s dense tiêu chuẩn.
Ở batch 32, DeepSparse đạt 70 ảnh/giây với YOLOv5s dense tiêu chuẩn, cải thiện hiệu năng 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.5546Hiệu năng sparse của DeepSparse#
Khi áp dụng sparsity cho model, mức tăng hiệu năng của DeepSparse so với ONNX Runtime còn lớn hơn.
Ở batch 32, DeepSparse đạt 241 ảnh/giây với YOLOv5s đã pruning-quantization, cải thiện hiệu năng 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.2452So sánh hiệu năng với batch 1#
DeepSparse cũng có thể tăng tốc so với ONNX Runtime trong trường hợp batch 1 nhạy cảm với latency.
Đường cơ sở ONNX Runtime#
Ở batch 1, ONNX Runtime đạt 48 ả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.0921Hiệu năng sparse của DeepSparse#
Ở batch 1, DeepSparse đạt 135 item/giây với YOLOv5s đã pruning-quantization, tăng hiệu năng 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.9468Vì các instance c6i.8xlarge có instruction VNNI, throughput của DeepSparse có thể được đẩy cao hơn nữa nếu các weight được pruning theo block 4.
Ở batch 1, DeepSparse đạt 180 item/giây với YOLOv5s đã pruning-quantization theo block 4, tăng hiệu năng 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.7375Bắt đầu với DeepSparse#
Nghiên cứu hoặc thử nghiệm? DeepSparse Community miễn phí cho nghiên cứu và thử nghiệm. 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 Magic và bài viết blog của Ultralytics về tích hợp DeepSparse.