Neural Magic์ ๋ฅ์คํ์ด์ค
์ํํธ์จ์ด ์ ๊ณต AI์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค.
์ด ๊ฐ์ด๋์์๋ Neural Magic ์ DeepSparse๋ฅผ ์ฌ์ฉํ์ฌ YOLOv5 ๋ฅผ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
DeepSparse๋ CPU์์ ํ์ํ ์ฑ๋ฅ์ ๋ฐํํ๋ ์ถ๋ก ๋ฐํ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, ONNX ๋ฐํ์ ๊ธฐ์ค๊ณผ ๋น๊ตํ์ ๋, ๋์ผํ ์ปดํจํฐ์์ ์คํ๋๋ YOLOv5์ ๊ฒฝ์ฐ DeepSparse๋ 5.8๋ฐฐ์ ์๋ ํฅ์์ ์ ๊ณตํฉ๋๋ค!
์ฒ์์ผ๋ก ํ๋์จ์ด ๊ฐ์๊ธฐ์ ๋ณต์ก์ฑ๊ณผ ๋น์ฉ ์์ด๋ ๋ฅ ๋ฌ๋ ์ํฌ๋ก๋๊ฐ ํ๋ก๋์ ์ ์ฑ๋ฅ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ ์ ์๊ฒ ๋์์ต๋๋ค. ๊ฐ๋จํ ๋งํด, DeepSparse๋ GPU์ ์ฑ๋ฅ๊ณผ ์ํํธ์จ์ด์ ๋จ์์ฑ์ ์ ๊ณตํฉ๋๋ค:
- ์ ์ฐํ ๋ฐฐํฌ: ํด๋ผ์ฐ๋, ๋ฐ์ดํฐ์ผํฐ, ์ฃ์ง ์ ๋ฐ์์ ์ผ๊ด๋๊ฒ ์คํ: Intel , AMD, ARM ๋ฑ ๋ชจ๋ ํ๋์จ์ด ๊ณต๊ธ์ ์ฒด์ ํจ๊ป ์คํํ์ธ์.
- ๋ฌดํํ ํ์ฅ์ฑ: 100๊ฐ์ ์ฝ์ด๋ก ์์ง ํ์ฅํ๊ฑฐ๋, ํ์ค Kubernetes๋ก ํ์ฅํ๊ฑฐ๋, ์๋ฒ๋ฆฌ์ค๋ก ์์ ํ ์ถ์ํํ ์ ์์ต๋๋ค.
- ๊ฐํธํ ํตํฉ: ๋ชจ๋ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉํ๊ณ ํ๋ก๋์ ํ๊ฒฝ์์ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํ ๊น๋ํ API
DeepSparse๋ ์ด๋ป๊ฒ GPU-ํด๋์ค ์ฑ๋ฅ์ ๋ฌ์ฑํ๋์?
DeepSparse๋ ๋ชจ๋ธ ํฌ์์ฑ์ ํ์ฉํ์ฌ ์ฑ๋ฅ ์๋๋ฅผ ๋์ ๋๋ค.
๊ฐ์ง์น๊ธฐ์ ์ ๋ํ๋ฅผ ํตํ ํฌ์ํ๋ ๊ด๋ฒ์ํ๊ฒ ์ฐ๊ตฌ๋๊ณ ์๋ ๊ธฐ์ ๋ก, ๋์ ์ ํ๋๋ฅผ ์ ์งํ๋ฉด์ ๋คํธ์ํฌ๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ํฌ๊ธฐ์ ์ปดํจํ ์ ๋ํญ ์ค์ผ ์ ์์ต๋๋ค. DeepSparse๋ ํฌ์์ฑ์ ์ธ์ํ๋ฏ๋ก 0์ผ๋ก ์ค์ ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฑด๋๋ฐ์ด ํฌ์๋ ํจ์ค์์ ๊ณ์ฐ๋์ ์ค์ ๋๋ค. ์ด์ ํฌ์์ฑ ๊ณ์ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ๊ตฌ์๋๊ธฐ ๋๋ฌธ์ DeepSparse๋ ๋คํธ์ํฌ๋ฅผ ๊น์ด ๋จ์๋ก ์คํํ์ฌ ๋ฌธ์ ๋ฅผ ์บ์์ ๋ง๋ Tensor ์ด, ์ฆ ์์ง ์ค๋ฌด๋ฌ ๊ณ์ฐ์ผ๋ก ๋ถํ ํฉ๋๋ค.
์บ์์์ ๊น์ด ๋จ์๋ก ์คํ๋๋ ์์ถ ์ฐ์ฐ์ด ํฌํจ๋ ์คํ์ค ๋คํธ์ํฌ๋ฅผ ํตํด 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๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ FastAPI ์น ํ๋ ์์ํฌ์ Uvicorn ์น ์๋ฒ ์์์ ์คํ๋ฉ๋๋ค. CLI ๋ช ๋ น ํ ๋ฒ์ผ๋ก ๋ชจ๋ธ ์๋น์ค ์๋ํฌ์ธํธ๋ฅผ DeepSparse๋ก ์ฝ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค. ์ด ์๋ฒ๋ YOLOv5 ์ ํตํ ๊ฐ์ฒด ๊ฐ์ง๋ฅผ ํฌํจํด DeepSparse์ ๋ชจ๋ ํ์ดํ๋ผ์ธ์ ์ง์ํ๋ฏ๋ก ์์ ์ด๋ฏธ์ง๋ฅผ ์๋ํฌ์ธํธ๋ก ์ ์กํ๊ณ ๊ฒฝ๊ณ ์์๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
์ ๋ฆฌ๋ ์ ๋ํ๋ 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 ์์ํ๊ธฐ
์ฐ๊ตฌ ๋๋ ํ ์คํธ? ๋ฅ์คํ์ด์ค ์ปค๋ฎค๋ํฐ๋ ์ฐ๊ตฌ ๋ฐ ํ ์คํธ๋ฅผ ์ํด ๋ฌด๋ฃ๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ฌธ์์์ ์์ํ์ธ์.