تعلم كيفية الجمع بين التعلم الآلي مع هندسة البرمجيات لتصميم وتطوير ونشر وتكرار تطبيقات ML من فئة الإنتاج.
في هذه الدورة ، سننتقل من التجريب (تطوير النموذج + تطوير) إلى الإنتاج (نشر النموذج + التكرار). سنفعل ذلك بشكل تكراري من خلال تحفيز المكونات التي ستمكننا من بناء نظام إنتاج موثوق به .
تأكد من مشاهدة الفيديو أدناه للحصول على نظرة عامة سريعة على ما سنقوم ببنائه.
التعلم الآلي ليس صناعة منفصلة ، بدلاً من ذلك ، إنها طريقة قوية للتفكير في البيانات غير المخصصة لأي شخص واحد.
تأكد من مرور الدورة التدريبية للحصول على تجول أكثر تفصيلاً للمحتوى في هذا المستودع. سيكون لدينا تعليمات لكل من مجموعات الكمبيوتر المحمول المحلية وأيساسلي للأقسام أدناه ، لذا تأكد من تبديل القائمة المنسدلة بناءً على ما تستخدمه (سيتم تبديل تعليمات anyscale بشكل افتراضي). إذا كنت ترغب في تشغيل هذه الدورة مع أي شيء ، حيث سنوفر الهيكل ، وحساب (GPU) والمجتمع لتعلم كل شيء في عطلة نهاية الأسبوع ، والانضمام إلى مجموعة Live Courort القادمة → التسجيل هنا!
سنبدأ بإعداد مجموعةنا مع البيئة وحساب التكوينات.
يمكننا إنشاء مساحة عمل anyscale باستخدام واجهة المستخدم صفحة الويب.
- Workspace name: ` madewithml `
- Project: ` madewithml `
- Cluster environment name: ` madewithml-cluster-env `
# Toggle ` Select from saved configurations `
- Compute config: ` madewithml-cluster-compute `بدلاً من ذلك ، يمكننا استخدام CLI لإنشاء مساحة العمل عبر
anyscale workspace create ...
إذا كنت لا ترغب في القيام بهذه الدورة التدريبية محليًا أو عبر أي شيء ، فلديك الخيارات التالية:
قم بإنشاء مستودع باتباع هذه الإرشادات: إنشاء مستودع جديد → اسمه Made-With-ML → Toggle Add a README file ( مهم جدًا لأن هذا يخلق فرعًا main ) → انقر فوق Create repository (تمرير لأسفل)
نحن الآن على استعداد لاستنساخ المستودع الذي يحتوي على كل الكود لدينا:
git clone https://github.com/GokuMohandas/Made-With-ML.git .
git remote set-url origin https://github.com/GITHUB_USERNAME/Made-With-ML.git # <-- CHANGE THIS to your username
git checkout -b dev 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 الخاصة بنا. لذلك نحن فقط بحاجة إلى تشغيل هذه الأوامر:
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdateابدأ باستكشاف دفتر Jupyter للتجول بشكل تفاعلي لأعباء عمل التعلم الآلي الأساسي.
# Start notebook
jupyter lab notebooks/madewithml.ipynb انقر على أيقونة jupyter في الزاوية اليمنى العليا من صفحة مساحة العمل الخاصة بنا ، وسيؤدي ذلك إلى فتح مثيل 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 الخاص بك لجميع أعضاء فريقك لتتبع تجاربهم على أو استخدام حل مُدار مثل الأوزان والتحيزات ، المذنب ، إلخ.
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 الخاصة بك.
إذا كنت في مساحات عمل في أي حال ، فنحن بحاجة أولاً إلى فضح منفذ خادم MLFLOW. قم بتشغيل الأمر التالي على محطة مساحة العمل الخاصة بك لإنشاء عنوان 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
},
... # Get run ID
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 cURL
curl -X POST -H " Content-Type: application/json " -d ' {
"title": "Transfer learning with transformers",
"description": "Using transformers for transfer learning on text classification tasks."
} ' http://127.0.0.1:8000/predict # 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 export HOLDOUT_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/holdout.csv "
curl -X POST -H " Content-Type: application/json " -d ' {
"dataset_loc": "https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/holdout.csv"
} ' http://127.0.0.1:8000/evaluateفي مساحات العمل في أي حال ، يعمل راي بالفعل ، لذلك لا يتعين علينا البدء/الإغلاق يدويًا كما يتعين علينا القيام به محليًا.
# 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 cURL
curl -X POST -H " Content-Type: application/json " -d ' {
"title": "Transfer learning with transformers",
"description": "Using transformers for transfer learning on text classification tasks."
} ' http://127.0.0.1:8000/predict # 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 --cov madewithml --cov-report htmlمن هذه النقطة فصاعدًا ، من أجل نشر تطبيقنا في الإنتاج ، سنحتاج إلى أن نكون على أي شيء أو على مجموعة Cloud VM / On-prem التي تديرها نفسك (W / Ray). إذا لم يكن ذلك على أي حال ، فستكون الأوامر مختلفة قليلاً ولكن المفاهيم ستكون هي نفسها.
إذا كنت لا ترغب في إعداد كل هذا بنفسك ، فإننا نوصي بشدة بالانضمام إلى مجموعة Live Live القادمة {: Target = "_ Blank"} حيث سنوفر بيئة مع كل هذه البنية التحتية التي تم إعدادها بالفعل لك حتى ركزت فقط على التعلم الآلي.
يتم تعيين بيانات الاعتماد هذه أدناه تلقائيًا إذا كنا نستخدم مساحات عمل 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 "
anyscale cluster-compute create deploy/cluster_compute.yaml --name $CLUSTER_COMPUTE_NAME نحن الآن مستعدون لتنفيذ أعباء عمل ML الخاصة بنا. لقد قررنا الجمع بينهم جميعًا معًا في وظيفة واحدة ، لكن كان بإمكاننا أيضًا إنشاء وظائف منفصلة لكل عبء عمل (قطار ، تقييم ، وما إلى ذلك) سنبدأ بتحرير فتحات $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 وبعد تنفيذ أعباء عمل ML لدينا ، نحن على استعداد لإطلاق نصيحة نموذجنا لإنتاج. على غرار تكوينات وظائف anyscale لدينا ، تأكد من تغيير $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!
/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/credentialsmain ) ودفعها إلى GitHub. ولكن من أجل دفع الكود الخاص بنا إلى github ، سنحتاج أولاً إلى المصادقة مع بيانات الاعتماد لدينا قبل الضغط على مستودعنا: git config --global user.name " Your Name " # <-- CHANGE THIS to your name
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 ، وهذا سيؤدي إلى سير عمل عبء العمل. إذا نجحت سير العمل (أي وظائف في أي حال) ، فسيؤدي ذلك إلى إنتاج تعليقات مع نتائج التدريب والتقييم مباشرة على العلاقات العامة.main . سيؤدي ذلك إلى قيام سير العمل الذي سيقوم بطرح خدمتنا الجديدة للإنتاج!من خلال سير عمل CI/CD الخاص بنا لنشر تطبيقنا ، يمكننا الآن التركيز على تحسين نموذجنا باستمرار. يصبح من السهل حقًا تمديد هذا الأساس للاتصال بالتشغيل المجدول (CRON) ، وخطوط أنابيب البيانات ، والانجراف المكتشف من خلال المراقبة ، والتقييم عبر الإنترنت ، وما إلى ذلك ، ويمكننا بسهولة إضافة سياق إضافي مثل مقارنة أي تجربة مع الإنتاج حاليًا (مباشرة في العلاقات العامة حتى) ، إلخ.
المشكلات مع تكوين دفاتر الملاحظات مع Jupyter؟ بشكل افتراضي ، سوف يستخدم Jupyter kernel مع بيئتنا الافتراضية ولكن يمكننا أيضًا إضافتها يدويًا إلى Jupyter:
python3 -m ipykernel install --user --name=venv الآن يمكننا فتح دفتر ملاحظات → kernel (شريط القائمة العلوي) ← تغيير kernel → venv . لحذف هذه النواة ، يمكننا القيام بما يلي:
jupyter kernelspec list
jupyter kernelspec uninstall venv