Chọn mục tiêu triển khai
Dựa trên thiết bị, ngân sách latency và đội thiết bị để chọn một runtime cùng định dạng export, sau đó xác nhận trên thiết bị.

Cùng một model YOLO26n mất 38.9 ms mỗi ảnh trên CPU với ONNX Runtime và 1.7 ms trên GPU T4 với TensorRT trong các benchmark YOLO26. Chọn sai runtime có thể khiến bạn phải trả tiền cho phần cứng mạnh hơn nhiều so với nhu cầu hoặc triển khai camera không đáp ứng được tải. Bài học này giúp bạn đưa ra quyết định trong mười phút, với cơ sở là số liệu đo trực tiếp trên thiết bị.
Thực hành
Bắt đầu từ thiết bị#
Runtime được quyết định bởi nơi chạy inference, không phải thói quen. Đi theo sơ đồ từ trên xuống và dừng ở lựa chọn phù hợp đầu tiên:
Mỗi runtime tương ứng với một giá trị format= trong chế độ Export:
| Mục tiêu | Runtime | format= | Cẩn thận với |
|---|---|---|---|
| GPU NVIDIA, Jetson | TensorRT | engine | Engine chỉ chạy được trên cùng dòng GPU và phiên bản TensorRT đã dùng để build engine |
| CPU, iGPU, NPU Intel | OpenVINO | openvino | Được tối ưu cho Intel; hãy đo hiệu năng trước khi dùng trên nền tảng khác |
| Bất kỳ CPU hoặc GPU nào | ONNX Runtime | onnx | Chọn execution provider một cách tường minh |
| iPhone, iPad, Mac | CoreML | coreml | Export chạy trên macOS hoặc Linux, không chạy trên Windows |
| Android, thiết bị nhúng | LiteRT | litert | INT8 cần dữ liệu calibration data |
| NPU Snapdragon | Qualcomm QNN | qnn | Chỉ hỗ trợ xuất lượng tử hóa; truyền đích Hexagon dưới dạng name |
| Raspberry Pi, CPU ARM | NCNN | ncnn | Định dạng nhanh nhất trong hướng dẫn Raspberry Pi |
| Trình duyệt | ONNX Runtime Web | onnx | Chỉ dùng model n hoặc s |
Trên các nền tảng Apple gần đây, bạn cũng có thể xuất sang định dạng Core AI mới hơn của Apple (format=coreai, được xuất trên macOS 26+ với Apple silicon hoặc Linux x86-64). Mới làm quen với việc xuất model? Bài học Xuất model để triển khai trình bày những kiến thức cơ bản.
Nếu không muốn chạy máy chủ inference, Ultralytics Platform triển khai model dưới dạng endpoint chuyên dụng tại một trong 42 khu vực, và tab Deployments trong hồ sơ của bạn hiển thị vị trí chạy của từng endpoint:

