Ultralytics YOLO27: Tham gia danh sách chờ.
Get Started
Ultralytics YOLO trong môi trường production·Tối ưu hóa·Bài học 4/9
Bài họctrung cấp

OpenVINO trên CPU

Export các model OpenVINO FP32, FP16 và INT8, xác thực từng model, và chỉ giữ INT8 khi model thực sự có lợi trên CPU của bạn.

CPU Intel mà bạn đã có thường có thể thay thế một instance GPU: trong các benchmark của Ultralytics, YOLO26m giảm từ 192 ms với PyTorch xuống 36 ms với OpenVINO INT8 trên CPU Core Ultra của laptop. Tuy nhiên, mức cải thiện tùy thuộc vào chip; trên laptop ARM dùng để thử nghiệm khóa học này, bản export INT8 được hiệu chuẩn bằng bốn hình ảnh làm mất 3 điểm mAP. Bạn sẽ học cách đo lường để xác định trường hợp của mình trước khi triển khai.

Kết quả

Export các model OpenVINO FP32, FP16 và INT8, so sánh độ chính xác và tốc độ trên CPU của bạn, rồi chọn một model kèm lý do được ghi rõ.

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. yolo export model=yolo26n.pt format=openvino tạo yolo26n_openvino_model/.

  2. FP16 (quantize=16) giảm một nửa dung lượng file nhưng chạy ở tốc độ FP32 trên hầu hết CPU. INT8 (quantize=8 data=your.yaml) giúp tăng tốc CPU trên Intel.

  3. Khi inference, chọn thiết bị Intel: device="intel:cpu", "intel:gpu" hoặc "intel:npu".

  4. Xác thực từng precision trước khi lần export tiếp theo ghi đè thư mục; benchmark so với ONNX Runtime trên thiết bị đích.

Thực hành

OpenVINO mang lại điều gì#

Hệ sinh thái OpenVINO: các model từ PyTorch, TensorFlow, Keras, TensorFlow Lite, ONNX, JAX và PaddlePaddle chạy thông qua OpenVINO trên CPU Intel (và ARM), GPU Intel, NPU Intel và FPGA với Windows, Linux và macOS

OpenVINO nhận model từ PyTorch và ONNX, rồi chạy trên CPU Intel, GPU tích hợp và GPU rời, cũng như NPU thông qua một API. Kernel CPU của OpenVINO nhắm đến các tập lệnh Intel (AVX2, AVX-512, AMX), còn quy trình INT8 đã hoàn thiện. Hãy chú ý ô ARM trong cột CPU: OpenVINO cũng chạy trên ARM, nhưng kernel được tối ưu cho Intel, vì vậy hãy đo lường trước khi dựa vào OpenVINO trên ARM.

Benchmark được công bố trên CPU Intel Core Ultra 7 155H (COCO128):

ModelPyTorch FP32OpenVINO FP32OpenVINO INT8mAP50-95 FP32 → INT8
YOLO26n33.19 ms13.43 ms11.40 ms0.4734 → 0.4611
YOLO26s70.92 ms36.16 ms15.54 ms0.5632 → 0.5471
YOLO26m192.45 ms102.52 ms35.72 ms0.6191 → 0.6025

Bảng này cho thấy ba quy tắc:

  • Chỉ riêng OpenVINO FP32 đã giảm gần một nửa độ trễ của PyTorch trên CPU Intel. Hãy bắt đầu bằng bước này.
  • INT8 càng có lợi khi model lớn hơn: 1,2× với n, 2,9× với m, đổi lại mất 1,2–1,7 điểm mAP. Với n, INT8 hiếm khi đáng để đánh đổi độ chính xác.
  • Hãy thử GPU tích hợp trước khi mua phần cứng: iGPU Arc (device="intel:gpu") của cùng chip chạy YOLO26n FP32 trong 9.13 ms và YOLO26m trong 34.47 ms.

So sánh các precision trên CPU của bạn#

Export từng precision, xác thực ngay sau đó, rồi mới export precision tiếp theo:

from ultralytics import YOLO

if __name__ == "__main__":  # validation starts worker processes on macOS and Windows
    model = YOLO("yolo26n.pt")  # or runs/detect/pills_v1/weights/best.pt
    for name, quantize in (("FP32", None), ("FP16", 16), ("INT8", 8)):
        path = model.export(format="openvino", quantize=quantize, data="coco8.yaml")  # or my_dataset/data.yaml
        m = YOLO(path).val(data="coco8.yaml", batch=1, plots=False, verbose=False)  # before the next export overwrites it
        print(f"{name}: mAP50-95 {m.box.map:.4f}  -> {path}")
OpenVINO: export success ✅ 2.3s, saved as 'yolo26n_openvino_model/' (9.6 MB)
FP32: mAP50-95 0.6783  -> yolo26n_openvino_model/
OpenVINO: export success ✅ 1.6s, saved as 'yolo26n_openvino_model/' (5.1 MB)
FP16: mAP50-95 0.6783  -> yolo26n_openvino_model/
WARNING ⚠️ OpenVINO: >300 images recommended for INT8 calibration, found 4 images.
OpenVINO: export success ✅ 11.3s, saved as 'yolo26n_int8_openvino_model/' (3.2 MB)
INT8: mAP50-95 0.6460  -> yolo26n_int8_openvino_model/

