Link to this sectionكيفية تصدير نماذج PyTorch غير التابعة لـ YOLO باستخدام Ultralytics#
عادة ما يعني نشر نماذج PyTorch في بيئة الإنتاج التعامل مع أداة تصدير مختلفة لكل هدف: torch.onnx.export لـ ONNX، وcoremltools لأجهزة Apple، وonnx2tf لـ TensorFlow، وpnnx لـ NCNN، وما إلى ذلك. لكل أداة واجهة برمجة تطبيقات (API) خاصة بها، وخصائص تبعيات فريدة، واتفاقيات مخرجات معينة.
توفر Ultralytics أدوات تصدير مستقلة تغلف خوادم خلفية متعددة (backends) خلف واجهة واحدة متسقة. يمكنك تصدير أي torch.nn.Module، بما في ذلك نماذج الصور timm، ومصنفات وكاشفات torchvision، أو بنياتك المخصصة، إلى ONNX، وTorchScript، وOpenVINO، وCoreML، وNCNN، وPaddlePaddle، وMNN، وExecuTorch، وTensorFlow SavedModel دون الحاجة لتعلم كل خادم خلفي على حدة.
Link to this sectionلماذا تستخدم Ultralytics لتصدير النماذج غير التابعة لـ YOLO؟#
- واجهة برمجة تطبيقات (API) واحدة عبر 10 تنسيقات: تعلم اتفاقية استدعاء واحدة بدلاً من اثنتي عشرة.
- سطح أداة مشترك: توجد أدوات المساعدة في التصدير تحت
ultralytics.utils.export، لذا بمجرد تثبيت حزم الخادم الخلفي، يمكنك الاحتفاظ بنفس نمط الاستدعاء عبر التنسيقات المختلفة. - نفس مسار التعليمات البرمجية لتصدير YOLO: نفس أدوات المساعدة التي تشغل كل عمليات تصدير Ultralytics YOLO.
- تكميم FP16 و INT8 مضمن للتنسيقات التي تدعم ذلك (OpenVINO و CoreML و MNN و NCNN).
- يعمل على CPU: لا يتطلب GPU لخطوة التصدير نفسها، لذا يمكنك تشغيله محلياً على أي حاسوب محمول.
Link to this sectionبداية سريعة#
المسار الأسرع هو تصدير في خطوتين إلى 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")Link to this sectionتنسيقات التصدير المدعومة#
تأخذ دوال torch2* نموذج torch.nn.Module قياسياً وموتر إدخال مثالياً. تمر MNN و TF SavedModel و TF Frozen 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 Frozen Graph | 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/ |
تتم عمليات تصدير MNN و TF SavedModel و TF Frozen Graph عبر ONNX كخطوة وسيطة. قم بالتصدير إلى ONNX أولاً، ثم التحويل.
تقبل العديد من دوال التصدير قاموس metadata اختيارياً (مثل torch2torchscript(..., metadata={"author": "me"})) الذي يضمن أزواج مفتاح-قيمة مخصصة في الملف المُصدَّر إذا كان التنسيق يدعم ذلك.
Link to this sectionأمثلة خطوة بخطوة#
يستخدم كل مثال أدناه نفس الإعداد، وهو نموذج ResNet-18 مُدرب مسبقاً من timm في وضع التقييم:
import timm
import torch
model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)تعمل طبقات الإسقاط (Dropout)، وتسوية الدفعات، وغيرها من الطبقات المخصصة للتدريب فقط بشكل مختلف أثناء الاستدلال. يؤدي تخطي .eval() إلى إنتاج ملفات مُصدَّرة بمخرجات غير صحيحة.
Link to this sectionالتصدير إلى 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.
Link to this sectionالتصدير إلى TorchScript#
لا حاجة لتبعيات إضافية. يستخدم torch.jit.trace خلف الكواليس.
from ultralytics.utils.export import torch2torchscript
torch2torchscript(model, im, output_file="resnet18.torchscript")Link to this sectionالتصدير إلى 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.
Link to this sectionالتصدير إلى 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.
توفر coremltools>=9.0 حزم wheels لـ Python 3.10–3.13 على macOS و Linux. في إصدارات Python الأحدث، يفشل تحميل امتداد C الأصلي. استخدم Python 3.10–3.13 لتصدير CoreML.
Link to this sectionالتصدير إلى 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
Link to this sectionالتصدير إلى TensorFlow Frozen Graph#
استكمالاً لتصدير SavedModel أعلاه، قم بتحويل نموذج Keras المرجع إلى مخطط .pb مجمد:
from pathlib import Path
from ultralytics.utils.export import keras2pb
keras2pb(keras_model, output_file=Path("resnet18_saved_model/resnet18.pb"))Link to this sectionالتصدير إلى 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 عند الاستخدام لأول مرة.
Link to this sectionالتصدير إلى 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.
Link to this sectionالتصدير إلى 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على CUDApaddlepaddle==3.0.0على ARM64 CPUpaddlepaddle>=3.0.0,<3.3.0على CPUs الأخرى
غير مدعوم على NVIDIA Jetson.
Link to this sectionالتصدير إلى 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.
Link to this sectionتحقق من نموذجك المُصدَّر#
بعد التصدير، تحقق من التكافؤ العددي مع نموذج 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(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 لها تفاوتات أكثر مرونة. تحقق من البيانات الحقيقية بدلاً من المصفوفات العشوائية.
بالنسبة لأوقات التشغيل الأخرى، قد يختلف اسم مصفوفة الإدخال. على سبيل المثال، يستخدم OpenVINO اسم وسيط التمرير للنموذج (عادةً x للنماذج العامة)، بينما يستخدم torch2onnx القيمة الافتراضية "images".
Link to this sectionالقيود المعروفة#
- دعم المدخلات المتعددة غير متساوٍ: تقبل
torch2onnxوtorch2openvinoصفاً أو قائمة من مصفوفات الأمثلة للنماذج ذات المدخلات المتعددة. بينما تفترضtorch2torchscriptوtorch2coremlوtorch2ncnnوtorch2paddleوtorch2executorchوجود مصفوفة إدخال واحدة. - ExecuTorch يحتاج إلى
flatc: تتطلب بيئة تشغيل ExecuTorch مترجم FlatBuffers. قم بالتثبيت باستخدامbrew install flatbuffersعلى macOS أوapt install flatbuffers-compilerعلى Ubuntu. - لا يوجد استنتاج عبر Ultralytics: لا يمكن تحميل النماذج غير التابعة لـ YOLO التي تم تصديرها مرة أخرى عبر
YOLO()للاستنتاج. استخدم وقت التشغيل الأصلي لكل تنسيق (ONNX Runtime، OpenVINO Runtime، إلخ). - تنسيقات YOLO فقط: تتطلب تصديرات Axelera وSony IMX500 سمات نموذج خاصة بـ YOLO وغير متاحة للنماذج العامة.
- تنسيقات خاصة بالمنصة: يتطلب TensorRT وجود وحدة معالجة رسومات NVIDIA. يتطلب RKNN حزمة SDK
rknn-toolkit2(لنظام Linux فقط). يتطلب Edge TPU ثنائيedgetpu_compiler(لنظام Linux فقط).
Link to this sectionالأسئلة الشائعة#
Link to this sectionما هي النماذج التي يمكنني تصديرها باستخدام Ultralytics؟#
أي torch.nn.Module. وهذا يشمل النماذج من timm أو torchvision أو أي نموذج PyTorch مخصص. يجب أن يكون النموذج في وضع التقييم (model.eval()) قبل التصدير. بالإضافة إلى ذلك، تقبل ONNX وOpenVINO صفاً من مصفوفات الأمثلة للنماذج ذات المدخلات المتعددة.
Link to this sectionأي تنسيقات التصدير تعمل بدون وحدة معالجة رسومات (GPU)؟#
جميع التنسيقات المدعومة (TorchScript، ONNX، OpenVINO، CoreML، TF SavedModel، TF Frozen Graph، NCNN، PaddlePaddle، MNN، ExecuTorch) يمكن تصديرها على وحدة المعالجة المركزية (CPU). لا يلزم وجود وحدة معالجة رسومات لعملية التصدير نفسها. TensorRT هو التنسيق الوحيد الذي يتطلب وحدة معالجة رسومات NVIDIA.
Link to this sectionما هو إصدار Ultralytics الذي أحتاجه؟#
استخدم Ultralytics >=8.4.38، والذي يتضمن وحدة ultralytics.utils.export والوسيطات القياسية output_file/output_dir.
Link to this sectionهل يمكنني تصدير نموذج torchvision إلى CoreML للنشر على iOS؟#
نعم. يتم تصدير نماذج التصنيف والكشف والتقسيم في torchvision إلى .mlpackage عبر torch2coreml. بالنسبة لنماذج تصنيف الصور، قم بتمرير قائمة بأسماء الفئات إلى classifier_names لإدراج رأس تصنيف. قم بتشغيل التصدير على macOS أو Linux. CoreML غير مدعوم على Windows. راجع تكامل CoreML للحصول على تفاصيل النشر على iOS.
Link to this sectionهل يمكنني تكميم النموذج المُصدَّر الخاص بي إلى INT8 أو FP16؟#
نعم، للعديد من التنسيقات. قم بتمرير half=True لـ FP16 أو int8=True لـ INT8 عند التصدير إلى OpenVINO أو CoreML أو MNN أو NCNN. يتطلب INT8 في OpenVINO بالإضافة إلى ذلك وسيط calibration_dataset لـ تكميم ما بعد التدريب. راجع صفحة تكامل كل تنسيق لمعرفة مقايضات التكميم.