Phương án đó được trình bày trong Triển khai và gọi một endpoint. Phần còn lại của khóa học này dành cho trường hợp bạn tự chạy model.
Chuyển mục tiêu FPS thành ngân sách mili giây#
"Thời gian thực" không phải là một yêu cầu cụ thể; một con số thì có. Hãy tính con số đó trước khi benchmark bất cứ thứ gì:
| Bước chuyển | Ví dụ: 20 FPS mỗi camera |
|---|---|
| Ngân sách mỗi frame = 1000 ÷ FPS | 50 ms |
| Trừ thời gian giải mã (RTSP, 1080p) | khoảng 10 ms |
| Trừ thời gian tracking, đếm và xử lý đầu ra | khoảng 5 ms |
| Trừ 20% dự phòng cho các đỉnh tải | 10 ms |
| Thời gian còn lại cho model | khoảng 25–30 ms |
Tiếp theo, áp dụng các quy tắc lựa chọn sau:
- Nếu YOLO26n cần nhiều thời gian hơn ngân sách dành cho model trên CPU của thiết bị, hãy chuyển sang bộ tăng tốc (GPU, iGPU, NPU) hoặc giảm kích thước
imgsztrước tiên; các benchmark YOLO26 ghi nhận YOLO26n mất 38.9 ms trên CPU với ONNX và 1.7 ms trên T4 với TensorRT. - Nếu một thiết bị phải phục vụ nhiều camera, hãy chia ngân sách model cho số lượng camera.
- Nếu hệ thống có nhiều hơn một vài loại thiết bị, hãy ưu tiên các runtime không cần build riêng cho từng thiết bị hoặc lên kế hoạch build riêng cho từng nhóm thiết bị.
- Nếu code gọi model được viết bằng Swift, Kotlin hoặc C++, hãy kiểm tra SDK của runtime có hỗ trợ ngôn ngữ đó trước khi quyết định.
Benchmark các ứng viên trên thiết bị#
Thông số kỹ thuật và benchmark của người khác là điểm khởi đầu. Quyết định cần dựa trên phần cứng bạn sẽ triển khai và các frame chậm, chứ không phải mức trung bình: runtime có tốc độ trung vị nhanh nhưng bị khựng ở một trong hai mươi frame vẫn sẽ làm rớt frame. Script này xuất từng ứng viên, đo thời gian 100 lần inference trên một frame thực tế và đánh giá từng ứng viên theo phân vị thứ 95 (p95):
from ultralytics import YOLO
from ultralytics.utils.downloads import safe_download
BUDGET_MS = 30 # the model's share of a 20 FPS frame budget
CANDIDATES = ("onnx", "openvino") # runtimes the decision tree allows on this machine
if __name__ == "__main__": # exports and inference can start worker processes on macOS and Windows
frame = str(safe_download("https://ultralytics.com/images/bus.jpg")) # use a real frame from your camera
for fmt in CANDIDATES:
model = YOLO(YOLO("yolo26n.pt").export(format=fmt))
for _ in range(5): # warm up: the first calls include one-time setup
model(frame, verbose=False)
runs = sorted(model(frame, verbose=False)[0].speed["inference"] for _ in range(100))
p50, p95 = runs[49], runs[94]
verdict = "meets" if p95 <= BUDGET_MS else "misses"
print(f"{fmt:9s} p50 {p50:5.1f} ms p95 {p95:5.1f} ms {verdict} the {BUDGET_MS} ms budget")Trên laptop Apple silicon dùng để kiểm thử khóa học này, trong khi CPU được chia sẻ với các tác vụ khác:
onnx p50 30.0 ms p95 46.4 ms misses the 30 ms budget
openvino p50 22.8 ms p95 113.5 ms misses the 30 ms budgetĐọc lần lượt từng dòng:
speed["inference"]là thời gian xử lý riêng của model cho frame đó, không bao gồm giải mã hay vẽ, nhờ vậy có thể so sánh công bằng giữa các runtime.- OpenVINO thắng về trung vị nhưng thua về p95 với chênh lệch hơn hai lần. Nếu đánh giá dựa trên mức trung bình, bạn sẽ triển khai runtime bị khựng vào những lúc tải cao; xét theo p95, ONNX Runtime là lựa chọn ổn định hơn trên máy này.
- Cả hai đều không đáp ứng ngân sách, vì vậy bước tiếp theo ở đây là dùng
imgsznhỏ hơn, dùng bộ tăng tốc hoặc giảm số camera trên mỗi thiết bị, chứ không phải thử một runtime CPU khác.
Để nhanh chóng khảo sát độ chính xác và tốc độ trên nhiều định dạng, chế độ Benchmark sẽ xuất model, đánh giá và đo thời gian cho từng định dạng:
yolo benchmark model=yolo26n.pt data=coco8.yaml imgsz=640 format=onnxBỏ format= để khảo sát mọi định dạng mà máy hỗ trợ. COCO8 chỉ có bốn ảnh validation, vì vậy hãy xem cột mAP là phép kiểm tra sơ bộ và dùng YAML dataset của riêng bạn để quyết định về độ chính xác.
Các lỗi thường gặp#
Triệu chứng: model đạt 60 FPS trên workstation nhưng bị rớt frame trên thiết bị. Cách khắc phục: benchmark trên phần cứng triển khai hoặc máy gần nhất có thể, đồng thời chạy model dưới mức tải thực tế trong production (các tiến trình khác, camera khác).
Triệu chứng: một .engine được build trên GPU trung tâm dữ liệu không tải được trên Jetson Orin. Cách khắc phục: build trên thiết bị đích tại thời điểm cài đặt (bản build YOLO26n FP16 mất khoảng 5 phút trên Jetson Orin theo tài liệu export Platform), hoặc duy trì một bản build cho mỗi loại thiết bị và phiên bản TensorRT, đồng thời phân phối .pt hoặc .onnx để mọi thiết bị đều có thể build lại.
yolo benchmark đo ở imgsz mà bạn truyền vào. Nếu production chạy ở imgsz=1280, hãy benchmark ở 1280: lượng tính toán tăng theo số pixel, nên các con số ở 640 sẽ thấp hơn khoảng 4 lần so với khi triển khai ở 1280.
Thiết bị edge đặt ra bốn câu hỏi#
Các hướng dẫn về Raspberry Pi, NVIDIA Jetson và DeepStream trên Jetson trình bày chi tiết các mục tiêu phổ biến. Trước khi quyết định dùng thiết bị edge, hãy trả lời:
- Khởi động nguội: TensorRT engine được build ở đâu và ai phải chờ quá trình đó?
- Nguồn điện và nhiệt độ: thiết bị có thể vận hành model ở FPS tối đa suốt cả ngày không?
- Bộ nhớ: ngoài model, thiết bị còn đủ chỗ cho bộ đệm frame và trạng thái tracker không? INT8 giảm một nửa dung lượng bộ nhớ dành cho model.
- Cập nhật: phiên bản
best.ptmới sẽ được đưa đến 1.000 thiết bị như thế nào? Một image Docker giúp đảm bảo tính nhất quán giữa các thiết bị.
Hiển thị lời giải
Ví dụ bản tóm tắt triển khai cho một dự án triển khai phân tích bán lẻ:
| Câu hỏi | Câu trả lời |
|---|---|
| Thiết bị | 40 máy tính mini tại cửa hàng với CPU Intel Core Ultra, không có GPU rời |
| FPS và camera | 10 FPS mỗi camera, 2 camera mỗi thiết bị |
| Ngôn ngữ gọi model | Dịch vụ Python trên Linux |
| Hệ thống thiết bị | 40 thiết bị, được cập nhật từ một image Docker |
Ngân sách: 1000 ÷ 10 = 100 ms mỗi frame; trừ khoảng 15 ms cho giải mã và tracking cùng 20% dự phòng, còn khoảng 65 ms, chia cho hai camera, tức khoảng 30 ms mỗi lần inference. Cây quyết định đề xuất OpenVINO (CPU Intel), với ONNX Runtime làm phương án dự phòng; trên một thiết bị tại cửa hàng:
python pick_runtime.py # CANDIDATES = ("onnx", "openvino"), BUDGET_MS = 30Benchmark CPU Core Ultra 7 155H trong tài liệu OpenVINO ghi nhận YOLO26n mất 13.4 ms với OpenVINO FP32, vì vậy yolo26n có thể đáp ứng thoải mái; nếu p95 trên thiết bị thực tế dưới 30 ms khi cả hai luồng camera đang chạy, hãy triển khai OpenVINO. Nếu không đạt, hãy thử GPU tích hợp của thiết bị với device="intel:gpu" trước khi mua phần cứng.