تصدير نماذج الذكاء الاصطناعي (Pickle & Joblib) لاستخدامها لاحقاً في الـ Backend
تصدير نماذج الذكاء الاصطناعي Pickle و Joblib لاستخدامها لاحقاً في الـ Backend
بعد الانتهاء من تدريب نموذج Machine Learning بنجاح، تبدأ مرحلة لا تقل أهمية عن التدريب نفسه: كيف نحفظ هذا النموذج وننقله إلى بيئة الإنتاج ليعمل داخل تطبيق Backend بسرعة وثبات؟ هنا تظهر أهمية أدوات مثل Pickle وJoblib في تحويل الكائنات البرمجية المدربة إلى ملفات قابلة للاستدعاء لاحقاً.
الفكرة الجوهرية هي أن النموذج المدرب ليس مجرد معادلة، بل كائن يحتوي على معاملات، بنية داخلية، وربما خطوات معالجة مسبقة ضمن Pipeline كاملة. لذلك فإن إعادة التدريب عند كل تشغيل للتطبيق تُعد ممارسة غير عملية، خصوصاً عند التعامل مع أحجام بيانات كبيرة أو بنى معالجة متقدمة جرى إعدادها في مراحل سابقة مثل إعداد البيانات للتدريب (Data Preprocessing): تحجيم البيانات (Scaling & Normalization) أو هندسة الميزات (Feature Engineering): كيف تستخرج بيانات جديدة من البيانات الحالية؟.
ما المقصود بتصدير النموذج؟
تصدير النموذج يعني حفظ كائن النموذج المدرب من الذاكرة إلى ملف على القرص، ثم إعادة تحميله لاحقاً داخل خدمة ويب، واجهة API، أو نظام تنبؤ دفعي Batch Inference. بهذه الطريقة يصبح النموذج جاهزاً لاستقبال مدخلات جديدة وإرجاع التوقعات دون إعادة عمليات التدريب المكلفة.
في بيئات البيانات الحديثة، يتم هذا التصدير عادة بعد مراحل التنظيف، التحويل، والتقييم. وإذا كنت قد بنيت فهمك للمراحل السابقة من خلال تقسيم البيانات (Train/Test Split): لماذا يجب أن نختبر النموذج على بيانات لم يرها من قبل؟ وتقييم نماذج الانحدار (MSE, RMSE, R2): كيف تعرف أن توقعات الذكاء الاصطناعي دقيقة؟، فستدرك أن مرحلة الحفظ تأتي بعد التأكد من أن النموذج صالح فعلاً للإنتاج.
الفرق بين Pickle وJoblib
Pickle هي مكتبة معيارية في بايثون تُستخدم لتحويل الكائنات إلى تمثيل ثنائي يمكن حفظه أو نقله. تمتاز بالمرونة وتدعم طيفاً واسعاً من الكائنات البرمجية. أما Joblib فهي أكثر ملاءمة غالباً عند حفظ النماذج التي تحتوي على مصفوفات كبيرة من NumPy.
Pickle: مناسب للاستخدام العام وسهل ومباشر.Joblib: أفضل عادة مع النماذج الأكبر أو التي تحتوي على بيانات عددية كثيفة.- كلاهما لا يعيدان تدريب النموذج، بل يعيدان بنية الكائن كما كانت لحظة الحفظ.
في أنظمة الإنتاج، لا تختَر أداة الحفظ بناءً على الشهرة فقط، بل على حجم النموذج، زمن التحميل، وطبيعة البنية الداخلية. النماذج التي تعتمد على مصفوفات كبيرة أو خطوات تحويل متعددة داخل
Pipelineقد تستفيد أكثر منJoblibعند النشر.
بناء نموذج ثم تصديره بشكل صحيح
أفضل ممارسة ليست حفظ النموذج وحده، بل حفظ سلسلة المعالجة الكاملة. فإذا قمت أثناء التدريب بتحجيم البيانات أو ترميز القيم الفئوية، يجب أن تُحفظ هذه الخطوات أيضاً. وإلا ستظهر فجوة بين ما رآه النموذج أثناء التدريب وما يصله لاحقاً من التطبيق.
لهذا السبب يُنصح ببناء Pipeline موحدة تجمع التحويلات والنموذج النهائي. هذا النهج يقلل الأخطاء التشغيلية ويحسّن قابلية الصيانة، خاصة عند تطوير خدمات تنبؤ متكررة أو العمل ضمن فريق MLOps.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import joblib
import pickle
# بيانات تجريبية
data = pd.DataFrame({
"age": [22, 35, 58, 44, 27, 39, 61, 48],
"salary": [3000, 7000, 12000, 9000, 4000, 8500, 15000, 9500],
"purchased": [0, 1, 1, 1, 0, 1, 1, 0]
})
X = data[["age", "salary"]]
y = data["purchased"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42
)
pipeline = Pipeline([
("scaler", StandardScaler()),
("model", RandomForestClassifier(n_estimators=100, random_state=42))
])
pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)
print("Accuracy:", accuracy_score(y_test, predictions))
# الحفظ باستخدام Joblib
joblib.dump(pipeline, "customer_purchase_model.joblib")
# الحفظ باستخدام Pickle
with open("customer_purchase_model.pkl", "wb") as file:
pickle.dump(pipeline, file)
كيف نعيد تحميل النموذج داخل الـ Backend؟
بعد الحفظ، تأتي مرحلة الدمج مع التطبيق. في معظم تطبيقات الويب، يتم تحميل النموذج مرة واحدة عند بدء تشغيل الخدمة، ثم يُستخدم مراراً لاستقبال الطلبات. هذا الأسلوب أكثر كفاءة من إعادة قراءة الملف في كل طلب Request.
import joblib
import pandas as pd
model = joblib.load("customer_purchase_model.joblib")
new_data = pd.DataFrame([{
"age": 31,
"salary": 7800
}])
prediction = model.predict(new_data)
probability = model.predict_proba(new_data)
print("Prediction:", prediction[0])
print("Probability:", probability[0].tolist())
إذا كنت تستخدم إطار عمل مثل Flask أو FastAPI، فإن هذا النموذج يمكن ربطه مباشرة بنقطة نهاية تستقبل JSON وتحوله إلى DataFrame قبل التنبؤ. وهنا تظهر أهمية أن تكون أسماء الأعمدة وأنواع البيانات مطابقة تماماً لما استُخدم وقت التدريب، وهي فكرة ترتبط عملياً بما تعلمته في مكتبة Pandas (2): استكشاف هيكل البيانات وفهم DataFrame و Series.
أخطاء شائعة عند تصدير النماذج
1. حفظ النموذج دون خطوات المعالجة
من أكبر الأخطاء حفظ المصنف فقط وترك عمليات التنظيف أو التحجيم خارج الملف. عندها سيستقبل Backend بيانات خاماً مختلفة عن بيانات التدريب، فتتدهور جودة التنبؤات.
2. اختلاف الإصدارات البرمجية
قد يُحفَظ النموذج في بيئة تحتوي إصداراً معيناً من scikit-learn ثم يُحمَّل في خادم يستخدم إصداراً آخر. هذا الاختلاف قد يسبب أخطاء في فك الكائن أو سلوكاً غير متوقع.
3. تجاهل أمن الملفات
ملفات Pickle وJoblib ليست آمنة للتحميل من مصادر غير موثوقة، لأنها قد تنفذ كوداً خبيثاً أثناء الاسترجاع. لذلك يجب دائماً التعامل معها كملفات داخلية موثوقة فقط.
في المشاريع الكبيرة، من الأفضل حفظ النموذج مع ملف توصيف جانبي يتضمن إصدار المكتبات، أسماء الميزات، تاريخ التدريب، ومؤشرات الأداء. هذه الممارسة ترفع موثوقية النشر وتسهّل التحقيق عند تراجع الجودة في الإنتاج.
دور تصدير النماذج في بيئات البيانات الضخمة
في سياقات Big Data، قد يتم تدريب النموذج باستخدام بيئات موزعة مثل Apache Spark أو بعد تمرير البيانات عبر خطوط ETL معقدة. لكن النشر النهائي قد يكون في خدمة خفيفة تتعامل مع آلاف الطلبات اللحظية. لذلك يصبح التصدير هو الجسر بين بيئة التدريب الثقيلة وبيئة الاستهلاك السريع.
هذا الفصل بين التدريب والنشر أساسي معمارياً؛ فعمليات التنظيف والتوحيد مثل تنظيف البيانات (Data Cleaning): اكتشاف ومعالجة القيم المفقودة (Missing Values) ومعالجة البيانات المكررة والمشوهة (Duplicates & Outliers) باستخدام بايثون قد تتم على دفعات كبيرة، بينما يحتاج التطبيق الأمامي أو Backend إلى نموذج جاهز فقط للاستدلال Inference.
متى تختار Pickle ومتى تختار Joblib؟
- استخدم
Pickleعندما تريد حلاً عاماً وبسيطاً لحفظ الكائنات البرمجية. - استخدم
Joblibعندما يكون النموذج أكبر حجماً أو يعتمد بكثافة على مصفوفات عددية. - اختبر زمن التحميل والذاكرة المستهلكة قبل اعتماد الأداة في الإنتاج.
- احفظ دائماً النسخة النهائية بعد اكتمال التقييم وليس أثناء التجارب المؤقتة.
خلاصة عملية
تصدير نماذج الذكاء الاصطناعي ليس خطوة ثانوية، بل جزء حاسم من دورة حياة النموذج. باستخدام Pickle أو Joblib يمكنك نقل النموذج من مرحلة التدريب إلى مرحلة التشغيل الحقيقي بكفاءة عالية، بشرط أن تحفظ معه المعالجة المسبقة، وتضبط الإصدارات، وتتعامل مع الملفات كمكونات موثوقة وآمنة.
وعندما يُبنى هذا المسار بشكل صحيح، يصبح النموذج المدرب أصلًا إنتاجياً قابلاً لإعادة الاستخدام داخل التطبيقات، لوحات التحكم، أو خدمات التنبؤ الفوري. وهذا هو الفرق الحقيقي بين تجربة تعليمية في Notebook وبين نظام ذكاء اصطناعي جاهز للعمل داخل بيئة Production.
3 comments