الذكاء الاصطناعي 2 دقائق للقراءة

أفضل الممارسات لتحويل نماذج التعلم الآلي إلى تنسيق ONNX والنشر باستخدام ONNX Runtime لتطبيقات الذكاء الاصطناعي عالية الأداء

PROFSCODE Ekibi 22 يوليو 2026
Paylaş:
تحسين ونشر نماذج التعلم الآلي عبر الأنظمة الأساسية باستخدام ONNX Runtime في بايثون

عند تطوير تطبيقات الذكاء الاصطناعي الحديثة، يعد التشغيل الفعال والمتوافق لنماذج التعلم الآلي المدربة في بيئات الإنتاج تحديًا حاسمًا. تمتلك أطر التعلم العميق المختلفة (PyTorch, TensorFlow، إلخ) معاييرها الخاصة لتنسيقات النماذج، مما قد يعقد النشر عبر الأنظمة الأساسية وتحسين الأداء. وهنا يأتي دور ONNX (Open Neural Network Exchange) و ONNX Runtime.

ما هو ONNX ولماذا هو مهم؟

ONNX هو معيار تنسيق مفتوح المصدر لنماذج الذكاء الاصطناعي. يتيح هذا المعيار للمطورين نقل النماذج بسهولة من إطار عمل إلى آخر وتشغيلها في بيئات أجهزة/برامج مختلفة. من خلال تحويل نموذج إلى تنسيق ONNX، نجعله مستقلاً عن الإطار الذي تم تدريبه فيه. يوفر هذا مزايا كبيرة، خاصة في السيناريوهات التالية:

  • دمج النماذج المطورة في أطر عمل تعلم آلي مختلفة في تنسيق واحد.
  • نقل النماذج إلى أهداف نشر متنوعة مثل الويب، والجوال، وأجهزة الحافة، والسحابة.
  • الاستفادة من المسرعات المتخصصة (GPU, TPU, NPU، إلخ) لتحسين الأداء.

ONNX Runtime: محرك استدلال عالي الأداء

ONNX Runtime هو محرك استدلال عالي الأداء وعابر للأنظمة الأساسية يقوم بتشغيل النماذج بتنسيق ONNX. يمكنه الاندماج مع الأطر الشائعة مثل PyTorch و TensorFlow ويقدم مجموعة واسعة من تسريع الأجهزة، من وحدة المعالجة المركزية (CPU) إلى وحدة معالجة الرسوميات (GPU) (CUDA, TensorRT)، وحتى الأجهزة المتخصصة (Intel OpenVINO, AMD ROCm). تشمل المزايا الرئيسية لـ ONNX Runtime ما يلي:

  • أداء عالٍ: يتميز بتحسينات بيانية مدمجة تقلل وقت الاستدلال وتحسن استخدام الموارد.
  • دعم عبر الأنظمة الأساسية: يعمل على العديد من أنظمة التشغيل مثل Windows, Linux, macOS, Android, iOS.
  • المرونة: يدعم مسرعات الأجهزة المختلفة (Execution Providers).

تحويل نموذج PyTorch إلى تنسيق ONNX باستخدام بايثون

يعد تحويل نموذج PyTorch إلى ONNX أمرًا بسيطًا للغاية. أولاً، دعنا ننشئ وندرب نموذج PyTorch صغيرًا (أو نستخدم نموذجًا مدربًا مسبقًا).

import torch
import torch.nn as nn
import torch.optim as optim

# 1. تعريف نموذج PyTorch بسيط
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc = nn.Linear(10, 2) # 10 مدخلات، 2 مخرجات
    
    def forward(self, x):
        return self.fc(x)

# إنشاء النموذج وتحميل الأوزان (أو التدريب)
model = SimpleModel()
# افترض أنك قمت بتدريب نموذجك أو تحميل أوزان مدربة مسبقًا هنا
# على سبيل المثال، دعنا ننشئ أوزانًا عشوائية
dummy_input = torch.randn(1, 10) # عينة واحدة، 10 ميزات

# وضع النموذج في وضع التقييم
model.eval()

# 2. تحويل نموذج PyTorch إلى ONNX
onnx_path = "simple_pytorch_model.onnx"
torch.onnx.export(
    model,
    dummy_input,
    onnx_path,
    export_params=True,
    opset_version=11, # اختر إصدار opset مدعومًا
    do_constant_folding=True,
    input_names=['input'],
    output_names=['output'],
    dynamic_axes={'input': {0: 'batch_size'}, 'output': {0: 'batch_size'}} # تمكين حجم الدفعة الديناميكي
)

print(f"تم تحويل نموذج PyTorch بنجاح إلى تنسيق ONNX: {onnx_path}")

تحويل نموذج TensorFlow/Keras إلى تنسيق ONNX باستخدام بايثون

لتحويل نماذج TensorFlow أو Keras إلى ONNX، يمكننا استخدام مكتبة tf2onnx. قد تحتاج إلى تثبيت هذه المكتبة أولاً: pip install tf2onnx

