기계 학습과 소프트웨어 엔지니어링을 결합하여 생산 등급 ML 애플리케이션을 설계, 개발, 배포 및 반복하는 방법을 알아보십시오.
이 과정에서는 실험 (모델 설계 + 개발)에서 생산 (모델 배포 + 반복)으로 이동합니다. 우리는 신뢰할 수있는 생산 시스템을 구축 할 수있는 구성 요소에 동기를 부여함으로써 반복적으로 수행 할 것입니다.
우리가 구축 할 내용에 대한 간단한 개요를 위해 아래 비디오를 확인하십시오.
머신 러닝은 별도의 산업이 아니라 한 유형의 사람에게 예약되지 않은 데이터에 대한 강력한 생각 방식입니다.
이 저장소의 콘텐츠에 대한 훨씬 자세한 연습을 위해 코스를 살펴보십시오. 아래 섹션에 대한 로컬 랩톱 및 모든 스케일 클러스터에 대한 지침이 있으므로 사용하는 내용에 따라 ► 드롭 다운을 전환하십시오 (모든 스케일 지침은 기본적으로 전환됩니다). 이 과정을 통해이 과정을 실행하려면 모든 스케일을 제공 할 경우, 우리가 구조 , Compute (GPU) 및 커뮤니티 를 제공하여 한 주말에 모든 것을 배울 수있는 커뮤니티를 제공하려면 다음 라이브 코호트에 가입하십시오 → 여기에 가입하십시오!
환경으로 클러스터를 설정하고 구성을 계산하여 시작하겠습니다.
웹 페이지 UI를 사용하여 모든 스케일 작업 공간을 만들 수 있습니다.
- 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 autoupdatePython
3.10사용하고 Pyenv (Mac) 또는 Pyenv-Win (Windows)을 사용하는 것이 좋습니다.
적절한 Python 버전과 라이브러리가있는 환경은 이미 모든 스케일 작업 공간을 설정할 때 사용한 클러스터 환경을 통해 우리를 위해 설정되어 있습니다. 따라서 우리는 다음과 같은 명령을 실행하면됩니다.
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdateJupyter 노트북을 탐색하여 핵심 머신 러닝 워크로드를 대화식으로 연습하십시오.
# Start notebook
jupyter lab notebooks/madewithml.ipynb 스케일 작업 공간 페이지의 오른쪽 상단에있는 Jupyter 아이콘을 클릭하면 새 탭에서 jupyterlab 인스턴스가 열립니다. 그런 다음 notebooks 디렉토리로 이동하여 madewithml.ipynb 노트북을 열십시오.
이제 Software Engin
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를 저장하여 실험을 볼 것입니다. 우리는 실험을 로컬 디렉토리에 저장했지만 실제 생산 환경에서는 모든 실험을 저장할 중심 위치가있을 것입니다. 모든 팀원이 실험을 추적하거나 웨이트 및 바이어스, 혜성 등과 같은 관리되는 솔루션을 사용하기 위해 자신의 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 서버의 포트를 노출해야합니다. 모든 스케일 작업 공간 터미널에서 다음 명령을 실행하여 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
},
... # 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모든 스케일 작업 공간에서 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 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이 시점부터 응용 프로그램을 프로덕션에 배치하려면 스스로 관리하거나 클라우드 VM / 온 프렘 클러스터를 관리해야합니다 (w / ray). 어떤 스케일에 있지 않으면, 명령은 약간 다르지만 개념은 동일합니다.
이 모든 것을 직접 설정하고 싶지 않다면, 다가오는 라이브 코호트 {: target = "_ blank"}에 가입하는 것이 좋습니다. 여기서 우리는이 모든 인프라가 이미 설정되어있는 환경을 제공하여 기계 학습에 집중할 수 있도록하는 것이 좋습니다.
아래의 자격 증명은 스케일 작업 공간을 사용하는 경우 자동으로 설정됩니다. 작업 공간에서 이러한 자격 증명을 명시 적으로 설정할 필요는 없지만 로컬로 또는 스케일 작업 및 서비스가 실행되도록 구성된 외부의 클러스터에서 실행하는 경우해야합니다.
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from Anyscale credentials page클러스터 환경은 워크로드가 실행되는 위치 (OS, 종속성 등)를 결정합니다 (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 "
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 현재 working_dir S3 버킷에 업로드하여 모든 스케일 작업을 실행할 때 모든 작업자가 사용할 코드에 액세스 할 수 있도록 지정합니다. GITHUB_USERNAME 나중에 워크로드에서 결과를 S3으로 저장하여 나중에 검색 할 수 있도록 (예 : 서빙을 위해)를 검색 할 수 있습니다.
이제 우리는 ML 워크로드를 실행하기 위해 직무를 제출할 준비가되었습니다.
anyscale job submit deploy/jobs/workloads.yaml 그리고 ML 워크로드가 실행 된 후, 우리는 서브 모델을 출시 할 준비가되었습니다. 모든 스케일 작업 구성과 유사하게 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 작업을 사용 하여이 프로세스를 자동화합니다!
/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/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 브랜치까지 PR을 시작할 수 있으며 워크로드 워크 플로우가 트리거됩니다. 워크 플로 (모든 스케일 작업)가 성공하면 PR에서 직접 교육 및 평가 결과에 대해 의견을 제시합니다.main 브랜치로 병합 할 수 있습니다. 이렇게하면 새로운 서비스를 생산으로 출시 할 Serv Workflow가 트리거됩니다!CI/CD 워크 플로우를 사용하여 응용 프로그램을 배포하면 모델을 지속적으로 개선하는 데 집중할 수 있습니다. 이 파운데이션을 확장하여 예정된 실행 (CRON), 데이터 파이프 라인, 모니터링, 온라인 평가 등을 통한 드리프트에 연결하는 것이 실제로 쉬워지며 현재 프로덕션에있는 내용 (PR에서 직접) 등의 실험을 비교하는 것과 같은 추가 컨텍스트를 쉽게 추가 할 수 있습니다.
Jupyter로 노트북을 구성하는 데 문제가 있습니까? 기본적으로 Jupyter는 가상 환경에서 커널을 사용하지만 Jupyter에 수동으로 추가 할 수도 있습니다.
python3 -m ipykernel install --user --name=venv 이제 노트북 → 커널 (상단 메뉴 바) → 커널 변경 → venv 열 수 있습니다. 이 커널을 삭제하려면 다음을 수행 할 수 있습니다.
jupyter kernelspec list
jupyter kernelspec uninstall venv