Ultralytics 사용하여YOLO PyTorch 내보내는 방법
PyTorch 프로덕션 환경에 배포하려면 대개 대상 환경마다 다른 익스포터를 사용해야 합니다: torch.onnx.export ONNX의 경우, coremltools Apple 기기의 경우, onnx2tf TensorFlow의 경우, pnnx NCNN 등등. 각 도구마다 고유한 API, 의존성 관련 특이점, 출력 규칙이 있습니다.
Ultralytics 여러 백엔드를 하나의 일관된 인터페이스로 통합한 독립형 내보내기 유틸리티를 Ultralytics . 사용자는 어떤 torch.nn.Module, 다음을 포함하여 timm 이미지 모델, 토치비전 분류기 및 탐지기, 또는 사용자 정의 아키텍처를 사용하여 ONNX, TorchScript, OpenVINO, CoreML, NCNN, PaddlePaddle, MNN, ExecuTorch및 TensorFlow SavedModel 각 백엔드를 따로 배우지 않고도.
YOLO Ultralytics 왜 Ultralytics 사용해야 할까요?
- 10가지 형식을 아우르는 단일 API: 수십 가지 호출 방식을 익힐 필요 없이 단 하나의 호출 방식만 배우면 됩니다.
- 공용 유틸리티 표면: 수출 헬퍼는 다음 위치에 있습니다
ultralytics.utils.export따라서 백엔드 패키지가 설치되면 모든 형식에서 동일한 호출 방식을 유지할 수 있습니다. - YOLO 기능과 동일한 코드 경로: 모든 Ultralytics YOLO 기능은 동일한 헬퍼를 기반으로 합니다.
- 이를 지원하는 형식(OpenVINO, CoreML, MNN, NCNN)에 대해 FP16 및 INT8 양자화가 내장되어 있습니다.
- CPU에서 실행됩니다: 내보내기 단계 자체에는 GPU 않으므로, 어떤 노트북에서든 로컬로 실행할 수 있습니다.
빠른 시작
가장 빠른 방법은 두 줄로 구성된 내보내기 파일로 ONNX YOLO 없고, 별도의 설정도 필요 없이 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")
지원되는 내보내기 형식
에 지정되어 있습니다. torch2* 함수는 표준 torch.nn.Module 그리고 예제 입력 tensor. MNN, TF SavedModel 및 TF Graph는 중간 단계로 ONNX Keras 아티팩트를 거칩니다. 두 경우 모두 YOLO 전용 속성은 필요하지 않습니다.
| 형식 | 기능 | 설치 | 출력 |
|---|---|---|---|
| ONNX | torch2onnx() | pip install onnx | .onnx 파일 |
| TorchScript | torch2torchscript() | PyTorch에 포함되어 있음 | .torchscript 파일 |
| OpenVINO | torch2openvino() | pip install openvino | _openvino_model/ 디렉토리 |
| CoreML | torch2coreml() | pip install coremltools | .mlpackage |
| TF SavedModel | onnx2saved_model() | 자세한 요건은 아래를 참조하십시오 | _saved_model/ 디렉토리 |
| TF 그래프 | keras2pb() | 자세한 요건은 아래를 참조하십시오 | .pb 파일 |
| NCNN | torch2ncnn() | pip install ncnn pnnx | _ncnn_model/ 디렉토리 |
| MNN | onnx2mnn() | pip install MNN | .mnn 파일 |
| PaddlePaddle | torch2paddle() | pip install paddlepaddle x2paddle | _paddle_model/ 디렉토리 |
| ExecuTorch | torch2executorch() | pip install executorch | _executorch_model/ 디렉토리 |
중간 형식ONNX
MNN, TF SavedModel및 TF Graph 내보내기는 ONNX 중간 ONNX 거칩니다. ONNX 내보낸 다음 변환하십시오.
메타데이터 삽입
몇 가지 내보내기 함수는 선택적 매개변수를 받습니다 metadata 사전 (예: torch2torchscript(..., metadata={"author": "me"})) 형식이 지원하는 경우, 사용자 정의 키-값 쌍을 내보낸 아티팩트에 포함시킵니다.
단계별 예시
아래의 모든 예시는 동일한 설정, 즉 timm에서 제공되는 평가 모드의 사전 학습된 ResNet-18을 사용합니다:
import timm
import torch
model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)
항상 전화하세요 model.eval() 내보내기 전에
중퇴, 배치 정규화, 그리고 기타 열차 전용 레이어들은 추론 단계에서 다르게 동작합니다. 건너뛰기 .eval() 잘못된 출력 결과를 생성합니다.
ONNX로 내보내기
from ultralytics.utils.export import torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
동적 배치 크기를 사용하려면 다음을 전달하십시오. dynamic 사전:
torch2onnx(model, im, output_file="resnet18_dyn.onnx", dynamic={"images": {0: "batch_size"}})
기본 오프셋은 14 그리고 기본 입력 이름은 "images". 다음으로 덮어쓰기 opset, input_names또는 output_names 논증들.
TorchScript로 내보내기
별도의 종속성이 필요하지 않습니다. 사용법 torch.jit.trace 내부 구조.
from ultralytics.utils.export import torch2torchscript
torch2torchscript(model, im, output_file="resnet18.torchscript")
OpenVINO로 내보내기
from ultralytics.utils.export import torch2openvino
ov_model = torch2openvino(model, im, output_dir="resnet18_openvino_model")
이 디렉토리에는 고정된 이름의 model.xml 및 model.bin 쌍:
resnet18_openvino_model/
├── model.xml
└── model.bin
건너뛰기 dynamic=True 동적 입력 형상의 경우, half=True FP16의 경우, 또는 int8=True INT8 양자화를 위해. INT8의 경우 추가로 calibration_dataset 인수입니다.
필수 openvino>=2024.0.0 (또는 >=2025.2.0 macOS 15.4 이상에서) 및 torch>=2.1.
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")
다음을 위한 분류 모델에 클래스 이름 목록을 전달하려면 classifier_names CoreML 에 분류 헤더를 추가하려면.
필수 coremltools>=9.0, torch>=1.11및 numpy<=2.3.5. Windows에서는 지원되지 않습니다.
BlobWriter not loaded 오류
coremltools>=9.0 macOS 및 Linux에서 Python .10–3.13용 ship wheels를 제공합니다. Python 네이티브 C 확장 모듈이 로드되지 않습니다. CoreML 위해서는 Python .10–3.13을 사용하십시오.
TensorFlow SavedModel로 내보내기
TF SavedModel 중간 ONNX 거칩니다:
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")
이 함수는 Keras 모델을 반환하고 TFLite 생성합니다 (.tflite) 출력 디렉터리 내에:
resnet18_saved_model/
├── saved_model.pb
├── variables/
├── resnet18_float32.tflite
├── resnet18_float16.tflite
└── resnet18_int8.tflite
요구 사항:
tensorflow>=2.0.0,<=2.19.0onnx2tf>=1.26.3,<1.29.0tf_keras<=2.19.0sng4onnx>=1.0.1onnx_graphsurgeon>=0.3.26(다음과 같이 설치하십시오)--extra-index-url https://pypi.ngc.nvidia.com)ai-edge-litert>=1.2.0,<1.4.0macOS에서 (ai-edge-litert>=1.2.0(다른 플랫폼에서는)onnxslim>=0.1.71onnx>=1.12.0,<2.0.0protobuf>=5
TensorFlow Graph로 내보내기
앞서 설명한 SavedModel 과정을 이어서, 반환된 Keras 모델을 frozen으로 변환합니다. .pb 그래프:
from pathlib import Path
from ultralytics.utils.export import keras2pb
keras2pb(keras_model, output_file=Path("resnet18_saved_model/resnet18.pb"))
NCNN으로 내보내기
from ultralytics.utils.export import torch2ncnn
torch2ncnn(model, im, output_dir="resnet18_ncnn_model")
이 디렉토리에는 고정 이름의 param 및 bin 파일과 Python 가 포함되어 있습니다:
resnet18_ncnn_model/
├── model.ncnn.param
├── model.ncnn.bin
└── model_ncnn.py
torch2ncnn() ~을 확인합니다 ncnn 및 pnnx 처음 사용할 때.
MNN으로 내보내기
MNN 내보내기를 수행하려면 ONNX 입력으로 필요합니다. ONNX 내보낸 다음 변환하십시오:
from ultralytics.utils.export import onnx2mnn, torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
onnx2mnn("resnet18.onnx", output_file="resnet18.mnn")
지원 half=True FP16의 경우 및 int8=True INT8 양자화를 위해. 다음이 필요합니다. MNN>=2.9.6 및 torch>=1.10.
PaddlePaddle로 내보내기
from ultralytics.utils.export import torch2paddle
torch2paddle(model, im, output_dir="resnet18_paddle_model")
이 디렉토리에는 PaddlePaddle 및 파라미터 파일이 포함되어 있습니다:
resnet18_paddle_model/
├── model.pdmodel
└── model.pdiparams
필수 x2paddle 그리고 사용자의 플랫폼에 맞는 올바른 PaddlePaddle :
paddlepaddle-gpu>=3.0.0,<3.3.0CUDA에서paddlepaddle==3.0.0ARM64 CPU에서paddlepaddle>=3.0.0,<3.3.0다른 CPU에서는
NVIDIA 에서는 지원되지 않습니다.
ExecuTorch로 내보내기
from ultralytics.utils.export import torch2executorch
torch2executorch(model, im, output_dir="resnet18_executorch_model")
내보낸 .pte 파일은 출력 디렉터리에 저장됩니다:
resnet18_executorch_model/
└── model.pte
필수 torch>=2.9.0 그리고 이에 대응하는 ExecuTorch 런타임 (pip install executorch). 실행 시 사용 방법은 ExecuTorch 통합.
내보낸 모델 확인하기
내보내기 후, 배포하기 전에 PyTorch 수치적 일관성을 확인하십시오. 다음을 이용한 간단한 초기 테스트를 통해 ONNXBackend 다음에서 ultralytics.nn.backends 출력값을 비교하여 추적 또는 양자화 오류를 조기에 감지합니다:
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
예상 차이
FP32 형식으로 내보낼 경우, 최대 절대 오차는 1e-5. 차이가 클수록 지원되지 않는 연산, 잘못된 입력 형상, 또는 평가 모드가 아닌 모델을 의미합니다. FP16 및 INT8 출력 모델은 허용 오차가 더 큽니다. 임의의 텐서가 아닌 실제 데이터로 검증하십시오.
다른 런타임의 경우 입력 tensor 다를 수 있습니다. 예를 들어, OpenVINO 모델의 포워드 인자 이름(일반적으로 x (일반 모델의 경우), 반면 torch2onnx 기본값은 "images".
알려진 제한 사항
- 다중 입력 지원이 고르지 못하다:
torch2onnx및torch2openvino입력이 여러 개인 모델의 경우, 예제 텐서 튜플이나 리스트를 받아들입니다.torch2torchscript,torch2coreml,torch2ncnn,torch2paddle및torch2executorch단일 입력 tensor 가정한다. - ExecuTorch에는 다음이 필요합니다
flatc: ExecuTorch 런타임에는 FlatBuffers 컴파일러가 필요합니다. 다음 명령어로 설치하십시오.brew install flatbuffersmacOS에서 또는apt install flatbuffers-compiler우분투에서. - Ultralytics 통한 추론 없음: 내보낸YOLO 다음을 통해 다시 불러올 수 없습니다
YOLO()추론을 위해. 각 형식에 맞는 네이티브 런타임을 사용하십시오 (ONNX, OpenVINO, 등)입니다. - YOLO 형식: Axelera 및 Sony IMX500 내보내기 기능은 YOLO 전용 모델 속성이 필요하며, 일반 모델에서는 사용할 수 없습니다.
- 플랫폼별 형식: TensorRT NVIDIA GPU가 필요합니다. RKNN 다음이 필요합니다
rknn-toolkit2SDK (Linux 전용). 엣지 TPU 다음이 필요합니다edgetpu_compiler바이너리 (Linux 전용).
FAQ
Ultralytics 사용하여 어떤 모델을 내보낼 수 있나요?
어떤 torch.nn.Module. 여기에는 timm, torchvision 모델이나 사용자 정의 PyTorch 포함됩니다. 모델은 평가 모드여야 합니다 (model.eval()) 내보내기 전에. ONNX OpenVINO 다중 입력 모델의 경우 예제 텐서 튜플 OpenVINO 지원합니다.
GPU 없이도 작동하는 내보내기 형식은 무엇인가요?
지원되는 모든 형식(TorchScript, ONNX, OpenVINO, CoreML, TF SavedModel, TF Graph, NCNN, PaddlePaddle, MNN, ExecuTorch) CPU 내보낼 수 있습니다. 내보내기 과정 자체에는 GPU 필요하지 GPU . NVIDIA GPU 필요한 TensorRT .
어떤 Ultralytics 필요한가요?
Ultralytics 사용 >=8.4.38, 여기에는 다음이 포함됩니다 ultralytics.utils.export 모듈 및 표준화된 output_file/output_dir 논증들.
TorchVision 모델을 iOS CoreML 내보낼 수 있나요?
네. torchvision 분류기, 탐지기 및 분할 모델은 다음으로 내보낼 수 있습니다. .mlpackage 출처: torch2coreml. 이미지 분류 모델의 경우, 클래스 이름 목록을 classifier_names 분류 헤더에서 연산을 수행합니다. macOS 또는 Linux에서 내보내기 작업을 실행하십시오. Windows에서는 CoreML . 자세한 내용은 CoreML iOS 대한 자세한 내용은 다음과 같습니다.
내보낸 모델을 INT8 또는 FP16으로 양자화할 수 있나요?
네, 여러 형식이 있습니다. 다음 half=True FP16용 또는 int8=True OpenVINO, CoreML, MNN 또는 NCNN으로 내보낼 때 INT8을 사용하려면. OpenVINO 에서 INT8을 사용하려면 calibration_dataset 인수에 대해서는 훈련 후 양자화. 각 형식의 통합 페이지에서 양자화 관련 장단점을 확인하세요.