ONNX (Open Neural Network Exchange)
ONNX là định dạng mở lưu model đã huấn luyện dưới dạng đồ thị gồm các toán tử tiêu chuẩn, nhờ đó model được huấn luyện bằng PyTorch có thể chạy trên nhiều runtime.
ONNX (Trao đổi mạng nơ-ron mở) là định dạng file tiêu chuẩn mở dành cho model học máy. File .onnx lưu model đã huấn luyện dưới dạng đồ thị tính toán gồm các toán tử tiêu chuẩn cùng với trọng số, nhờ vậy model được huấn luyện bằng một framework như PyTorch có thể chạy trên các runtime khác và nhiều loại phần cứng. Facebook và Microsoft ra mắt ONNX vào tháng 9 năm 2017; từ tháng 11 năm 2019, ONNX trở thành dự án đã tốt nghiệp của LF AI & Data, tổ chức AI thuộc Linux Foundation. ONNX thường là điểm bàn giao giữa quá trình huấn luyện và triển khai model: một file đã export có thể được đưa vào ONNX Runtime, TensorRT, OpenVINO và compiler của nhiều bộ tăng tốc edge AI.
Nội dung trong file ONNX#
Model ONNX được tuần tự hóa bằng Protocol Buffers và gồm bốn phần:
- Graph: Các node gọi những toán tử như
Conv,MatMulvàRelu, được kết nối bằng các tensor có tên. Đầu vào và đầu ra của graph mang thông tin kiểu dữ liệu và shape; mỗi chiều có thể cố định hoặc mang tính ký hiệu, chẳng hạn batch size biến đổi. - Initializer: Các trọng số đã huấn luyện. Protocol Buffers giới hạn một file ở mức 2 GB, vì vậy model lớn hơn lưu trọng số trong các file dữ liệu bên ngoài, đặt cạnh file
.onnx. - Phiên bản opset: Các toán tử được quản lý phiên bản trong các opset; runtime phải hỗ trợ opset mà model được export bằng. Opset mới bổ sung toán tử mà không thay đổi các toán tử cũ, chẳng hạn toán tử
Attentionđược thêm vào opset 23. - Metadata: Tên nhà sản xuất, phiên bản model và các cặp khóa-giá trị tùy chỉnh, chẳng hạn tên lớp.
Miền toán tử thứ hai, ONNX-ML, bao gồm các model cổ điển như tổ hợp cây và bộ phân loại tuyến tính, vì vậy các công cụ chuyển đổi như skl2onnx và onnxmltools có thể export model scikit-learn, LightGBM và XGBoost sang cùng định dạng. Các trình xem như Netron hiển thị từng node trong graph. Trên thực tế, ONNX đóng vai trò trung gian giữa nhiều framework huấn luyện và nhiều runtime:
Chạy model ONNX#
ONNX Runtime, engine suy luận mã nguồn mở của Microsoft, chạy file ONNX trên server, máy tính để bàn, điện thoại và trình duyệt. Khi tải model, engine tối ưu graph, chẳng hạn bằng cách gộp các hằng số và hợp nhất phép tích chập với batch normalization theo sau, rồi chuyển từng phần của graph cho một execution provider phù hợp với phần cứng hiện có: CUDA hoặc TensorRT trên GPU NVIDIA, OpenVINO trên phần cứng Intel, DirectML trên GPU Windows, Core ML trên thiết bị Apple, QNN trên NPU Qualcomm và WebGPU trong trình duyệt. Windows ML, framework suy luận cục bộ của Microsoft, chạy trên ONNX Runtime; các engine khác như TensorRT và OpenVINO nhập file ONNX rồi biên dịch chúng sang định dạng riêng.
Ultralytics YOLO26 xuất sang ONNX bằng model.export(format="onnx"), còn TensorRT export của Ultralytics xây dựng engine từ chính file ONNX đó. File đã xuất chạy được trong ONNX Runtime mà không cần PyTorch:
import onnxruntime as ort
from ultralytics import YOLO
# Xuất YOLO26n sang ONNX với các chiều batch, height và width có tính ký hiệu
model = YOLO("yolo26n.pt")
onnx_path = model.export(format="onnx", dynamic=True)
# Tải graph bằng ONNX Runtime, không cần PyTorch hay Ultralytics
session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
for tensor in session.get_inputs() + session.get_outputs():
print(tensor.name, tensor.shape)Lệnh này in ra input của graph, images, với các chiều batch, height và width có tính ký hiệu, cùng đầu ra dự đoán thô, output0; đây là chữ ký mà mọi ONNX runtime đều dùng để đưa dữ liệu vào model và đọc kết quả.
ONNX so với các định dạng và công cụ liên quan#
- ONNX Runtime: Engine suy luận thực thi các file ONNX; đây là một dự án riêng do Microsoft dẫn dắt, thường được gọi tắt là “ONNX”.
- TensorRT: Trình biên dịch của NVIDIA chuyển file ONNX thành engine được tối ưu cho một loại GPU và phiên bản TensorRT cụ thể, vì vậy các nhóm giữ file ONNX làm nguồn có tính di động và xây dựng lại engine cho từng mục tiêu.
- Các định dạng PyTorch: Checkpoint
.ptvà file safetensors lưu trọng số cho đoạn code dùng để dựng lại model; TorchScript vàtorch.exportghi lại graph cho các runtime riêng của PyTorch. - Các định dạng triển khai khác: OpenVINO IR, các file LiteRT
.tflite, các gói Core ML và các file GGUF dành cho LLM đã lượng tử hóa đều hướng đến các runtime cụ thể. coremltools của Apple chuyển đổi trực tiếp các model PyTorch và đã ngừng hỗ trợ đầu vào ONNX từ phiên bản 6.
Ứng dụng thực tế#
- Ứng dụng đa nền tảng: Một file ONNX có thể dùng cho máy chủ Linux, ứng dụng Windows thông qua Windows ML, và ứng dụng Android và iOS thông qua ONNX Runtime Mobile.
- Suy luận trên trình duyệt: ONNX Runtime Web chạy model trên thiết bị của người dùng bằng WebGPU hoặc WebAssembly, nhờ vậy khung hình camera dùng cho các tính năng như ước tính tư thế không bao giờ rời khỏi trình duyệt.
- Bộ tăng tốc biên: Bộ công cụ NPU từ các nhà cung cấp như Hailo, Qualcomm và Rockchip nhận model ONNX làm đầu vào rồi biên dịch chúng, thường kèm lượng tử hóa xuống INT8, để chạy trên chip của họ.
- Model cổ điển trong môi trường production: Cây tăng cường gradient và pipeline scikit-learn được chuyển đổi sang ONNX có thể chạy trong dịch vụ C#, Java và C++ thông qua ONNX Runtime mà không cần trình thông dịch Python trong luồng phục vụ.