import tensorflow as tf
import tf2onnx
from onnx.mapping import TENSOR_TYPE_TO_NP_TYPE

# 1. تعريف نموذج Keras بسيط
model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, activation='relu', input_shape=(5,)), # 5 مدخلات
    tf.keras.layers.Dense(2, activation='softmax') # 2 مخرجات
])

# تدريب النموذج أو تحميل الأوزان
# على سبيل المثال، دعنا نقوم بتجميع النموذج
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# التحقق من إخراج النموذج ببيانات عشوائية (اختياري)
dummy_input = tf.random.normal((1, 5))
_ = model(dummy_input) # التأكد من أن النموذج يبني هيكله

# 2. تحويل نموذج Keras إلى ONNX
onnx_path = "simple_keras_model.onnx"
input_signature = [tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype, name=model.inputs[0].name)]

model_proto, _ = tf2onnx.convert.from_keras(model, input_signature, opset=11, output_path=onnx_path)

print(f"تم تحويل نموذج Keras بنجاح إلى تنسيق ONNX: {onnx_path}")

إجراء الاستدلال باستخدام ONNX Runtime

دعنا نرى كيفية تشغيل نموذج ONNX الذي قمنا بتحويله باستخدام ONNX Runtime. ينطبق هذا على النماذج المحولة من PyTorch و TensorFlow.

import onnxruntime as ort
import numpy as np

# تحميل نموذج ONNX الذي حفظناه سابقًا
onnx_model_path = "simple_pytorch_model.onnx" # أو "simple_keras_model.onnx"

# إنشاء جلسة ONNX Runtime
# إذا كنت تريد استخدام وحدة معالجة الرسوميات (GPU): providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
# ولكنك تحتاج إلى تثبيت ONNX Runtime لوحدة معالجة الرسوميات (CUDA) أولاً (pip install onnxruntime-gpu)
sess_options = ort.SessionOptions()
session = ort.InferenceSession(onnx_model_path, sess_options, providers=['CPUExecutionProvider'])

# الحصول على أسماء المدخلات والمخرجات للنموذج
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name

# إنشاء بيانات إدخال عشوائية (بالشكل والنوع المتوقعين للنموذج)
# لمثال نموذج PyTorch (1, 10) float32
input_data = np.random.rand(1, 10).astype(np.float32) 
# لمثال نموذج Keras (1, 5) float32
# input_data = np.random.rand(1, 5).astype(np.float32) 

# إجراء الاستدلال
outputs = session.run([output_name], {input_name: input_data})

print("نتائج الاستدلال باستخدام ONNX Runtime:")
print(outputs[0])

نصائح الأداء وأفضل الممارسات

  • الإصدار الصحيح لـ Opset: تأكد من أن إصدار opset الذي تستخدمه أثناء التحويل مدعوم من قبل إصدار ONNX Runtime المستهدف.
  • أشكال الإدخال الديناميكية: إذا كان نموذجك يحتاج إلى دعم أحجام دفعات مختلفة أو أبعاد إدخال متغيرة، فحدد ذلك أثناء تحويل ONNX باستخدام معلمة dynamic_axes.
  • تسريع الأجهزة (Execution Providers): يدعم ONNX Runtime مسرعات أجهزة مختلفة (Execution Providers). على سبيل المثال، يمكن أن يوفر استخدام CUDAExecutionProvider أو TensorRTExecutionProvider لوحدات معالجة الرسوميات من NVIDIA تحسينات كبيرة في الأداء مقارنة بوحدة المعالجة المركزية (CPU). تذكر تثبيت المكتبات ذات الصلة (onnxruntime-gpu) وتحديد قائمة providers عند إنشاء الجلسة.
  • تحسينات الرسم البياني: يقوم ONNX Runtime تلقائيًا بتحسين رسوم بيانية النموذج. ومع ذلك، يمكنك زيادة الأداء عن طريق تطبيق تحسينات إضافية أو تقنيات مثل التكميم (quantization) لسيناريوهات محددة.
  • التحقق من صحة النموذج: تحقق من صحة نموذج ONNX المحول عن طريق التحقق مما إذا كان ينتج نفس الإخراج مثل النموذج في الإطار الأصلي.

الخاتمة

يعد ONNX و ONNX Runtime ثنائيًا قويًا يبسط نشر نماذج التعلم الآلي ويعزز أدائها. باستخدام هذه الأدوات، يمكن للمطورين التحرر من تبعيات النموذج، وإجراء استدلال عالي الأداء على منصات أجهزة مختلفة، ونقل تطبيقات الذكاء الاصطناعي إلى الإنتاج بشكل أسرع وأكثر كفاءة. أصبح تعلم هذه التقنيات مهارة لا غنى عنها لمطوري البرامج وعشاق الذكاء الاصطناعي عند بناء بنى تحتية حديثة للذكاء الاصطناعي.

العودة إلى المدونة

التعليقات (0)

لا توجد تعليقات بعد. كن أول من يعلق!

إرسال التعليق