Узнайте, как сочетать машинное обучение с разработкой программного обеспечения для проектирования, разработки, развертывания и итерации приложений машинного обучения промышленного уровня.
В этом курсе мы пройдем от экспериментирования (проектирование + разработка) к производству (развертывание + итерация). Мы будем делать это итеративно, мотивируя компоненты, которые позволят нам построить надежную производственную систему.
Обязательно посмотрите видео ниже, чтобы получить краткое представление о том, что мы будем строить.
Машинное обучение — это не отдельная отрасль, а мощный способ мышления о данных, который не предназначен для какого-либо одного типа людей.
Обязательно пройдите курс, чтобы получить более подробное описание содержимого этого репозитория. В разделах ниже у нас будут инструкции как для локального ноутбука, так и для кластеров 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. Итак, нам просто нужно запустить эти команды:
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 Workspaces, нам нужно сначала предоставить порт сервера 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 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, либо в облачной виртуальной машине/локальном кластере, которым вы управляете самостоятельно (с Ray). Если не в Anyscale, команды будут немного другими, но концепция будет той же.
Если вы не хотите настраивать все это самостоятельно, мы настоятельно рекомендуем присоединиться к нашей предстоящей интерактивной группе{:target="_blank"}, где мы предоставим среду со всей этой инфраструктурой, уже настроенной для вас, чтобы вы просто сосредоточился на машинном обучении.
Эти учетные данные, приведенные ниже, автоматически устанавливаются для нас, если мы используем Anyscale Workspaces. Нам не нужно явно устанавливать эти учетные данные в рабочих областях, но мы это делаем, если мы запускаем их локально или в кластере за пределами того места, где настроены наши задания и службы 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
Теперь мы готовы выполнять наши рабочие нагрузки 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, чтобы мы могли получить их позже (например, для обслуживания).
Теперь мы готовы отправить задание на выполнение рабочих нагрузок машинного обучения:
anyscale job submit deploy/jobs/workloads.yaml
И после того, как наши рабочие нагрузки ML будут выполнены, мы готовы запустить нашу модель в производство. Как и в случае с нашими конфигурациями 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 Actions!
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) пройдет успешно, это приведет к появлению комментариев с результатами обучения и оценки непосредственно в PR.main
веткой. Это запустит рабочий процесс подачи, который внедрит наш новый сервис в производство!Имея рабочий процесс CI/CD для развертывания нашего приложения, мы теперь можем сосредоточиться на постоянном совершенствовании нашей модели. На этой основе становится очень легко расширить возможности подключения к запланированным запускам (cron), конвейерам данных, отклонениям, обнаруженным посредством мониторинга, онлайн-оценке и т. д. И мы можем легко добавить дополнительный контекст, например, сравнение любого эксперимента с тем, что в настоящее время находится в производстве (непосредственно). в пиаре даже) и т.д.
Проблемы с настройкой ноутбуков с помощью Jupyter? По умолчанию Jupyter будет использовать ядро с нашей виртуальной средой, но мы также можем добавить его в Jupyter вручную:
python3 -m ipykernel install --user --name=venv
Теперь мы можем открыть блокнот → Ядро (верхняя строка меню) → Изменить ядро → venv
. Чтобы когда-либо удалить это ядро, мы можем сделать следующее:
jupyter kernelspec list
jupyter kernelspec uninstall venv