機械学習とソフトウェアエンジニアリングを組み合わせて、生産グレードのMLアプリケーションを設計、開発、展開、反復する方法を学びます。
このコースでは、実験(モデル設計 +開発)から生産(モデル展開 +イテレーション)に進みます。信頼できる生産システムを構築できるようになるコンポーネントを動機付けることにより、これを繰り返し行います。
私たちが構築するものの簡単な概要については、以下のビデオを必ずご覧ください。
機械学習は別の産業ではありません。代わりに、いずれのタイプの人にも予約されていないデータについての強力な考え方です。
このリポジトリのコンテンツのはるかに詳細なウォークスルーについては、必ずコースをご覧ください。以下のセクションのローカルラップトップとあらゆるスケールクラスターの両方について手順がありますので、使用しているものに基づいて►ドロップダウンを切り替えてください(デフォルトでは、任意のスケール命令は切り替えられます)。このコースを任意のスケールで実行したい場合は、1つの週末に構造、コンピューティング(GPU) 、コミュニティを提供してすべてを学習したい場合は、次のライブコホート→こちらからサインアップしてください。
まず、環境を使用してクラスターを設定し、構成を計算することから始めます。
Webページ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 →トグル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.ipynbAnyscale 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.jsonMLFLOWを使用して実験を追跡し、モデルとMLFLOWトラッキングUIを保存して実験を表示します。実験をローカルディレクトリに保存していますが、実際の生産設定では、すべての実験を保存するための中心的な場所があることに注意してください。チームメンバー全員が自分のMLFLOWサーバーをスピンアップして、Weight&Biase、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このノートブックをローカルラップトップで実行している場合は、mlflowダッシュボードを表示するには、http:// localhost:8080/にアクセスしてください。
スケールのワークスペースにいる場合は、最初に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
},
... # 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この時点以降、アプリケーションを生産に展開するには、自分自身を管理する(w / ray)クラウドVM / ON-PREMクラスターのいずれかにいる必要があります。スケールではない場合、コマンドはわずかに異なりますが、概念は同じになります。
自分でこれらすべてをセットアップしたくない場合は、今後のライブコホート{:ターゲット= "_ blank"}に参加することを強くお勧めします。ここで、このインフラストラクチャのすべてを既に設定して環境に提供して、機械学習に集中するようにします。
以下のこれらの資格情報は、スケールワークスペースを使用している場合、自動的に設定されています。これらの資格情報をワークスペースで明示的に設定する必要はありませんが、これをローカルで実行している場合、またはスケールのジョブやサービスが実行されるように構成されている場所の外のクラスターで実行している場合に行います。
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from Anyscale credentials pageクラスター環境は、ワークロードがどこに実行されるか(OS、依存関係など)を決定します。すでにこのクラスター環境を作成していますが、これが自分で1つを作成/更新する方法です。
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ワークロードを実行する準備が整いました。それらをすべて1つのジョブに組み合わせることにしましたが、ワークロードごとに個別のジョブを作成することもできます(トレーニング、評価など)。 workloads.yaml内の$GITHUB_USERNAMEスロットを編集することから始めます。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 、後でワークロードの結果を保存するために後で使用され、後でそれらを取得できるようにします(たとえばサービングの場合)。
これで、MLワークロードを実行するためにジョブを提出する準備ができました。
anyscale job submit deploy/jobs/workloads.yamlそして、MLワークロードが実行された後、私たちのモデルを生産するためのサービスを開始する準備ができています。 anyscaleのジョブ構成と同様に、 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ブランチに統合できます。これにより、新しいサービスを生産に展開するサーブワークフローがトリガーされます!CI/CDワークフローを配置してアプリケーションを展開することで、モデルの継続的な改善に焦点を当てることができます。この基盤を拡張して、スケジュールされたラン(CRON)、データパイプライン、監視、オンライン評価などで検出されたドリフトに接続することが非常に簡単になり、現在生産中の実験(PRの直接)などを比較するなどの追加のコンテキストを簡単に追加できます。
Jupyterでノートブックの構成に関する問題は?デフォルトでは、Jupyterは仮想環境でカーネルを使用しますが、手動でJupyterに追加することもできます。
python3 -m ipykernel install --user --name=venvこれで、ノートブックを開くことができます→カーネル(トップメニューバー)→カーネルの変更→ venv変更できます。このカーネルを削除するには、次のことを行うことができます。
jupyter kernelspec list
jupyter kernelspec uninstall venv