기계 학습과 소프트웨어 엔지니어링을 결합하여 프로덕션급 ML 애플리케이션을 설계, 개발, 배포 및 반복하는 방법을 알아보세요.
이 과정에서는 실험(디자인 + 개발)에서 프로덕션(배포 + 반복)으로 이동합니다. 우리는 신뢰할 수 있는 생산 시스템을 구축할 수 있는 구성 요소에 동기를 부여하여 이를 반복적으로 수행할 것입니다.
우리가 구축할 내용에 대한 간략한 개요를 보려면 아래 비디오를 시청하십시오.
머신러닝은 별도의 산업이 아니며, 특정 유형의 사람에게만 국한되지 않는 데이터에 대해 생각하는 강력한 방법입니다.
이 저장소의 콘텐츠를 훨씬 더 자세히 살펴보려면 이 과정을 꼭 진행하세요. 아래 섹션에는 로컬 노트북과 Anyscale 클러스터에 대한 지침이 있으므로 사용 중인 항목에 따라 ► 드롭다운을 전환해야 합니다(Anyscale 지침은 기본적으로 켜져 있습니다). 하루 만에 모든 것을 배울 수 있는 구조 , 컴퓨팅(GPU) 및 커뮤니티를 제공하는 Anyscale에서 이 과정을 진행하고 싶다면 다음 라이브 코호트에 참여하세요 → 여기에서 등록하세요!
환경 및 컴퓨팅 구성으로 클러스터를 설정하는 것부터 시작하겠습니다.
웹 페이지 UI를 사용하여 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 Notebook을 탐색하는 것부터 시작하세요.
# Start notebook
jupyter lab notebooks/madewithml.ipynb
Anyscale Workspace 페이지 오른쪽 상단에 있는 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 추적 UI를 사용하여 실험을 봅니다. 우리는 실험을 로컬 디렉토리에 저장해 왔지만 실제 생산 설정에서는 모든 실험을 저장할 중앙 위치가 있다는 점에 유의하십시오. 모든 팀원이 실험을 추적하거나 Weights & Biases, Comet 등과 같은 관리형 솔루션을 사용할 수 있도록 자체 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 대시보드를 확인하세요.
Anyscale Workspaces를 사용하는 경우 먼저 MLflow 서버의 포트를 노출해야 합니다. Anyscale Workspace 터미널에서 다음 명령을 실행하여 MLflow 서버에 대한 공개 URL을 생성합니다.
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 Workspaces를 사용하는 경우 아래 자격 증명이 자동으로 설정됩니다. 작업 공간에서 이러한 자격 증명을 명시적으로 설정할 필요는 없지만 이를 로컬로 실행하거나 Anyscale 작업 및 서비스가 실행되도록 구성된 외부 클러스터에서 실행하는 경우에는 그렇게 합니다.
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from Anyscale credentials page
클러스터 환경은 워크로드가 실행될 위치 (OS, 종속성 등)를 결정합니다. 우리는 이미 이 클러스터 환경을 생성했지만 이것이 우리가 직접 생성/업데이트할 수 있는 방법입니다.
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 워크로드를 실행할 준비가 되었습니다. 우리는 이들을 모두 하나의 작업으로 결합하기로 결정했지만 각 워크로드(학습, 평가 등)에 대해 별도의 작업을 생성할 수도 있었습니다. 먼저 workloads.yaml
파일 내의 $GITHUB_USERNAME
슬롯을 편집하겠습니다.
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
는 Anyscale 작업을 실행할 때 모든 작업자가 사용할 코드에 액세스할 수 있도록 현재 working_dir
S3 버킷에 업로드해야 함을 지정합니다. GITHUB_USERNAME
은 나중에 검색할 수 있도록 워크로드의 결과를 S3에 저장하는 데 사용됩니다(예: 제공용).
이제 ML 워크로드를 실행하기 위해 작업을 제출할 준비가 되었습니다.
anyscale job submit deploy/jobs/workloads.yaml
ML 워크로드가 실행된 후에는 모델을 프로덕션에 제공할 준비가 되었습니다. Anyscale Jobs 구성과 유사하게 serve_model.yaml
에서 $GITHUB_USERNAME
을 변경해야 합니다.
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
페이지에 필요한 자격 증명을 추가하는 것부터 시작하겠습니다. 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
분기로 PR을 시작할 수 있으며 이로 인해 워크로드 워크플로가 트리거됩니다. 워크플로(Anyscale Jobs)가 성공하면 PR에 직접 교육 및 평가 결과가 포함된 댓글이 생성됩니다.main
브랜치에 병합할 수 있습니다. 그러면 새로운 서비스를 프로덕션에 출시하는 서비스 워크플로가 시작됩니다!애플리케이션 배포를 위한 CI/CD 워크플로를 마련했으므로 이제 모델을 지속적으로 개선하는 데 집중할 수 있습니다. 이 기반을 바탕으로 예약된 실행(cron), 데이터 파이프라인, 모니터링을 통해 감지된 드리프트, 온라인 평가 등에 연결하기 위해 확장하는 것이 정말 쉽습니다. 그리고 현재 생산 중인 실험과 실험을 비교하는 것과 같은 추가 컨텍스트를 쉽게 추가할 수 있습니다(직접 PR에서도) 등
jupyter로 노트북을 구성하는 데 문제가 있나요? 기본적으로 jupyter는 가상 환경에서 커널을 사용하지만 수동으로 jupyter에 추가할 수도 있습니다.
python3 -m ipykernel install --user --name=venv
이제 노트북 → 커널(상단 메뉴 표시줄) → 커널 변경 → venv
열 수 있습니다. 이 커널을 삭제하려면 다음을 수행하면 됩니다.
jupyter kernelspec list
jupyter kernelspec uninstall venv