كيفية نشر نموذج التعلم الآلي؟
في السنوات الأخيرة، اكتسب التعلم الآلي والذكاء الاصطناعي شعبية كبيرة. ويُعزى ذلك على الأرجح إلى التطورات في معالجة اللغة الطبيعية وأنظمة التوصية.
تقدم هذه المقالة تعريفًا بالتعلّم الآلي وتطبيقاته وخيارات النشر وتوضح كيفية نشر نموذج بسيط للتعلّم الآلي على حاويات Back4app.
Contents
ما هو التعلّم الآلي؟
التعلم الآلي هو مجال فرعي للذكاء الاصطناعي. ويعتمد في جوهره على الخوارزميات الإحصائية للتعلم من البيانات والتنبؤ بالبيانات الجديدة غير المرئية.
وبعبارة أخرى، يمنح الحواسيب القدرة على التعلم دون أن تتم برمجتها بشكل صريح.
في حين أن التعلّم الآلي والذكاء الاصطناعي غالباً ما يُستخدمان بالتبادل، إلا أنهما ليسا متماثلين.
يركز التعلم الآلي على الخوارزميات وهياكل البيانات، في حين أن الذكاء الاصطناعي هو محاولة عامة لخلق آلات قادرة على التفكير مثل الإنسان.
تقنيات التعلم الآلي النموذجية هي تقنيات الانحدار (التنبؤ بقيمة مستمرة، مثل سعر المنزل) والتصنيف (التنبؤ بفئة من مجموعة محدودة من الفئات، مثل نوع الفيلم).
بشكل عام، يمكننا تقسيم التعلم الآلي إلى ثلاثة أنواع:
- التعلّم الخاضع للإشراف – تتعلم الخوارزميات باستخدام مجموعة بيانات مصنفة. يحتوي كل مثال في مجموعة البيانات على تسمية (أو ما يسمى بالمتغير الهدف). تستخدم الخوارزمية هذه الخوارزميات لتوقع التسميات للأمثلة غير المرئية. وتتضمن خوارزميات التعلّم الخاضع للإشراف خوارزمية kNN وDecision trees وغيرها.
- التعلّم غير الخاضع للإشراف – تتعلم الخوارزميات دون أي توجيه صريح. الأمر متروك للخوارزمية للعثور على أنماط في البيانات وإجراء تنبؤات بناءً عليها. مثال على الخوارزمية هي خوارزمية التجميع k-means.
- التعلم المعزز – تتعلم الخوارزميات من خلال التجربة والخطأ. وهي عادةً ما تعتمد على المكافأة، وهدف الخوارزمية هو تعظيم المكافأة. مثال: الخوارزميات الجينية.
في الجزء العملي من المقالة، سنستعرض عملية بناء نموذج نموذجي. سنقوم بحل مهمة تصنيف باستخدام التعلّم تحت الإشراف.
تطبيقات التعلم الآلي
لنلقِ نظرة على بعض تطبيقات التعلم الآلي في العالم الحقيقي!
أنظمة التوصية
تقترح أنظمة التوصية العناصر (الأفلام والمنتجات وغيرها) التي يجب أن يستهلكها المستخدم. يمكن أن تكون هذه الأنظمة إما قائمة على المحتوى أو قائمة على التعاون.
تستخدم كل شركة تقريبًا في هذه الأيام أنظمة إعادة التقييم. فهي تتيح للشركات زيادة نجاح الأعمال التجارية، وخلق طلب إضافي، وزيادة مشاركة المستخدمين، والتعرف على العملاء، وغير ذلك الكثير.
فعلى سبيل المثال، تستخدمها نتفليكس للتوصية بالأفلام، وسبوتيفاي للتوصية بالأغاني، ويوتيوب لاقتراح مقاطع فيديو يجب أن تشاهدها بناءً على اهتماماتك.
معالجة اللغات الطبيعية (NLP)
تتيح معالجة اللغة الطبيعية (NLP) لأجهزة الكمبيوتر معالجة اللغة البشرية وفهمها. يتيح توليد اللغة الطبيعية (NLG) للحواسيب توليد اللغة البشرية.
تُستخدم هذه التقنية بواسطة روبوتات الدردشة الآلية، وأدوات ترجمة اللغة، وأدوات تحليل المشاعر، وغيرها. تُعد ChatGPT أحد أشهر الأمثلة التي تستفيد من NLP وتكنولوجيا NLG.
هل تريد معرفة المزيد عن ChatGPT؟ اطلع على مقالنا الآخر المسمى كيفية إنشاء تطبيق باستخدام ChatGPT؟
الرؤية الحاسوبية والتعرف على الصور
تمنح الرؤية الحاسوبية أجهزة الكمبيوتر القدرة على “رؤية” و”فهم” الصور ومقاطع الفيديو. فهي تسمح لها بإجراء التجزئة (في الوقت الحقيقي) والتعرف على الأشياء والوجوه وحتى المشاعر.
هذه هي التقنية التي تستخدمها تطبيقات الصور للإشارة إلى أصدقائك تلقائياً. بالإضافة إلى ذلك، يتم استخدامها بواسطة أنظمة المراقبة للكشف عن السلوك المشبوه.
الكشف عن الاحتيال
توظف الشركات التعلم الآلي للكشف عن الأنشطة المشبوهة في المعاملات أو سلوك المستخدم. يمكن لهذه الأنظمة الكشف عن الأعمال الاحتيالية المحتملة من خلال دراسة الاتجاهات والظواهر الشاذة، وحماية الشركات والعملاء من الاحتيال والجرائم الإلكترونية.
السيارات ذاتية القيادة
تُعد القيادة الذاتية للسيارات واحدة من أكثر مشاكل التعلم الآلي تعقيداً. فهي تجمع بين تطبيقات مختلفة مثل الرؤية الحاسوبية، واكتشاف الشذوذ، والتنبؤ بالسلوك، وتخطيط المسار، وما إلى ذلك.
في وقت كتابة هذا التقرير، لم نقترب بعد من السيارات ذاتية القيادة بالكامل. فالسيارات “ذاتية القيادة” الحالية تعمل بشكل جيد فقط في مناطق جغرافية محدودة.
خيارات نشر التعلم الآلي
لنشر نموذج تعلم آلي تقوم عادةً بتقديمه من تطبيق ويب. لذلك، فإن خيارات نشر نموذج التعلّم الآلي هي عملياً نفس خيارات نشر تطبيقات الويب. لنلقِ نظرة عليها!
في مكان العمل
يستلزم النشر في مكان العمل استضافة معدات تكنولوجيا المعلومات وإدارتها، مثل الخوادم وأجهزة التخزين، في المقر الفعلي للشركة.
تستلزم هذه الاستراتيجية التقليدية استثماراً أولياً كبيراً في الأجهزة والبرمجيات والصيانة والدعم المستمرين.
تشمل إيجابياته مستوى أعلى من التحكم والأمان وتخصيص أكثر سهولة. من ناحية أخرى، تتمثل الجوانب السلبية في التكلفة وقابلية التوسع والصيانة.
السحابة
في المقابل، يستخدم النشر السحابي خدمات الطرف الثالث لاستضافة البنية التحتية والتطبيقات عبر الإنترنت.
يسمح هذا النموذج للمستخدمين بالدفع مقابل الموارد والخدمات القابلة للتطوير، والتي يتعامل معها مقدمو الخدمات السحابية.
تشمل مزاياها قابلية التوسع، وسهولة الاستخدام، وعدم وجود تكلفة مسبقة. من ناحية أخرى، تتمثل الجوانب السلبية في انخفاض مستوى التحكم، وقلة المرونة، واحتمال انغلاق البائعين.
تتضمن أمثلة المنصات المستندة إلى السحابة ما يلي:
- Back4app
- Amazon Web Services (AWS)
- Google Cloud Platform (GCP)
- Microsoft Azure
خوارزميات التعلم الآلي الشائعة
خوارزميات التعلم الآلي الشائعة هي:
- k-Nearest Neighbours (kNN)
- Decision Trees & Random Forests
- Support Vector Machines (SVM)
- Linear Regression
- Naive Bayes
- K-means
في المثال العملي، سنستخدم في هذا المثال العملي ج-أقرب الجيران.
كيف يتم نشر نموذج التعلم الآلي؟
في هذا القسم من المقالة، سنقوم ببناء نموذج تعلّم آلي، وخدمته باستخدام FastAPI، ثم سنقوم بتحويله إلى رصيف إرساء وأخيرًا نشره في حاويات Back4app.
المتطلبات الأساسية
- المعرفة الأساسية للتعلم الآلي
- خبرة في Python وFastAPI
- الفهم الأساسي لتقنية Docker وتكنولوجيا الحاويات
- تثبيت Git و Docker Desktop على جهازك المحلي
نظرة عامة على المشروع
قبل توضيح كيفية نشر نموذج تعلّم آلي، سنقوم ببناء نموذج. سنقوم بإنشاء مصنف kNN بسيط باستخدام مجموعة بيانات Iris الشهيرة. سيكون الغرض من النموذج هو التنبؤ بما إذا كانت الملاحظة هي “سيتوسا” أو “فيرسيكولور” أو “فيرجينيكا” بناءً على ميزات مختلفة.
سنقوم بعد ذلك بحفظ النموذج في ملف، وتحميله في FastAPI وخدمته عبر نقطة نهاية. بعد ذلك، سنقوم بعد ذلك بإرساء التطبيق، وندفعه إلى GitHub، وننشره إلى حاويات Back4app.
إنشاء نموذج
لإنشاء النموذج، سنستخدم دفاتر Jupyter Notebooks. يمكنك إما تثبيت Jupyter على جهازك المحلي أو استخدام Google Colab مجانًا.
قم أولاً بإنشاء دفتر ملاحظات Jupyter جديد.
تمثل كل كتلة كود في قسم هذه المقالة خلية Jupyter. يمكنك إنشاؤها من القائمة أو باستخدام رابط المفتاح “B” (عندما تكون في وضع الأوامر).
لا تنسَ أيضًا تشغيلها (إما من القائمة أو باستخدام “ALT + ENTER”).
أضف الواردات التالية في الخلية الأولى:
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from joblib import dump
تحميل مجموعة البيانات
يتم تضمين مجموعة بيانات Iris في Scikit-learn افتراضيًا. كل ما عليك فعله هو استدعاء الدالة load_iris()
وتحويل الكائن إلى إطار.
إنشاء خلية جديدة:
df = load_iris(as_frame=True)["data"]
df["target"] = load_iris(as_frame=True)["target"]
أثناء تحميل مجموعة بيانات Iris، يتم ترتيبها حسب المتغير الهدف. هذا ليس جيدًا لأن نموذج التعلم الآلي الخاص بنا قد يرى بعض أنواع الأمثلة فقط في مرحلة التدريب. على سبيل المثال “setosa” و “versicolour” فقط.
لتجنب هذه المشكلة، يمكننا تبديلها:
df = df.sample(frac=1, random_state=42)
تُستخدم السمة
random_state العشوائية
لقابلية التكرار. يمكنك استخدام أي رقم تريده.
استكشف مجموعة البيانات
قبل إنشاء نموذج، من الجيد استكشاف البيانات التي تتعامل معها. للقيام بذلك، يمكنك استخدام دوال Pandas المدمجة، مثل head()
، و describe()
، وما إلى ذلك.
# Displays the first five rows of the dataset
df.head(5)
# Generates descriptive statistics
df.describe()
علاوةً على ذلك، يجب عليك تصور مجموعة البيانات لمعرفة الميزات التي تفصل بين الأمثلة بشكل أفضل وخوارزمية التعلم الآلي التي يمكن أن تكون مفيدة لمشكلتك.
تم استعارة الصورة أعلاه من مقالة دليل تصور البيانات باستخدام Python. تأكد من الاطلاع عليها لمعرفة المزيد عن تصور البيانات.
توضح الصورة أن النقطتين “الحمراء” يمكن فصلهما خطيًّا عن النقطتين الأخريين. من ناحية أخرى، لا يمكن فصل النقطتين “الزرقاء” و”الخضراء” خطيًّا عن النقطتين الأخريين.
مجموعة البيانات المنقسمة
للمضي قدماً، دعونا نحدد السمات (المتنبئات) والمتغير الهدف:
features = [
"sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)"
]
target = "target"
ثم استخرجها إلى X
(بيانات الميزات) و y
(بيانات المتغير المستهدف) واختبر تدريبًا يقسمها:
X = df[features].values
y = df[target].values
dev_X, test_X, dev_y, test_y = train_test_split(X, y, test_size=0.25, random_state=42)
باستخدام test_size=0.25،
يتم استخدام 25% من مجموعة البيانات للاختبار، بينما يتم استخدام 75% منها للتدريب.
بناء النموذج
بعد ذلك، قم بإنشاء خط أنابيب يقيس البيانات أولاً ثم يستخدم مصنف kNN:
knn = Pipeline(steps=[
("scaler", StandardScaler()),
("predictor", KNeighborsClassifier()),
])
knn.fit(dev_X, dev_y)
لمعرفة سبب أهمية التوسع، راجع هذه المقالة.
ثم استخدم المصادقة التبادلية 10 أضعاف وتحقق من خطأ المصادقة:
cross_val_score(knn, dev_X, dev_y, cv=10, scoring="accuracy").mean()
# 0.9363636363636362
قم بتقييم النموذج على مجموعة الاختبار:
accuracy_score(test_y, knn.predict(test_X))
# 0.9736842105263158
دقة التحقق والاختبار متساوية إلى حد كبير. يشير هذا إلى أن نموذجنا ليس ناقصًا أو مفرطًا.
نموذج الحفظ
أخيرًا، أعد تدريب النموذج باستخدام جميع البيانات واحفظه في ملف model.pkl:
knn.fit(X, y)
dump(knn, "model.pkl")
إذا كنت تستخدم Google Colab، فقم بتنزيل ملف model.pk لأننا سنحتاجه في الخطوة التالية.
نموذج الخدمة
كما ذكرنا من قبل، سنستخدم FastAPI لخدمة النموذج.
انطلق وأنشئ مشروع FastAPI جديدًا واستبدل main.py هكذا :
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {
"name": "back4app-deploy-ml-model",
"description": "A FastAPI app serving an ML model",
"version": "1.0.0",
}
ابدأ تشغيل خادم التطوير:
$ uvicorn app.main:app --reload
انتقل إلى http://localhost:8000/، وستحصل على الرد التالي:
{
"name": "back4app-deploy-ml-model",
"description": "A FastAPI app serving an ML model",
"version": "1.0.0"
}
نموذج التحميل
بعد ذلك، لنقم بتحميل النموذج وتعريف فئات_النموذج
.
انسخ أولاً model.pkl من الخطوة السابقة إلى جذر مشروعك. ثم قم بتحميل النموذج وحدد الفئات مباشرةً تحت تهيئة تطبيق FastAPI هكذا:
# ...
model = load("model.pkl")
model_classes = {
0: "setosa",
1: "versicolor",
2: "virginica",
}
# ...
سنستخدم Model_classes
لترجمة المتغير الهدف من رقمي إلى نصي.
نموذج التحميل
ثم قم بإنشاء نقطة النهاية / التنبؤ،
والتي تأخذ الميزات وتستخدم النموذج المحمّل لإجراء تنبؤ:
# main.py
# ...
class Observation(BaseModel):
"""
A Pydantic model for the observation data.
This is our ML model's input data.
"""
sepal_length: float
sepal_width: float
petal_length: float
petal_width: float
@app.post("/predict")
async def predict(observation: Observation):
predictions = model.predict([[
observation.sepal_length,
observation.sepal_width,
observation.petal_length,
observation.petal_width,
]])
prediction = predictions[0]
prediction_class = model_classes[prediction]
return {
"prediction": int(prediction),
"prediction_class": prediction_class,
}
تقوم نقطة النهاية بإرجاع التنبؤ الرقمي بالإضافة إلى تنبؤ اختبار سهل الاستخدام.
لا تنسى عمليات الاستيراد في أعلى الملف:
from joblib import load
from pydantic import BaseModel
يجب أن يبدو ملفك الرئيسي.py النهائي بهذا الشكل.
أعد تشغيل خادم التطوير وانتقل إلى http://localhost:8000/docs في متصفح الويب المفضل لديك. يقوم FastAPI تلقائيًا بإنشاء وثائق تفاعلية لجميع نقاط النهاية الخاصة بك.
اختبر النموذج من خلال تقديم طلب مثل هذا:
رائع، تطبيق الويب الخاص بنا يعمل الآن بشكل كامل!
تطبيق Dockerize
في هذا القسم من المقالة، سنقوم بإرساء تطبيق الويب. سنقوم بإنشاء ملف Dockerfile وتهيئة ملف .dockerignore.
ملف إرساء
ملف Dockerfile هو ملف يحتوي على تعليمات لمحرك Docker Engine لاتباعها لبناء الصورة.
ويتضمن ذلك عادةً نقل الملفات، وتحديد الصورة الأساسية، وتهيئة دليل العمل، وتشغيل الأوامر المخصصة، وغير ذلك.
عادةً ما تُكتب أوامر Dockerfile بأحرف كبيرة وتُتبع مباشرةً بالوسائط المقابلة لها.
<COMMAND> <arg1> <arg2> ... <arg_n>
# Example
WORKDIR /app
قم بزيارة مرجع Dockerfile لمعرفة المزيد حول جميع التعليمات.
في جذر المشروع، أنشئ ملف Dockerfile:
# Dockerfile
# Set the base image
FROM python:3.12.2-alpine3.19
# Install the required dependencies (gcc)
RUN apk add build-base
# Set the working directory
WORKDIR /app
# Confingure Python using environmental variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Copy the requirements file into the image and install them
COPY ./requirements.txt .
RUN pip install --no-cache-dir --upgrade pip
RUN pip install --no-cache-dir --upgrade -r ./requirements.txt
# Copy the source code into the image
COPY . .
# Expose the port
EXPOSE 8000
# Start the Uvicorn server
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
.dockerignore
عند العمل مع Docker، ستحتاج إلى إنشاء صور صغيرة قدر الإمكان.
إحدى طرق تقليل حجم الصورة هي استخدام ملف .dockerignore. يعمل هذا الملف بشكل مشابه لملف .gitignore. يسمح لك بحذف الملفات التي لا تحتاج إلى تضمينها في الصورة.
في جذر المشروع، قم بإنشاء .dockerignore .dockerignore:
.git/
.idea/
__pycache__/
venv/
create_model.ipynb
تأكد من تكييف ملف .dockerignore وفقًا لمتطلبات مشروعك (على سبيل المثال إذا كنت تستخدم IDE مختلفًا).
الإنشاء والتشغيل والاختبار
قبل دفع الصورة إلى السحابة، من الجيد اختبارها محلياً.
للمتابعة ستحتاج إلى تثبيت Docker Desktop على جهازك.
افتح المحطة الطرفية وتحقق من الصور المثبتة حالياً:
$ docker images
بعد ذلك، أنشئ الصورة باستخدام ملف Dockerfile:
$ docker build -t iris-webapp:1.0 .
سيستغرق Docker بعض الوقت حتى يتمكن Docker من بناء الصورة. ويرجع ذلك بشكل أساسي إلى أن Scikit-learn غير محسّن لحاويات Docker. لا تتردد في أخذ استراحة قهوة سريعة.
بعد انتهاء الأمر، أعد فحص الصور. يجب أن تكون الصورة المبنية حديثاً هناك.
وأخيراً، استخدم الصورة لإنشاء حاوية جديدة:
$ docker run -p 8000:8000 --name iris-webapp iris-webapp:1.0
هذا كل شيء!
أصبح تطبيق الويب الخاص بك الآن في حاوية. يجب أن يكون متاحًا على http://localhost:8000/ ويعمل بنفس الطريقة السابقة.
الدفع إلى GitHub
أولاً، انتقل إلى GitHub وأنشئ مستودعًا جديدًا. دوِّن عنوان URL البعيد لأننا سنحتاج إليه في خطوة لاحقة.
بعد ذلك، ارجع إلى جذر المشروع.
قبل أن تدفع الشيفرة المصدرية إلى السحابة، قم بإنشاء ملف .gitignore. يسمح لك ملف .gitignore بتحديد الملفات والدلائل التي يجب حذفها من عنصر تحكم الإصدار.
يعمل هذا النوع من الملفات بنفس طريقة عمل ملفات .dockerignore.
في جذر المشروع، أنشئ ملف .gitignore في جذر المشروع :
#.dockerignore
.idea/
__pycache__/
venv/
افتح الطرفية وقم بتشغيل الأمر التالي لتهيئة Git:
$ git init
أضف جميع الملفات إلى VCS والتزم بها:
$ git add .
$ git commit -m "first commit"
أخيرًا، أضف أصل GitHub البعيد باستخدام عنوان URL من قبل وادفع الشيفرة المصدرية:
$ git remote add origin <remote_url>
$ git push origin master
تأكد من استخدام عنوان URL البعيد من الخطوة السابقة بدلاً من .
هذا كل شيء. إذا قمت بزيارة صفحة مستودع GitHub الآن، سترى أنه تمت إضافة جميع الملفات.
نشر التطبيق
لنشر تطبيق على حاويات Back4app، يجب عليك أولاً التسجيل أو تسجيل الدخول (إذا كان لديك حساب بالفعل).
عندما تقوم بالمصادقة باستخدام حساب Back4app الخاص بك، سيتم نقلك إلى لوحة تحكم التطبيق الخاص بك. لإنشاء تطبيق جديد، انقر على “إنشاء تطبيق جديد”.
يسمح Back4app بنشر Back4app كخدمة والحاويات كخدمة. بما أننا ننشر تطبيقًا في حاويات، سنستخدم الخيار الأخير.
بعد ذلك، سيتعين عليك ربط حساب GitHub الخاص بك ب Back4app. سيسمح هذا ل Back4app بسحب التعليمات البرمجية المصدرية من مستودعاتك. يمكنك إما منح حق الوصول إلى جميع المستودعات أو اختيار مستودعات محددة.
بمجرد استيراد المستودعات، انقر فوق “تحديد”.
تكوين البيئة غير ضروري بخلاف توفير اسم وصفي للتطبيق.
ثم انقر فوق “إنشاء”.
سيحتاج تطبيق Back4app إلى بضع دقائق لإنشاء الصورة ودفعها إلى سجل الحاوية وتشغيل الحاوية. بمجرد اكتمال النشر، يجب أن تتغير حالة تطبيقك إلى “جاهز”.
لزيارة تطبيقك، انقر فوق عنوان URL كما هو موضح في الصورة أدناه.
رائع، لقد نجحت في نشر نموذج التعلم الآلي في حاويات Back4app. يجب أن يعمل تطبيق الويب بنفس الطريقة التي كان يعمل بها محليًا. تأكد من اختبار التطبيق مرة أخرى.
الملخص
لقد تعرفت في هذه المقالة على أساسيات التعلم الآلي وتطبيقاته وكيفية نشر نموذج التعلم الآلي.
يجب أن تكون الآن قادرًا على إنشاء نماذجك البسيطة الخاصة بك، وخدمتها باستخدام FastAPI ونشرها على حاويات Back4app.
احصل على الكود المصدري النهائي من مستودع GitHub Back4-deploy-ml-model من Back4app-deploy-ml-model.