Neural Magic์ ๋ฅ์คํ์ด์ค
์ํํธ์จ์ด ์ ๊ณต AI์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค.
์ด ๊ฐ์ด๋์์๋ Neural Magic ์ DeepSparse๋ฅผ ์ฌ์ฉํ์ฌ YOLOv5 ๋ฅผ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
DeepSparse๋ CPU์์ ํ์ํ ์ฑ๋ฅ์ ๋ฐํํ๋ ์ถ๋ก ๋ฐํ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, ONNX ๋ฐํ์ ๊ธฐ์ค๊ณผ ๋น๊ตํ์ ๋, ๋์ผํ ์ปดํจํฐ์์ ์คํ๋๋ YOLOv5์ ๊ฒฝ์ฐ DeepSparse๋ 5.8๋ฐฐ์ ์๋ ํฅ์์ ์ ๊ณตํฉ๋๋ค!
For the first time, your deep learning workloads can meet the performance demands of production without the complexity and costs of hardware accelerators. Put simply, DeepSparse gives you the performance of GPUs and the simplicity of software:
- ์ ์ฐํ ๋ฐฐํฌ: ํด๋ผ์ฐ๋, ๋ฐ์ดํฐ์ผํฐ, ์ฃ์ง ์ ๋ฐ์์ ์ผ๊ด๋๊ฒ ์คํ: Intel , AMD, ARM ๋ฑ ๋ชจ๋ ํ๋์จ์ด ๊ณต๊ธ์ ์ฒด์ ํจ๊ป ์คํํ์ธ์.
- ๋ฌดํํ ํ์ฅ์ฑ: 100๊ฐ์ ์ฝ์ด๋ก ์์ง ํ์ฅํ๊ฑฐ๋, ํ์ค Kubernetes๋ก ํ์ฅํ๊ฑฐ๋, ์๋ฒ๋ฆฌ์ค๋ก ์์ ํ ์ถ์ํํ ์ ์์ต๋๋ค.
- ๊ฐํธํ ํตํฉ: ๋ชจ๋ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉํ๊ณ ํ๋ก๋์ ํ๊ฒฝ์์ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํ ๊น๋ํ API
DeepSparse๋ ์ด๋ป๊ฒ GPU-ํด๋์ค ์ฑ๋ฅ์ ๋ฌ์ฑํ๋์?
DeepSparse๋ ๋ชจ๋ธ ํฌ์์ฑ์ ํ์ฉํ์ฌ ์ฑ๋ฅ ์๋๋ฅผ ๋์ ๋๋ค.
Sparsification through pruning and quantization is a broadly studied technique, allowing order-of-magnitude reductions in the size and compute needed to execute a network, while maintaining high accuracy. DeepSparse is sparsity-aware, meaning it skips the zeroed out parameters, shrinking amount of compute in a forward pass. Since the sparse computation is now memory bound, DeepSparse executes the network depth-wise, breaking the problem into Tensor Columns, vertical stripes of computation that fit in cache.
์บ์์์ ๊น์ด ๋จ์๋ก ์คํ๋๋ ์์ถ ์ฐ์ฐ์ด ํฌํจ๋ ์คํ์ค ๋คํธ์ํฌ๋ฅผ ํตํด DeepSparse๋ CPU์์ GPU-๊ธ ์ฑ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค!
๋ด ๋ฐ์ดํฐ๋ก ํ๋ จ๋ YOLOv5 ์ ์คํ์ค ๋ฒ์ ์ ๋ง๋ค๋ ค๋ฉด ์ด๋ป๊ฒ ํ๋์?
Neural Magic์ ์คํ ์์ค ๋ชจ๋ธ ์ ์ฅ์์ธ SparseZoo์๋ ๊ฐ YOLOv5 ๋ชจ๋ธ์ ๋ํด ๋ฏธ๋ฆฌ ์ง์ ๋ ์ฒดํฌํฌ์ธํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. Ultralytics ๊ณผ ํตํฉ๋ SparseML์ ์ฌ์ฉํ๋ฉด CLI ๋ช ๋ น ํ ๋ฒ์ผ๋ก ๋ฐ์ดํฐ์ ๋ํ ์คํ์ค ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ Neural Magic ์ YOLOv5 ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ฅ์คํ์ด์ค ์ฌ์ฉ
DeepSparse๋ฅผ ์ฌ์ฉํ์ฌ YOLOv5์ ์คํ์ค ๋ฒ์ ์ ๋ฒค์น๋งํนํ๊ณ ๋ฐฐํฌํ๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
DeepSparse ์ค์น
๋ค์์ ์คํํ์ฌ DeepSparse๋ฅผ ์ค์นํฉ๋๋ค. Python ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ํ๊ฒฝ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ONNX ํ์ผ ์์ง
DeepSparse๋ ONNX ํ์์ผ๋ก ์ ๋ฌ๋ ๋ชจ๋ธ์ ํ์ฉํฉ๋๋ค:
- SparseZoo์ ONNX ํ์ผ์ ์๋ณํ๋ SparseZoo ์คํ ์ ๋๋ค.
- ํ์ผ ์์คํ ์์ ONNX ๋ชจ๋ธ์ ๋ํ ๋ก์ปฌ ๊ฒฝ๋ก
์๋ ์์์์๋ ๋ค์ SparseZoo ์คํ ์ผ๋ก ์๋ณ๋๋ ํ์ค ์กฐ๋ฐํ๊ณ ์ ๋ํ๋ YOLOv5s ์ฒดํฌํฌ์ธํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค:
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
๋ชจ๋ธ ๋ฐฐํฌ
DeepSparse๋ ๋ชจ๋ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉํ๊ธฐ ์ํ ํธ๋ฆฌํ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋ ๋ฐฐํฌ ์์ ๋ฅผ ์ฌ์ฉํด ๋ณด๋ ค๋ฉด ์ํ ์ด๋ฏธ์ง๋ฅผ ๋์ด์์ ๋ค์ ์ด๋ฆ์ผ๋ก ์ ์ฅํ์ธ์. 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
์์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์๋ค์ด๊ณ ๊ฒฝ๊ณ ์์๋ฅผ ์ถ๋ ฅํ๋ ํจ์์
๋๋ค.
๋ง๋ค๊ธฐ 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)
ํด๋ผ์ฐ๋์์ ์คํ ์ค์ธ ๊ฒฝ์ฐ, open-cv๋ฅผ ์ฐพ์ ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. libGL.so.1
. Ubuntu์์ ๋ค์์ ์คํํ๋ฉด ์ค์น๋ฉ๋๋ค:
HTTP ์๋ฒ
DeepSparse Server runs on top of the popular FastAPI web framework and Uvicorn web server. With just a single CLI command, you can easily setup a model service endpoint with DeepSparse. The Server supports any Pipeline from DeepSparse, including object detection with YOLOv5, enabling you to send raw images to the endpoint and receive the bounding boxes.
์ ๋ฆฌ๋ ์ ๋ํ๋ YOLOv5๋ก ์๋ฒ๋ฅผ ์คํ์ ํฉ๋๋ค:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
Python ๋ฅผ ์ฌ์ฉํ ์์ฒญ ์์ requests
ํจํค์ง์
๋๋ค:
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
์ฃผ์ ๋ฌ๊ธฐ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์์ง์ด ์ฃผ์์ด ๋ฌ๋ฆฐ ์ฌ์ง์ ๋์คํฌ์ ์ ์ฅํ๋๋ก ํ ์๋ ์์ต๋๋ค. ์์ค 0์ ์ฌ์ฉํด ๋ผ์ด๋ธ ์น์บ ํผ๋์ ์ฃผ์์ ๋ฌ์ ๋ณด์ธ์!
deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg
์ ๋ช
๋ น์ ์คํํ๋ฉด annotation-results
ํด๋์ ์ฃผ์์ด ๋ฌ๋ฆฐ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํฉ๋๋ค.
๋ฒค์น๋งํน ์ฑ๋ฅ
DeepSparse์ ๋ฒค์น๋งํน ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ YOLOv5์์ ONNX ๋ฐํ์์ ์ฒ๋ฆฌ๋๊ณผ DeepSparse์ ์ฒ๋ฆฌ๋์ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฒค์น๋งํฌ๋ AWS์์ ์คํ๋์์ต๋๋ค. c6i.8xlarge
์ธ์คํด์ค(16์ฝ์ด).
๋ฐฐ์น 32 ์ฑ๋ฅ ๋น๊ต
ONNX ๋ฐํ์ ๊ธฐ์ค์
๋ฐฐ์น 32์์ ONNX ๋ฐํ์์ ํ์ค ๊ณ ๋ฐ๋ YOLOv5๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋น 42๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ฌ์ฑํฉ๋๋ค:
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
๋ฅ์คํ์ด์ค ๊ณ ๋ฐ๋ ์ฑ๋ฅ
๋ฅ์คํ์ค๋ ์ต์ ํ๋ ์คํ์ค ๋ชจ๋ธ์์ ์ต๊ณ ์ ์ฑ๋ฅ์ ์ ๊ณตํ์ง๋ง, ํ์ค ๊ณ ๋ฐ๋ YOLOv5์์๋ ์ฐ์ํ ์ฑ๋ฅ์ ๋ฐํํฉ๋๋ค.
๋ฐฐ์น 32์์ ๋ฅ์คํ์ด์ค๋ ํ์ค ๊ณ ๋ฐ๋ YOLOv5s๋ก ์ด๋น 70๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ฌ์ฑํ์ฌ ORT๋ณด๋ค 1.7๋ฐฐ ์ฑ๋ฅ์ด ํฅ์๋์์ต๋๋ค!
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
๋ฅ์คํ์ด์ค ์คํ์ค ์ฑ๋ฅ
๋ชจ๋ธ์ ํฌ์์ฑ์ ์ ์ฉํ๋ฉด ONNX ๋ฐํ์์ ๋นํด DeepSparse์ ์ฑ๋ฅ ํฅ์์ ๋์ฑ ๊ฐ๋ ฅํด์ง๋๋ค.
๋ฐฐ์น 32์์ ๋ฅ์คํ์ด์ค๋ ํ๋ฃจ๋๋ ์ ๋ํ๋ YOLOv5s๋ก ์ด๋น 241 ์ด๋ฏธ์ง๋ฅผ ๋ฌ์ฑํ๋ฉฐ, ์ด๋ ORT๋ณด๋ค 5.8๋ฐฐ ํฅ์๋ ์ฑ๋ฅ์ ๋๋ค!
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 ์ฑ๋ฅ ๋น๊ต
๋ํ ๋ฅ์คํ์ด์ค๋ ์ง์ฐ ์๊ฐ์ ๋ฏผ๊ฐํ ๋ฐฐ์น 1 ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ ONNX ๋ฐํ์๋ณด๋ค ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
ONNX ๋ฐํ์ ๊ธฐ์ค์
๋ฐฐ์น 1์์ ONNX ๋ฐํ์์ ํ์ค ๊ณ ๋ฐ๋ YOLOv5๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋น 48๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ฌ์ฑํฉ๋๋ค.
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
๋ฅ์คํ์ด์ค ์คํ์ค ์ฑ๋ฅ
๋ฐฐ์น 1์์ DeepSparse๋ ์ ๋ฆฌ๋ ์ ๋ํ๋ YOLOv5s๋ก ์ด๋น 135๊ฐ์ ํญ๋ชฉ์ ๋ฌ์ฑํ์ฌ ONNX ๋ฐํ์์ ๋นํด 2.8๋ฐฐ์ ์ฑ๋ฅ ํฅ์์ ๋ฌ์ฑํ์ต๋๋ค !
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 ๋ช
๋ น์ด๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ฐ์ค์น๋ฅผ 4๋ธ๋ก ๋จ์๋ก ์๋ผ๋ด๋ฉด DeepSparse์ ์ฒ๋ฆฌ๋์ ๋ ๋๋ฆด ์ ์์ต๋๋ค.
๋ฐฐ์น 1์์ DeepSparse๋ 4๋ธ๋ก ํ๋ฃจ๋ ์ ๋ํ๋ YOLOv5s๋ก ์ด๋น 180๊ฐ ํญ๋ชฉ์ ๋ฌ์ฑํ์ฌ ONNX ๋ฐํ์ ๋๋น 3.7๋ฐฐ์ ์ฑ๋ฅ ํฅ์์ ๋ฌ์ฑํ์ต๋๋ค !
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 ์์ํ๊ธฐ
์ฐ๊ตฌ ๋๋ ํ ์คํธ? ๋ฅ์คํ์ด์ค ์ปค๋ฎค๋ํฐ๋ ์ฐ๊ตฌ ๋ฐ ํ ์คํธ๋ฅผ ์ํด ๋ฌด๋ฃ๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ฌธ์์์ ์์ํ์ธ์.