Ultralytics YOLO27: Tham gia danh sách chờ.
Get Started
Ultralytics YOLO trong môi trường production·Chọn runtime·Bài học 1/9
Bài họctrung cấp

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ị.

Camera giao thông phía trên đường cao tốc trong thành phố lúc hoàng hôn, Ultralytics YOLO tracking ô tô, xe van và xe tải, mỗi đối tượng được gắn nhãn lớp và ID

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ị.

Kết quả

Chọn runtime và giá trị format= cho thiết bị, chuyển mục tiêu FPS thành ngân sách mili giây và xác nhận lựa chọn bằng các benchmark lặp lại.

Lộ trình cấp tốc
Nếu bạn đã nắm rõ cách thực hiện, đây là phiên bản tóm tắt.
  1. GPU NVIDIA hoặc Jetson → TensorRT (engine), build trên thiết bị mục tiêu. CPU, iGPU hoặc NPU Intel → OpenVINO (openvino).

  2. Apple → CoreML (coreml). Android → LiteRT (litert). NPU Snapdragon → QNN (qnn). Raspberry Pi → NCNN (ncnn).

  3. Các nền tảng khác → ONNX Runtime (onnx). Nếu không muốn quản lý server → endpoint Ultralytics Platform được quản lý.

  4. Ngân sách = 1000 ÷ FPS, trừ thời gian decode và hậu xử lý. Đo thời gian trên thiết bị và đánh giá p95, không phải giá trị trung bình.

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êuRuntimeformat=Cẩn thận với
GPU NVIDIA, JetsonTensorRTengineEngine chỉ chạy được trên cùng dòng GPU và phiên bản TensorRT đã dùng để build engine
CPU, iGPU, NPU IntelOpenVINOopenvinoĐượ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àoONNX RuntimeonnxChọn execution provider một cách tường minh
iPhone, iPad, MacCoreMLcoremlExport chạy trên macOS hoặc Linux, không chạy trên Windows
Android, thiết bị nhúngLiteRTlitertINT8 cần dữ liệu calibration data
NPU SnapdragonQualcomm QNNqnnChỉ hỗ trợ xuất lượng tử hóa; truyền đích Hexagon dưới dạng name
Raspberry Pi, CPU ARMNCNNncnnĐịnh dạng nhanh nhất trong hướng dẫn Raspberry Pi
Trình duyệtONNX Runtime WebonnxChỉ 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:

Tab Deployments trong hồ sơ Ultralytics Platform với bản đồ thế giới hiển thị các khu vực triển khai và các thẻ tổng quan về số lượt triển khai đang hoạt động, yêu cầu HTTP, tỷ lệ lỗi và độ trễ P95

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ểnVí dụ: 20 FPS mỗi camera
Ngân sách mỗi frame = 1000 ÷ FPS50 ms
Trừ thời gian giải mã (RTSP, 1080p)khoảng 10 ms
Trừ thời gian tracking, đếm và xử lý đầu rakhoảng 5 ms
Trừ 20% dự phòng cho các đỉnh tải10 ms
Thời gian còn lại cho modelkhoả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 imgsz trướ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 imgsz nhỏ 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=onnx

Bỏ 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#

Benchmark trên sai thiết bị

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).

TensorRT engine phụ thuộc vào thiết bị

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.

Benchmark ở kích thước sẽ dùng khi phục vụ suy luận

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.pt mớ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ị.
Dùng thử

Viết bản tóm tắt triển khai gồm năm dòng cho một dự án thực tế hoặc dự kiến: thiết bị mục tiêu, FPS mỗi camera, số camera mỗi thiết bị, ngôn ngữ gọi model và quy mô hệ thống. Chuyển các thông tin này thành ngân sách model tính bằng mili giây, chọn ứng viên từ cây quyết định rồi chạy pick_runtime.py (với model và các ứng viên của bạn) trên thiết bị mục tiêu hoặc máy gần giống nhất mà bạn có.

Điều kiện hoàn thành
Bạn đã hoàn thành bài học khi tất cả các điều kiện sau đều đúng.
  • Bản tóm tắt của bạn nêu rõ thiết bị, runtime và giá trị format= chính xác.

  • Bạn đã tính ngân sách thời gian tính bằng mili giây cho model từ mục tiêu FPS và nêu rõ những khoản đã trừ.

  • Bạn có thời gian inference p50 và p95 của từng ứng viên, được đo trên thiết bị, cùng kết luận so với ngân sách.

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ỏiCâ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à camera10 FPS mỗi camera, 2 camera mỗi thiết bị
Ngôn ngữ gọi modelDị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 = 30

Benchmark 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.

Tiếp theo là gì

Sau khi chọn được mục tiêu, bài học tiếp theo sẽ xuất sang ONNX và xác minh rằng kết quả xuất ra giống với PyTorch.

Đăng nhập để lưu tiến độ