كيفية تصديرPyTorch YOLO باستخدام Ultralytics
عادةً ما يعني نشر PyTorch في بيئة الإنتاج التعامل مع أداة تصدير مختلفة لكل هدف: torch.onnx.export بالنسبة إلى ONN ONNX، coremltools بالنسبة لأجهزة Apple، onnx2tf بالنسبة إلى TensorFlow، pnnx بالنسبة NCNN وهكذا دواليك. لكل أداة واجهة برمجة تطبيقات (API) خاصة بها، وخصائص التبعية الخاصة بها، وقواعد الإخراج الخاصة بها.
Ultralytics أدوات تصدير مستقلة تجمع بين عدة أنظمة خلفية ضمن واجهة واحدة متسقة. يمكنك تصدير أي torch.nn.Module، بما في ذلك تيم نماذج الصور، تورشفيجن أجهزة التصنيف والكشف، أو البنى المخصصة الخاصة بك، من أجل ONNX, TorchScript, OpenVINO, CoreML, NCNN, PaddlePaddle, MNN, ExecuTorch، و TensorFlow SavedModel دون الحاجة إلى تعلم كل نظام خلفي على حدة.
لماذا يُستخدم Ultralytics YOLO ؟
- واجهة برمجة تطبيقات واحدة تغطي 10 تنسيقات: تعلم طريقة استدعاء واحدة بدلاً من عشرات الطرق.
- سطح المرافق المشتركة: يعيش مساعدو التصدير تحت
ultralytics.utils.export، لذا بمجرد تثبيت حزم الخلفية، يمكنك الحفاظ على نفس نمط الاستدعاء عبر جميع التنسيقات. - نفس مسار الكود المستخدم في YOLO : تعتمد جميعYOLO Ultralytics على نفس الأدوات المساعدة.
- تتضمن ميزات التكمية FP16 و INT8 بشكل مدمج للتنسيقات التي تدعمها (OpenVINO، CoreML، MNN، NCNN).
- يعمل على CPU: لا GPU خطوة التصدير نفسها استخدام 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 ثم قم بالتحويل.
تضمين البيانات الوصفية
تقبل العديد من وظائف التصدير معلمة اختيارية metadata قاموس (على سبيل المثال، torch2torchscript(..., metadata={"author": "me"})) التي تدمج أزواجًا مخصصة من القيم والمفاتيح في الملف النهائي الذي تم تصديره، حيثما يدعم التنسيق ذلك.
أمثلة تفصيلية
يستخدم كل مثال من الأمثلة التالية نفس الإعدادات، وهي شبكة ResNet-18 مدربة مسبقًا من مكتبة timm في وضع التقييم:
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"}})
قيمة opset الافتراضية هي 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 يدعم الإصدارات من Python . Python إلى 3.13 على أنظمة macOS وLinux. أما في Python الأحدث Python ، فلا يتم تحميل ملحق C الأصلي. استخدم Python . Python –3.13 CoreML .
التصدير إلىSavedModel في 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.0على نظام macOS (ai-edge-litert>=1.2.0(على المنصات الأخرى)onnxslim>=0.1.71onnx>=1.12.0,<2.0.0protobuf>=5
التصدير إلى مخطط TensorFlow
استكمالاً لعملية SavedModel المذكورة أعلاه، قم بتحويل نموذج Keras الذي تم إرجاعه إلى نموذج «مجمد» .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 الخاص بنظام التشغيل الخاص بك:
paddlepaddle-gpu>=3.0.0,<3.3.0على CUDApaddlepaddle==3.0.0على CPU ARM64paddlepaddle>=3.0.0,<3.3.0على معالجات أخرى
غير مدعوم على 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 flatbuffersعلى نظام macOS أوapt install flatbuffers-compilerعلى نظام أوبونتو. - لا يتم إجراء أي استدلال عبر Ultralytics: لا يمكن إعادة تحميلYOLO التي تم تصديرها (YOLO ) من خلال
YOLO()للاستدلال. استخدم بيئة التشغيل الأصلية لكل تنسيق (ONNX, OpenVINO، إلخ). - التنسيقاتYOLO: تتطلب عمليات التصدير باستخدام Axelera و Sony IMX500 سمات نموذج YOLO وهي غير متاحة للنماذج العامة.
- التنسيقات الخاصة بالمنصات: TensorRT يتطلب وحدةGPU NVIDIA . RKNN يتطلب
rknn-toolkit2حزمة أدوات التطوير (لنظام Linux فقط). Edge TPU يتطلبedgetpu_compilerثنائي (لنظام لينكس فقط).
الأسئلة الشائعة
ما هي النماذج التي يمكنني تصديرها باستخدام Ultralytics؟
أي torch.nn.Module. ويشمل ذلك نماذج من timm أو torchvision أو أي PyTorch مخصص. يجب أن يكون النموذج في وضع التقييم (model.eval()) قبل التصدير. OpenVINO يقبل كل ONNX OpenVINO مجموعة من متجهات التنسور النموذجية للنماذج متعددة المدخلات.
ما هي تنسيقات التصدير التي تعمل بدون وحدة معالجة GPU؟
يمكن تصدير جميع التنسيقات المدعومة (TorchScript ONNX OpenVINO CoreML TF SavedModel، TF Graph، NCNN، PaddlePaddle MNN، ExecuTorch) باستخدام CPU. ولا GPU عملية التصدير نفسها GPU . TensorRT التنسيق الوحيد الذي يتطلب استخدامGPU NVIDIA .
ما هو Ultralytics الذي أحتاجه؟
استخدم Ultralytics >=8.4.38، والذي يشمل ultralytics.utils.export الوحدة النمطية والمعيارية output_file/output_dir الحجج.
هل يمكنني تصدير نموذج TorchVision إلى CoreML iOS ؟
نعم. يتم تصدير مصنفات ومستشعرات ونماذج التجزئة الخاصة بـ torchvision إلى .mlpackage عبر torch2coreml. بالنسبة لنماذج تصنيف الصور، قم بتمرير قائمة بأسماء الفئات إلى classifier_names للخبز في وحدة تصنيف. قم بتشغيل عملية التصدير على نظام macOS أو Linux. لا CoreML نظام Windows CoreML . انظر CoreML للحصول على تفاصيل iOS .
هل يمكنني تكمية النموذج الذي قمت بتصديره إلى INT8 أو FP16؟
نعم، لعدة تنسيقات. تابع half=True لـ FP16 أو int8=True لـ INT8 عند التصدير إلى OpenVINO أو CoreML أو MNN أو NCNN. OpenVINO يتطلب INT8 في OpenVINO calibration_dataset وسيطة لـ التكمية بعد التدريب. راجع صفحة التكامل الخاصة بكل تنسيق لمعرفة المفاضلات المتعلقة بالتكمية.