تعرف على كيفية الجمع بين التعلم الآلي وهندسة البرمجيات لتصميم تطبيقات تعلم الآلة على مستوى الإنتاج وتطويرها ونشرها وتكرارها.
في هذه الدورة، سننتقل من التجريب (التصميم + التطوير) إلى الإنتاج (النشر + التكرار). سنقوم بذلك بشكل متكرر من خلال تحفيز المكونات التي ستمكننا من بناء نظام إنتاج موثوق .
تأكد من مشاهدة الفيديو أدناه للحصول على نظرة عامة سريعة على ما سنقوم ببنائه.
التعلم الآلي ليس صناعة منفصلة، بل هو طريقة قوية للتفكير في البيانات التي لا تقتصر على نوع واحد من الأشخاص.
تأكد من متابعة الدورة التدريبية للحصول على إرشادات أكثر تفصيلاً للمحتوى الموجود في هذا المستودع. سيكون لدينا تعليمات لكل من أجهزة الكمبيوتر المحمول المحلية ومجموعات Anyscale للأقسام أدناه، لذا تأكد من تبديل القائمة المنسدلة ► بناءً على ما تستخدمه (سيتم تبديل تعليمات Anyscale بشكل افتراضي). إذا كنت تريد إجراء هذه الدورة التدريبية باستخدام Anyscale، حيث سنوفر البنية والحوسبة (وحدات معالجة الرسومات) والمجتمع لتعلم كل شيء في يوم واحد، انضم إلى مجموعتنا المباشرة القادمة → سجل هنا!
سنبدأ بإعداد مجموعتنا مع البيئة وتكوينات الحساب.
يمكننا إنشاء مساحة عمل Anyscale باستخدام واجهة مستخدم صفحة الويب.
- Workspace name: ` madewithml `
- Project: ` madewithml `
- Cluster environment name: ` madewithml-cluster-env `
# Toggle ` Select from saved configurations `
- Compute config: ` madewithml-cluster-compute-g5.4xlarge `
بدلاً من ذلك، يمكننا استخدام واجهة سطر الأوامر (CLI) لإنشاء مساحة العمل عبر
anyscale workspace create ...
إذا كنت لا ترغب في إجراء هذه الدورة محليًا أو عبر Anyscale، فلديك الخيارات التالية:
أنشئ مستودعًا باتباع التعليمات التالية: أنشئ مستودعًا جديدًا ← قم بتسميته Made-With-ML
← تبديل Add a README file
( مهم جدًا حيث يؤدي ذلك إلى إنشاء فرع main
) ← انقر فوق Create repository
(قم بالتمرير لأسفل)
نحن الآن جاهزون لاستنساخ المستودع الذي يحتوي على كافة التعليمات البرمجية الخاصة بنا:
git clone https://github.com/GokuMohandas/Made-With-ML.git .
touch .env
# Inside .env
GITHUB_USERNAME= " CHANGE_THIS_TO_YOUR_USERNAME " # ← CHANGE THIS
source .env
export PYTHONPATH= $PYTHONPATH : $PWD
python3 -m venv venv # recommend using Python 3.10
source venv/bin/activate # on Windows: venvScriptsactivate
python3 -m pip install --upgrade pip setuptools wheel
python3 -m pip install -r requirements.txt
pre-commit install
pre-commit autoupdate
نوصي بشدة باستخدام Python
3.10
واستخدام pyenv (mac) أو pyenv-win (windows).
إن بيئتنا التي تحتوي على إصدار Python والمكتبات المناسبة جاهزة لنا بالفعل من خلال بيئة المجموعة التي استخدمناها عند إعداد Anyscale Workspace. لذلك نحتاج فقط إلى تشغيل هذه الأوامر:
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdate
ابدأ باستكشاف دفتر ملاحظات jupyter للتجول بشكل تفاعلي في أعباء العمل الأساسية للتعلم الآلي.
# Start notebook
jupyter lab notebooks/madewithml.ipynb
انقر على أيقونة Jupyter في الركن الأيمن العلوي من صفحة Anyscale Workspace وسيؤدي ذلك إلى فتح مثيل JupyterLab الخاص بنا في علامة تبويب جديدة. ثم انتقل إلى دليل notebooks
وافتح دفتر madewithml.ipynb
.
سنقوم الآن بتنفيذ نفس أحمال العمل باستخدام نصوص Python النصية النظيفة باتباع أفضل ممارسات هندسة البرمجيات (الاختبار، والتوثيق، والتسجيل، والتقديم، وإصدار الإصدارات، وما إلى ذلك). ستتم إعادة هيكلة التعليمات البرمجية التي قمنا بتنفيذها في دفتر ملاحظاتنا إلى النصوص البرمجية التالية:
madewithml
├── config.py
├── data.py
├── evaluate.py
├── models.py
├── predict.py
├── serve.py
├── train.py
├── tune.py
└── utils.py
ملاحظة : قم بتغيير قيم وسيطات الإدخال --num-workers
و --cpu-per-worker
و --gpu-per-worker
أدناه بناءً على موارد نظامك. على سبيل المثال، إذا كنت تستخدم جهاز كمبيوتر محمولًا محليًا، فسيكون التكوين المعقول هو --num-workers 6 --cpu-per-worker 1 --gpu-per-worker 0
.
export EXPERIMENT_NAME= " llm "
export DATASET_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv "
export TRAIN_LOOP_CONFIG= ' {"dropout_p": 0.5, "lr": 1e-4, "lr_factor": 0.8, "lr_patience": 3} '
python madewithml/train.py
--experiment-name " $EXPERIMENT_NAME "
--dataset-loc " $DATASET_LOC "
--train-loop-config " $TRAIN_LOOP_CONFIG "
--num-workers 1
--cpu-per-worker 3
--gpu-per-worker 1
--num-epochs 10
--batch-size 256
--results-fp results/training_results.json
export EXPERIMENT_NAME= " llm "
export DATASET_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv "
export TRAIN_LOOP_CONFIG= ' {"dropout_p": 0.5, "lr": 1e-4, "lr_factor": 0.8, "lr_patience": 3} '
export INITIAL_PARAMS= " [{ " train_loop_config " : $TRAIN_LOOP_CONFIG }] "
python madewithml/tune.py
--experiment-name " $EXPERIMENT_NAME "
--dataset-loc " $DATASET_LOC "
--initial-params " $INITIAL_PARAMS "
--num-runs 2
--num-workers 1
--cpu-per-worker 3
--gpu-per-worker 1
--num-epochs 10
--batch-size 256
--results-fp results/tuning_results.json
سنستخدم MLflow لتتبع تجاربنا وتخزين نماذجنا وواجهة مستخدم تتبع MLflow لعرض تجاربنا. لقد قمنا بحفظ تجاربنا في دليل محلي ولكن لاحظ أنه في بيئة الإنتاج الفعلية، سيكون لدينا موقع مركزي لتخزين جميع تجاربنا. من السهل/غير المكلف تشغيل خادم MLflow الخاص بك ليتمكن جميع أعضاء فريقك من تتبع تجاربهم أو استخدام حل مُدار مثل Weights & Biases وComet وما إلى ذلك.
export MODEL_REGISTRY= $( python -c " from madewithml import config; print(config.MODEL_REGISTRY) " )
mlflow server -h 0.0.0.0 -p 8080 --backend-store-uri $MODEL_REGISTRY
إذا كنت تقوم بتشغيل هذا الكمبيوتر الدفتري على الكمبيوتر المحمول المحلي لديك، فانتقل إلى http://localhost:8080/ لعرض لوحة معلومات MLflow.
إذا كنت تستخدم مساحات عمل Anyscale، فنحن بحاجة أولاً إلى الكشف عن منفذ خادم MLflow. قم بتشغيل الأمر التالي على محطة Anyscale Workspace الخاصة بك لإنشاء عنوان URL العام لخادم MLflow الخاص بك.
APP_PORT=8080
echo https:// $APP_PORT -port- $ANYSCALE_SESSION_DOMAIN
export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
export HOLDOUT_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/holdout.csv "
python madewithml/evaluate.py
--run-id $RUN_ID
--dataset-loc $HOLDOUT_LOC
--results-fp results/evaluation_results.json
{
"timestamp" : " June 09, 2023 09:26:18 AM " ,
"run_id" : " 6149e3fec8d24f1492d4a4cabd5c06f6 " ,
"overall" : {
"precision" : 0.9076136428670714 ,
"recall" : 0.9057591623036649 ,
"f1" : 0.9046792827719773 ,
"num_samples" : 191.0
},
...
export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
python madewithml/predict.py predict
--run-id $RUN_ID
--title " Transfer learning with transformers "
--description " Using transformers for transfer learning on text classification tasks. "
[{
"prediction" : [
" natural-language-processing "
],
"probabilities" : {
"computer-vision" : 0.0009767753 ,
"mlops" : 0.0008223939 ,
"natural-language-processing" : 0.99762577 ,
"other" : 0.000575123
}
}]
# Start
ray start --head
# Set up
export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
python madewithml/serve.py --run_id $RUN_ID
بمجرد تشغيل التطبيق، يمكننا استخدامه عبر cURL، وPython، وما إلى ذلك:
# via Python
import json
import requests
title = "Transfer learning with transformers"
description = "Using transformers for transfer learning on text classification tasks."
json_data = json . dumps ({ "title" : title , "description" : description })
requests . post ( "http://127.0.0.1:8000/predict" , data = json_data ). json ()
ray stop # shutdown
في Anyscale Workspaces، يكون Ray قيد التشغيل بالفعل، لذلك لا يتعين علينا البدء/إيقاف التشغيل يدويًا كما يتعين علينا القيام به محليًا.
# Set up
export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
python madewithml/serve.py --run_id $RUN_ID
بمجرد تشغيل التطبيق، يمكننا استخدامه عبر cURL، وPython، وما إلى ذلك:
# via Python
import json
import requests
title = "Transfer learning with transformers"
description = "Using transformers for transfer learning on text classification tasks."
json_data = json . dumps ({ "title" : title , "description" : description })
requests . post ( "http://127.0.0.1:8000/predict" , data = json_data ). json ()
# Code
python3 -m pytest tests/code --verbose --disable-warnings
# Data
export DATASET_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv "
pytest --dataset-loc= $DATASET_LOC tests/data --verbose --disable-warnings
# Model
export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
pytest --run-id= $RUN_ID tests/model --verbose --disable-warnings
# Coverage
python3 -m pytest tests/code --cov madewithml --cov-report html --disable-warnings # html report
python3 -m pytest tests/code --cov madewithml --cov-report term --disable-warnings # terminal report
من هذه النقطة فصاعدًا، من أجل نشر تطبيقنا في الإنتاج، سنحتاج إما إلى أن نكون على Anyscale أو على سحابة VM / مجموعة محلية تديرها بنفسك (مع Ray). إذا لم يكن على Anyscale، فإن الأوامر ستكون مختلفة قليلاً ولكن المفاهيم ستكون هي نفسها.
إذا كنت لا ترغب في إعداد كل هذا بنفسك، فنوصيك بشدة بالانضمام إلى مجموعتنا المباشرة القادمة{:target="_blank"} حيث سنوفر بيئة تحتوي على كل هذه البنية الأساسية التي تم إعدادها لك بالفعل حتى يتسنى لك ركزت فقط على التعلم الآلي.
يتم تعيين بيانات الاعتماد أدناه تلقائيًا لنا إذا كنا نستخدم مساحات عمل Anyscale. لا نحتاج إلى تعيين بيانات الاعتماد هذه بشكل صريح على مساحات العمل ولكننا نفعل ذلك إذا كنا نقوم بتشغيل ذلك محليًا أو على مجموعة خارج المكان الذي تم تكوين وظائف وخدمات Anyscale الخاصة بنا لتشغيلها.
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from Anyscale credentials page
تحدد بيئة المجموعة مكان تنفيذ أعباء العمل لدينا (نظام التشغيل، التبعيات، وما إلى ذلك). لقد أنشأنا بالفعل بيئة المجموعة هذه لنا ولكن هذه هي الطريقة التي يمكننا بها إنشاء/تحديث بيئة المجموعة بأنفسنا.
export CLUSTER_ENV_NAME= " madewithml-cluster-env "
anyscale cluster-env build deploy/cluster_env.yaml --name $CLUSTER_ENV_NAME
يحدد تكوين الحوسبة الموارد التي سيتم تنفيذ أحمال العمل لدينا عليها. لقد أنشأنا بالفعل تكوين الحوسبة هذا لنا، ولكن هذه هي الطريقة التي يمكننا بها إنشائه بأنفسنا.
export CLUSTER_COMPUTE_NAME= " madewithml-cluster-compute-g5.4xlarge "
anyscale cluster-compute create deploy/cluster_compute.yaml --name $CLUSTER_COMPUTE_NAME
نحن الآن جاهزون لتنفيذ أعباء عمل تعلم الآلة لدينا. لقد قررنا دمجها جميعًا معًا في مهمة واحدة ولكن كان بإمكاننا أيضًا إنشاء مهام منفصلة لكل حمل عمل (تدريب، تقييم، وما إلى ذلك). سنبدأ بتحرير فتحات $GITHUB_USERNAME
داخل ملف workloads.yaml
الخاص بنا:
runtime_env :
working_dir : .
upload_path : s3://madewithml/$GITHUB_USERNAME/jobs # <--- CHANGE USERNAME (case-sensitive)
env_vars :
GITHUB_USERNAME : $GITHUB_USERNAME # <--- CHANGE USERNAME (case-sensitive)
يحدد runtime_env
هنا أنه يجب علينا تحميل working_dir
الحالي الخاص بنا إلى حاوية S3 حتى يتمكن جميع العاملين لدينا عند تنفيذ مهمة Anyscale من الوصول إلى الكود لاستخدامه. يتم استخدام GITHUB_USERNAME
لاحقًا لحفظ النتائج من أعباء العمل لدينا إلى S3 حتى نتمكن من استردادها لاحقًا (على سبيل المثال، للعرض).
نحن الآن جاهزون لإرسال مهمتنا لتنفيذ أعباء عمل ML لدينا:
anyscale job submit deploy/jobs/workloads.yaml
وبعد تنفيذ أعباء عمل تعلم الآلة لدينا، نحن على استعداد لإطلاق نموذج الخدمة الخاص بنا للإنتاج. كما هو الحال مع تكوينات Anyscale Jobs، تأكد من تغيير $GITHUB_USERNAME
في serve_model.yaml
.
ray_serve_config :
import_path : deploy.services.serve_model:entrypoint
runtime_env :
working_dir : .
upload_path : s3://madewithml/$GITHUB_USERNAME/services # <--- CHANGE USERNAME (case-sensitive)
env_vars :
GITHUB_USERNAME : $GITHUB_USERNAME # <--- CHANGE USERNAME (case-sensitive)
نحن الآن جاهزون لإطلاق خدمتنا:
# Rollout service
anyscale service rollout -f deploy/services/serve_model.yaml
# Query
curl -X POST -H " Content-Type: application/json " -H " Authorization: Bearer $SECRET_TOKEN " -d ' {
"title": "Transfer learning with transformers",
"description": "Using transformers for transfer learning on text classification tasks."
} ' $SERVICE_ENDPOINT /predict/
# Rollback (to previous version of the Service)
anyscale service rollback -f $SERVICE_CONFIG --name $SERVICE_NAME
# Terminate
anyscale service terminate --name $SERVICE_NAME
لن نقوم بنشر تطبيقنا يدويًا في كل مرة نقوم فيها بإجراء تغيير. بدلاً من ذلك، سنقوم بأتمتة هذه العملية باستخدام إجراءات GitHub!
git remote set-url origin https://github.com/ $GITHUB_USERNAME /Made-With-ML.git # <-- CHANGE THIS to your username
git checkout -b dev
/settings/secrets/actions
في مستودع GitHub الخاص بنا. export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from https://console.anyscale.com/o/madewithml/credentials
main
) ودفعها إلى GitHub. ولكن من أجل دفع الكود الخاص بنا إلى GitHub، سنحتاج أولاً إلى المصادقة باستخدام بيانات الاعتماد الخاصة بنا قبل الدفع إلى مستودعنا: git config --global user.name $GITHUB_USERNAME # <-- CHANGE THIS to your username
git config --global user.email [email protected] # <-- CHANGE THIS to your email
git add .
git commit -m " " # <-- CHANGE THIS to your message
git push origin dev
سيُطلب منك الآن إدخال اسم المستخدم وكلمة المرور (رمز الوصول الشخصي). اتبع هذه الخطوات للحصول على رمز الوصول الشخصي: رمز وصول شخصي جديد لـ GitHub → أضف اسمًا → تبديل repo
workflow
→ انقر فوق Generate token
(قم بالتمرير لأسفل) → انسخ الرمز المميز والصقه عند مطالبتك بكلمة المرور الخاصة بك.
main
وسيؤدي ذلك إلى تشغيل سير عمل أعباء العمل. إذا نجح سير العمل (Anyscale Jobs)، فسوف ينتج عن ذلك تعليقات مع نتائج التدريب والتقييم مباشرة على العلاقات العامة.main
. سيؤدي هذا إلى تشغيل سير عمل الخدمة الذي سيطرح خدمتنا الجديدة للإنتاج!من خلال سير عمل CI/CD الخاص بنا لنشر تطبيقنا، يمكننا الآن التركيز على التحسين المستمر لنموذجنا. يصبح من السهل حقًا التوسع على هذا الأساس للاتصال بعمليات التشغيل المجدولة (cron)، وخطوط البيانات، والانجراف المكتشف من خلال المراقبة، والتقييم عبر الإنترنت، وما إلى ذلك. ويمكننا بسهولة إضافة سياق إضافي مثل مقارنة أي تجربة بما هو قيد الإنتاج حاليًا (مباشرة). في العلاقات العامة حتى)، وما إلى ذلك.
هل تواجه مشكلات في تكوين دفاتر الملاحظات باستخدام jupyter؟ افتراضيًا، سيستخدم jupyter النواة مع بيئتنا الافتراضية ولكن يمكننا أيضًا إضافتها يدويًا إلى jupyter:
python3 -m ipykernel install --user --name=venv
يمكننا الآن فتح دفتر ملاحظات → Kernel (شريط القائمة العلوي) → تغيير Kernel → venv
. لحذف هذه النواة، يمكننا القيام بما يلي:
jupyter kernelspec list
jupyter kernelspec uninstall venv