Cách xuất khẩu phi- YOLO PyTorch Các mô hình với Ultralytics
Triển khai PyTorch Việc chuyển đổi từ mô hình sang sản phẩm thường đòi hỏi phải sử dụng nhiều trình xuất khác nhau cho mỗi nền tảng mục tiêu: torch.onnx.export vì ONNX , coremltools dành cho các thiết bị của Apple, onnx2tf vì TensorFlow , pnnx vì NCNN và cứ thế tiếp tục. Mỗi công cụ đều có API riêng, những đặc điểm riêng về phụ thuộc và quy ước đầu ra.
Ultralytics Các tiện ích xuất khẩu độc lập này tích hợp nhiều hệ thống phụ trợ đằng sau một giao diện nhất quán. Bạn có thể xuất bất kỳ dữ liệu nào. torch.nn.Module, bao gồm timm mô hình hình ảnh, tầm nhìn đèn pin các bộ phân loại và bộ phát hiện, hoặc các kiến trúc tùy chỉnh của riêng bạn, để ONNX, TorchScript, OpenVINO, CoreML, NCNN, PaddlePaddle, MNN, ExecuTorch, và TensorFlow SavedModel mà không cần phải học từng hệ thống phụ trợ riêng lẻ.
Tại sao nên sử dụng Ultralytics Dành cho người không phải- YOLO Xuất khẩu?
- Một API duy nhất cho 10 định dạng: chỉ cần học một quy ước gọi hàm duy nhất thay vì hàng tá quy ước khác nhau.
- Bề mặt tiện ích dùng chung: những người hỗ trợ xuất khẩu sống dưới
ultralytics.utils.exportVì vậy, sau khi các gói phụ trợ được cài đặt, bạn có thể giữ nguyên mô hình gọi hàm trên các định dạng khác nhau. - Cùng một đường dẫn mã như các hàm xuất của YOLO : cùng một hàm hỗ trợ cho mọi thứ. Ultralytics YOLO xuất khẩu.
- Đã tích hợp sẵn tính năng lượng tử hóa FP16 và INT8 cho các định dạng hỗ trợ tính năng này. OpenVINO , CoreML , MNN, NCNN ).
- Hoạt động trên CPU : không GPU Cần thiết cho chính bước xuất dữ liệu, vì vậy bạn có thể chạy nó cục bộ trên bất kỳ máy tính xách tay nào.
Bắt đầu nhanh
Cách nhanh nhất là xuất dữ liệu thành hai dòng. ONNX không có YOLO mã lệnh và không cần thiết lập gì thêm pip install ultralytics onnx timm:
import timm
import torch
from ultralytics.utils.export import torch2onnx
model = timm.create_model("resnet18", pretrained=True).eval()
torch2onnx(model, torch.randn(1, 3, 224, 224), output_file="resnet18.onnx")
Các Định dạng Xuất được Hỗ trợ
Hàm torch2* các hàm lấy một tiêu chuẩn torch.nn.Module và một ví dụ đầu vào tensor . MNN, TF SavedModel , Và TF Đồ thị đóng băng trải qua một giai đoạn trung gian. ONNX hoặc lỗi Keras. Không YOLO - Các thuộc tính cụ thể là bắt buộc trong cả hai trường hợp.
| Định dạng | Chức năng | Cài đặt | Đầu ra |
|---|---|---|---|
| ONNX | torch2onnx() | pip install onnx | .onnx tệp |
| TorchScript | torch2torchscript() | bao gồm với PyTorch | .torchscript tệp |
| OpenVINO | torch2openvino() | pip install openvino | _openvino_model/ thư mục |
| CoreML | torch2coreml() | pip install coremltools | .mlpackage |
| TF SavedModel | onnx2saved_model() | Xem các yêu cầu chi tiết bên dưới | _saved_model/ thư mục |
| TF Đồ thị đóng băng | keras2pb() | Xem các yêu cầu chi tiết bên dưới | .pb tệp |
| NCNN | torch2ncnn() | pip install ncnn pnnx | _ncnn_model/ thư mục |
| MNN | onnx2mnn() | pip install MNN | .mnn tệp |
| PaddlePaddle | torch2paddle() | pip install paddlepaddle x2paddle | _paddle_model/ thư mục |
| ExecuTorch | torch2executorch() | pip install executorch | _executorch_model/ thư mục |
ONNX như một định dạng trung gian
MNN , TF SavedModel và TF Quá trình xuất Frozen Graph diễn ra thông qua... ONNX như một bước trung gian. Xuất sang ONNX Trước tiên, hãy chuyển đổi.
Nhúng siêu dữ liệu
Một số chức năng xuất khẩu chấp nhận một tùy chọn metadata từ điển (ví dụ, torch2torchscript(..., metadata={"author": "me"})) cho phép nhúng các cặp khóa-giá trị tùy chỉnh vào sản phẩm xuất ra nếu định dạng đó hỗ trợ.
Ví dụ từng bước
Mỗi ví dụ dưới đây đều sử dụng cùng một thiết lập, một mạng ResNet-18 được huấn luyện trước từ timm ở chế độ đánh giá:
import timm
import torch
model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)
Luôn gọi model.eval() trước khi xuất khẩu
Bỏ học, chuẩn hóa hàng loạtvà các lớp chỉ dùng để huấn luyện khác hoạt động khác nhau trong quá trình suy luận. Bỏ qua .eval() Xuất khẩu với kết quả không chính xác.
Xuất sang ONNX
from ultralytics.utils.export import torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
Đối với kích thước lô động, hãy truyền vào một tham số. dynamic từ điển:
torch2onnx(model, im, output_file="resnet18_dyn.onnx", dynamic={"images": {0: "batch_size"}})
opset mặc định là 14 và tên đầu vào mặc định là "images"Ghi đè bằng opset, input_names, hoặc output_names lập luận.
Xuất sang TorchScript
Không cần thêm bất kỳ phụ thuộc nào. Sử dụng torch.jit.trace Bên trong nắp ca-pô.
from ultralytics.utils.export import torch2torchscript
torch2torchscript(model, im, output_file="resnet18.torchscript")
Xuất sang OpenVINO
from ultralytics.utils.export import torch2openvino
ov_model = torch2openvino(model, im, output_dir="resnet18_openvino_model")
Thư mục này chứa một tên cố định. model.xml và model.bin đôi:
resnet18_openvino_model/
├── model.xml
└── model.bin
Vượt qua dynamic=True đối với các hình dạng đầu vào động, half=True cho FP16, hoặc int8=True Đối với lượng tử hóa INT8. Ngoài ra, INT8 còn yêu cầu một calibration_dataset đối số.
Yêu cầu openvino>=2024.0.0 (hoặc >=2025.2.0 trên macOS 15.4 trở lên) và torch>=2.1.
Xuất sang CoreML
import coremltools as ct
from ultralytics.utils.export import torch2coreml
inputs = [ct.TensorType("input", shape=(1, 3, 224, 224))]
ct_model = torch2coreml(model, inputs, im, output_file="resnet18.mlpackage")
Cho phân loại các mô hình, truyền một danh sách tên lớp đến classifier_names để thêm một đầu phân loại vào CoreML người mẫu.
Yêu cầu coremltools>=9.0, torch>=1.11, và numpy<=2.3.5Không được hỗ trợ trên Windows.
BlobWriter not loaded lỗi
coremltools>=9.0 bánh lái tàu cho Python 3.10–3.13 trên macOS và Linux. Trên các phiên bản mới hơn Python các phiên bản mà phần mở rộng C gốc không tải được. Sử dụng Python 3.10–3.13 cho CoreML xuất khẩu.
Xuất sang TensorFlow SavedModel
TF SavedModel xuất khẩu được thực hiện ONNX như một bước trung gian:
from ultralytics.utils.export import onnx2saved_model, torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
keras_model = onnx2saved_model("resnet18.onnx", output_dir="resnet18_saved_model")
Hàm này trả về một mô hình Keras và cũng tạo ra... TFLite tệp (.tflite) bên trong thư mục đầu ra:
resnet18_saved_model/
├── saved_model.pb
├── variables/
├── resnet18_float32.tflite
├── resnet18_float16.tflite
└── resnet18_int8.tflite
Yêu cầu:
tensorflow>=2.0.0,<=2.19.0onnx2tf>=1.26.3,<1.29.0tf_keras<=2.19.0sng4onnx>=1.0.1onnx_graphsurgeon>=0.3.26(cài đặt bằng)--extra-index-url https://pypi.ngc.nvidia.com)ai-edge-litert>=1.2.0,<1.4.0trên macOS (ai-edge-litert>=1.2.0(trên các nền tảng khác)onnxslim>=0.1.71onnx>=1.12.0,<2.0.0protobuf>=5
Xuất sang TensorFlow Đồ thị đóng băng
Tiếp theo từ SavedModel Sau khi xuất ra kết quả trên, hãy chuyển đổi mô hình Keras trả về thành mô hình đã được đóng băng. .pb đồ thị:
from pathlib import Path
from ultralytics.utils.export import keras2pb
keras2pb(keras_model, output_file=Path("resnet18_saved_model/resnet18.pb"))
Xuất sang NCNN
from ultralytics.utils.export import torch2ncnn
torch2ncnn(model, im, output_dir="resnet18_ncnn_model")
Thư mục này chứa các tệp tham số và tệp nhị phân có tên cố định cùng với một tệp khác. Python bao bọc:
resnet18_ncnn_model/
├── model.ncnn.param
├── model.ncnn.bin
└── model_ncnn.py
torch2ncnn() kiểm tra cho ncnn và pnnx khi sử dụng lần đầu.
Xuất sang MNN
Việc xuất MNN yêu cầu ONNX Tệp đầu vào. Xuất sang ONNX Đầu tiên, sau đó chuyển đổi:
from ultralytics.utils.export import onnx2mnn, torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
onnx2mnn("resnet18.onnx", output_file="resnet18.mnn")
Hỗ trợ half=True cho FP16 và int8=True Dành cho lượng tử hóa INT8. Yêu cầu MNN>=2.9.6 và torch>=1.10.
Xuất sang PaddlePaddle
from ultralytics.utils.export import torch2paddle
torch2paddle(model, im, output_dir="resnet18_paddle_model")
Thư mục này chứa PaddlePaddle Các tệp mô hình và tham số:
resnet18_paddle_model/
├── model.pdmodel
└── model.pdiparams
Yêu cầu x2paddle và điều đúng đắn PaddlePaddle Phân phối cho nền tảng của bạn:
paddlepaddle-gpu>=3.0.0,<3.3.0TRÊN CUDApaddlepaddle==3.0.0trên ARM64 CPUpaddlepaddle>=3.0.0,<3.3.0trên các CPU khác
Không được hỗ trợ trên NVIDIA Jetson.
Xuất sang ExecuTorch
from ultralytics.utils.export import torch2executorch
torch2executorch(model, im, output_dir="resnet18_executorch_model")
Hàng xuất khẩu .pte Tệp được lưu trong thư mục đầu ra:
resnet18_executorch_model/
└── model.pte
Yêu cầu torch>=2.9.0 và một runtime ExecuTorch tương ứng (pip install executorchĐể biết cách sử dụng trong quá trình chạy, vui lòng xem phần... Tích hợp ExecuTorch.
Xác minh mô hình đã xuất của bạn
Sau khi xuất, hãy kiểm tra tính chẵn lẻ số học với bản gốc. PyTorch mô hình trước khi vận chuyển. Kiểm tra khói nhanh với ONNXBackend từ ultralytics.nn.backends So sánh các kết quả đầu ra và phát hiện sớm các lỗi theo dõi hoặc lượng tử hóa:
import numpy as np
import timm
import torch
from ultralytics.nn.backends import ONNXBackend
model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)
with torch.no_grad():
pytorch_output = model(im).numpy()
onnx_model = ONNXBackend("resnet18.onnx", device=torch.device("cpu"))
onnx_output = onnx_model.forward(im)[0]
diff = np.abs(pytorch_output - onnx_output).max()
print(f"Max difference: {diff:.6f}") # should be < 1e-5
Sự khác biệt dự kiến
Đối với xuất khẩu FP32, chênh lệch tuyệt đối tối đa phải nhỏ hơn 1e-5Sự khác biệt lớn hơn cho thấy các phép toán không được hỗ trợ, hình dạng đầu vào không chính xác hoặc mô hình không ở chế độ đánh giá. Xuất FP16 và INT8 có dung sai lỏng hơn. Hãy xác thực trên dữ liệu thực thay vì các tensor ngẫu nhiên.
Đối với các môi trường chạy khác, đầu vào tensor Tên có thể khác. OpenVINO Ví dụ, nó sử dụng tên đối số chuyển tiếp của mô hình (thường là x (đối với các mô hình chung), trong khi torch2onnx mặc định là "images".
Các hạn chế đã biết
- Khả năng hỗ trợ nhiều thiết bị đầu vào không đồng đều:
torch2onnxvàtorch2openvinoChấp nhận một bộ hoặc danh sách các tensor ví dụ cho các mô hình có nhiều đầu vào.torch2torchscript,torch2coreml,torch2ncnn,torch2paddle, vàtorch2executorchgiả sử một đầu vào duy nhất tensor . - ExecuTorch cần
flatc: Môi trường chạy ExecuTorch yêu cầu trình biên dịch FlatBuffers. Cài đặt bằng lệnh sau:brew install flatbufferstrên macOS hoặcapt install flatbuffers-compilertrên Ubuntu. - Không có suy luận nào thông qua Ultralytics: Xuất khẩu không- YOLO Các mô hình không thể được tải lại thông qua
YOLO()để suy luận. Sử dụng môi trường chạy gốc cho từng định dạng (ONNX Thời gian chạy, OpenVINO Thời gian chạy, v.v.). - Chỉ dành cho định dạng YOLO : Các bản xuất từ Axelera và Sony IMX500 yêu cầu YOLO - Các thuộc tính dành riêng cho từng mô hình và không khả dụng cho các mô hình chung.
- Định dạng dành riêng cho nền tảng: TensorRT yêu cầu một NVIDIA GPU . RKNN yêu cầu
rknn-toolkit2Bộ công cụ phát triển phần mềm (chỉ dành cho Linux). Edge TPU yêu cầuedgetpu_compilerTệp nhị phân (chỉ dành cho Linux).
Câu hỏi thường gặp
Tôi có thể xuất những mô hình nào? Ultralytics ?
Bất kì torch.nn.ModuleĐiều này bao gồm các mẫu từ timm, torchvision, hoặc bất kỳ sản phẩm tùy chỉnh nào. PyTorch mô hình. Mô hình phải ở chế độ đánh giá (model.eval()trước khi xuất khẩu. ONNX Và OpenVINO Ngoài ra, hệ thống cũng chấp nhận một bộ giá trị gồm các tensor ví dụ cho các mô hình đa đầu vào.
Những định dạng xuất nào hoạt động mà không cần GPU ?
Tất cả các định dạng được hỗ trợ ( TorchScript , ONNX , OpenVINO , CoreML , TF SavedModel , TF Đồ thị đóng băng, NCNN , PaddlePaddle (MNN, ExecuTorch) có thể xuất ra. CPU . KHÔNG GPU Điều này là cần thiết cho chính quá trình xuất khẩu. TensorRT là định dạng duy nhất yêu cầu NVIDIA GPU .
Cái gì Ultralytics Tôi cần phiên bản nào?
Sử dụng Ultralytics >=8.4.38, bao gồm ultralytics.utils.export mô-đun và tiêu chuẩn hóa output_file/output_dir lập luận.
Tôi có thể xuất mô hình torchvision sang...? CoreML vì iOS triển khai?
Có. Các bộ phân loại, bộ dò và mô hình phân đoạn của torchvision có thể xuất sang... .mlpackage thông qua torch2coremlĐối với các mô hình phân loại hình ảnh, hãy truyền vào một danh sách tên lớp. classifier_names Để nhúng tiêu đề phân loại. Chạy quá trình xuất trên macOS hoặc Linux. CoreML Tính năng này không được hỗ trợ trên Windows. Xem thêm CoreML tích hợp vì iOS Chi tiết triển khai.
Tôi có thể lượng tử hóa mô hình đã xuất sang định dạng INT8 hoặc FP16 được không?
Vâng, đối với một số định dạng. Pass half=True cho FP16 hoặc int8=True đối với INT8 khi xuất sang OpenVINO , CoreML , MNN, hoặc NCNN . INT8 trong OpenVINO ngoài ra còn yêu cầu một calibration_dataset đối số cho lượng tử hóa sau huấn luyệnXem trang tích hợp của từng định dạng để biết các sự đánh đổi về lượng tử hóa.