Узнайте, как объединить машинное обучение с разработкой программного обеспечения для разработки, разработки, развертывания и итерации в приложениях ML-производственных средств.
В этом курсе мы перейдем от экспериментов (дизайн модели + разработка) до производства (развертывание модели + итерация). Мы сделаем это итеративно, мотивируя компоненты, которые позволят нам создать надежную производственную систему.
Обязательно посмотрите видео ниже, чтобы получить быстрый обзор того, что мы будем строить.
Машинное обучение - это не отдельная отрасль, вместо этого это мощный образ мышления о данных, которые не предназначены для одного типа человека.
Обязательно пройдите курс для гораздо более подробного прохождения контента в этом репозитории. У нас будут инструкции как для локального ноутбука, так и для каких -либо кластеров для разделов ниже, поэтому обязательно переключайте выпадающий список ► на основе того, что вы используете (инструкции по умолчанию будут переключаться). Если вы действительно хотите пройти этот курс с помощью AntyScale, где мы предоставим структуру , вычислите (графические процессоры) и сообщество , чтобы узнать все за один уик -энд, присоединяйтесь к нашей следующей ближайшей концертной группе → Зарегистрируйтесь здесь!
Мы начнем с настройки нашего кластера в среде и вычислить конфигурации.
Мы можем создать масштабное рабочее пространство с помощью пользовательского интерфейса веб -страницы.
- 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 ...
Если вы не хотите проходить этот курс локально или через AntyScale, у вас есть следующие варианты:
Создайте репозиторий, следуя этим инструкциям: Создайте новый репозиторий → Название, которое он 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 и библиотеками уже все готово для нас через кластерную среду, которую мы использовали при настройке нашего масштабного рабочего пространства. Поэтому нам просто нужно запустить эти команды:
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdateНачните с изучения ноутбука Jupyter, чтобы интерактивно проходить рабочую нагрузку с основным машинным обучением.
# Start notebook
jupyter lab notebooks/madewithml.ipynb Нажмите на значок Jupyter в правом верхнем углу нашей страницы Workspace AnlyScale, и это откроет наш экземпляр JupyterLab на новой вкладке. Затем перейдите в каталог notebooks и откройте ноутбук madewithml.ipynb .
Теперь мы выполним те же рабочие нагрузки, используя сценарии Clean 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.
Если вы находитесь в рабочих пространствах AntyScale, то нам нужно сначала разоблачить порт сервера MLFLOW. Запустите следующую команду на вашем терминале Workspace AnyScale, чтобы сгенерировать публичный 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С этого момента, чтобы внедрить наше приложение в производство, нам нужно быть в каре, либо в облачном кластере виртуальной машины / на Prem, которым вы управляете сами (с Ray). Если не в AntyScale, команды будут немного разными, но концепции будут одинаковыми.
Если вы не хотите устанавливать все это самостоятельно, мы настоятельно рекомендуем присоединиться к нашей предстоящей живой группе {: target = "_ Blank"}, где мы предоставим среду со всей этой инфраструктурой, которая уже настроена для вас, чтобы вы просто сосредоточились на машинном обучении.
Эти учетные данные, ниже ниже, автоматически устанавливаются для нас, если мы используем рабочие пространства. Нам не нужно явно устанавливать эти учетные данные в рабочих пространствах, но мы делаем, если мы запускаем это локально или в кластере за пределами того, где настраиваются наши задания и службы.
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, чтобы все наши работники, когда мы выполняем, имели доступ к использованию кода. GITHUB_USERNAME используется позже, чтобы сохранить результаты от наших рабочих нагрузок в S3, чтобы мы могли их получить позже (например, для обслуживания).
Теперь мы готовы подать нашу работу, чтобы выполнить наши рабочие нагрузки ML:
anyscale job submit deploy/jobs/workloads.yaml И после того, как наши рабочие нагрузки ML были выполнены, мы готовы запустить нашу модель нашей модели для производства. Подобно нашим конфигурациям заданий, обязательно измените $GITHUB_USERNAME in 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 → Добавьте имя → Toggle repo и workflow → Нажмите Generate token (Прокрутите вниз) → Скопируйте токен и вставьте его при запросе для вашего пароля.
main ветви, и это запустит рабочий процесс рабочих нагрузок. Если рабочий процесс (AntyCale Works) будет успешным, это даст комментарии с результатами обучения и оценки непосредственно на PR.main ветвь. Это запустит рабочий процесс подачи, который развернет наш новый сервис на производство!С нашим рабочим процессом CI/CD для развертывания нашего приложения, мы теперь можем сосредоточиться на постоянном улучшении нашей модели. Становится действительно легко расширить эту основу для подключения к запланированным прогонам (CRON), конвейерам данных, дрейфу, обнаруженным посредством мониторинга, онлайн -оценки и т. Д., И мы можем легко добавить дополнительный контекст, такой как сравнение любого эксперимента с тем, что в настоящее время находится в производстве (непосредственно в PR) и т. Д.
Проблемы с настройкой ноутбуков с Jupyter? По умолчанию Юпитер будет использовать ядро с нашей виртуальной средой, но мы также можем вручную добавить его в Юпитер:
python3 -m ipykernel install --user --name=venv Теперь мы можем открыть ноутбук → Ядра (верхняя строка меню) → Изменить ядро → venv . Чтобы когда -либо удалить это ядро, мы можем сделать следующее:
jupyter kernelspec list
jupyter kernelspec uninstall venv