Ý nghĩa của từng dòng:

  • FP32 và FP16 đạt điểm số như nhau, còn FP16 chỉ chiếm một nửa dung lượng (5.1 so với 9.6 MB), nhưng cả hai đều được ghi vào cùng một thư mục. Nếu bạn export cả hai trước rồi mới xác thực, bạn đã đo FP16 hai lần.
  • INT8 có dung lượng 3.2 MB và mất 3.2 điểm, vì model được hiệu chuẩn bằng bốn hình ảnh của COCO8. Cảnh báo cũng nêu rõ điều đó: hiệu chuẩn thực tế cần hàng trăm hình ảnh gần giống dữ liệu sản xuất từ YAML của riêng bạn (fraction giới hạn số hình ảnh được dùng).
  • Không có bước nào trong số này đo tốc độ. Để đo tốc độ, hãy dùng benchmark bên dưới.

Để chạy model đã export trên một thiết bị Intel cụ thể:

from ultralytics import YOLO

ov_model = YOLO("yolo26n_openvino_model/")
results = ov_model("https://ultralytics.com/images/bus.jpg", device="intel:cpu")  # hoặc intel:gpu, intel:npu

Triển khai toàn bộ thư mục: yolo26n.xml (đồ thị), yolo26n.bin (trọng số) và metadata.yaml. intel:gpu và intel:npu cần phần cứng Intel.

Đo thời gian và so sánh với ONNX Runtime#

Độ chính xác đã được xác định; tốc độ phụ thuộc vào thiết bị đích và tải thực tế mà thiết bị phải xử lý. Chạy pick_runtime.py từ bài học đầu tiên với CANDIDATES = ("onnx", "openvino"). Trên laptop thử nghiệm Apple silicon, 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

OpenVINO có median tốt hơn nhưng tail latency kém hơn nhiều. Wrapper Ultralytics biên dịch OpenVINO với gợi ý LATENCY (log ghi Using OpenVINO LATENCY mode for batch=1 inference on CPU), khiến mỗi yêu cầu được phân bổ trên các core CPU; khi các tác vụ khác tranh chấp những core này, các yêu cầu chậm nhất bị ảnh hưởng nhiều nhất. Trên máy Intel chuyên dụng, kết quả thường giống như số liệu công bố ở trên, nhưng chỉ p95 của chính bạn mới cho biết chắc chắn.

Quy tắc quyết định:

Các lỗi thường gặp#

Kỳ vọng FP16 sẽ tăng tốc CPU

Triệu chứng: bản export FP16 có kích thước bằng một nửa nhưng tốc độ không đổi. Cách khắc phục: trên hầu hết CPU, plugin tự chọn độ chính xác tính toán; dùng FP16 để giảm kích thước tải xuống, và dùng INT8 hoặc iGPU để tăng tốc.

Validation sau khi export tất cả

Triệu chứng: FP32 và FP16 báo các con số giống hệt nhau vì thực chất chúng là cùng một tệp. Cách khắc phục: bản export FP32 và FP16 dùng chung thư mục *_openvino_model/; hãy validation (hoặc đổi tên thư mục) ngay sau mỗi lần export.

Benchmark trên máy đang nhàn rỗi

Triệu chứng: tốc độ trung bình có vẻ ổn nhưng frame vẫn bị rớt vào những lúc tải cao. Cách khắc phục: đo thời gian suy luận khi hệ thống đang chạy tải production và đánh giá theo p95, không phải giá trị trung bình. Với nhiều luồng trên một server, hãy biên dịch bằng gợi ý THROUGHPUT bằng cách tải .xml trực tiếp qua runtime OpenVINO, như hướng dẫn chế độ độ trễ và thông lượng.

Bảo vệ các script chạy validation

Trên macOS và Windows, validation khởi chạy các tiến trình worker nhập lại script của bạn. Nếu thiếu if __name__ == "__main__":, lần chạy thử cho bài học này đã lặp lại các lần export trong những worker đó, gây lãng phí vài phút và tranh chấp CPU mà bài kiểm tra đang cố đo.

Dùng thử

Trên CPU đích, chạy ov_compare.py với model và YAML dataset của riêng bạn, sau đó chạy pick_runtime.py với ONNX và OpenVINO trong lúc tải thực tế (hoặc tải mô phỏng) đang chạy. Nộp một bảng ngắn (precision hoặc runtime, mAP50-95, dung lượng, p95 ms) và một câu nêu rõ bạn sẽ triển khai model nào.

Đ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 đã xác thực các bản xuất OpenVINO FP32, FP16 và INT8 của cùng một model trên cùng một tập dữ liệu.

  • Bạn có độ trễ p95 của OpenVINO và ONNX Runtime trên cùng một máy, dưới tải thực tế.

  • Lựa chọn precision và runtime của bạn nêu rõ mức giảm mAP và mức tăng tốc đã đo được.

Hiển thị lời giải
python ov_compare.py    # accuracy and size of FP32, FP16, INT8
python pick_runtime.py  # p50 and p95 for ONNX Runtime and OpenVINO

Một ví dụ quyết định dựa trên các số liệu Core Ultra 7 155H ở trên:

Tùy chọnmAP50-95Quy môms mỗi ảnh
OpenVINO FP320.47349.6 MB13.43
OpenVINO INT80.46113.2 MB11.40
iGPU FP32 (intel:gpu)0.47589.6 MB9.13

Triển khai OpenVINO FP32 trên GPU tích hợp: đây là tùy chọn nhanh nhất mà không làm giảm độ chính xác, trong khi INT8 trên CPU phải đánh đổi 1.2 điểm để tiết kiệm 2 ms. Với một triển khai YOLO26m, lựa chọn sẽ chuyển sang CPU INT8 (nhanh hơn 2.9× với mức giảm 1.7 điểm), nếu mức giảm đó nằm trong ngân sách cho phép.

Tiếp theo là gì

Các đối tượng được phát hiện trong từng khung hình là thành phần cơ bản. Tiếp theo: tracking, biến chúng thành các đối tượng liên tục với ID ổn định.

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