콘텐츠로 건너뛰기

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, ExecuTorchTensorFlow 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 전용 속성은 필요하지 않습니다.

형식기능설치출력
ONNXtorch2onnx()pip install onnx.onnx 파일
TorchScripttorch2torchscript()PyTorch에 포함되어 있음.torchscript 파일
OpenVINOtorch2openvino()pip install openvino_openvino_model/ 디렉토리
CoreMLtorch2coreml()pip install coremltools.mlpackage
TF SavedModelonnx2saved_model()자세한 요건은 아래를 참조하십시오_saved_model/ 디렉토리
TF 그래프keras2pb()자세한 요건은 아래를 참조하십시오.pb 파일
NCNNtorch2ncnn()pip install ncnn pnnx_ncnn_model/ 디렉토리
MNNonnx2mnn()pip install MNN.mnn 파일
PaddlePaddletorch2paddle()pip install paddlepaddle x2paddle_paddle_model/ 디렉토리
ExecuTorchtorch2executorch()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.xmlmodel.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.11numpy<=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.0
  • onnx2tf>=1.26.3,<1.29.0
  • tf_keras<=2.19.0
  • sng4onnx>=1.0.1
  • onnx_graphsurgeon>=0.3.26 (다음과 같이 설치하십시오) --extra-index-url https://pypi.ngc.nvidia.com)
  • ai-edge-litert>=1.2.0,<1.4.0 macOS에서 (ai-edge-litert>=1.2.0 (다른 플랫폼에서는)
  • onnxslim>=0.1.71
  • onnx>=1.12.0,<2.0.0
  • protobuf>=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() ~을 확인합니다 ncnnpnnx 처음 사용할 때.

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.6torch>=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.0 CUDA에서
  • paddlepaddle==3.0.0 ARM64 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".

알려진 제한 사항

  • 다중 입력 지원이 고르지 못하다: torch2onnxtorch2openvino 입력이 여러 개인 모델의 경우, 예제 텐서 튜플이나 리스트를 받아들입니다. torch2torchscript, torch2coreml, torch2ncnn, torch2paddletorch2executorch 단일 입력 tensor 가정한다.
  • ExecuTorch에는 다음이 필요합니다 flatc: ExecuTorch 런타임에는 FlatBuffers 컴파일러가 필요합니다. 다음 명령어로 설치하십시오. brew install flatbuffers macOS에서 또는 apt install flatbuffers-compiler 우분투에서.
  • Ultralytics 통한 추론 없음: 내보낸YOLO 다음을 통해 다시 불러올 수 없습니다 YOLO() 추론을 위해. 각 형식에 맞는 네이티브 런타임을 사용하십시오 (ONNX, OpenVINO, 등)입니다.
  • YOLO 형식: AxeleraSony IMX500 내보내기 기능은 YOLO 전용 모델 속성이 필요하며, 일반 모델에서는 사용할 수 없습니다.
  • 플랫폼별 형식: TensorRT NVIDIA GPU가 필요합니다. RKNN 다음이 필요합니다 rknn-toolkit2 SDK (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 인수에 대해서는 훈련 후 양자화. 각 형식의 통합 페이지에서 양자화 관련 장단점을 확인하세요.



📅 0일 전 생성 ✏️ 0일 전 업데이트
raimbekovm

댓글