機械学習とソフトウェア エンジニアリングを組み合わせて、運用グレードの ML アプリケーションを設計、開発、デプロイ、反復する方法を学びます。
このコースでは、実験 (設計 + 開発) から実稼働 (デプロイ + 反復) まで進みます。信頼性の高い実稼働システムの構築を可能にするコンポーネントを動機づけることによって、これを繰り返し実行します。
これから構築するものの概要については、以下のビデオを必ずご覧ください。
機械学習は別個の業界ではなく、特定のタイプの人だけに限定されないデータについての強力な考え方です。
このリポジトリのコンテンツをより詳細に説明するためのコースを必ず受講してください。以下のセクションでは、ローカル ラップトップと Anyscale クラスターの両方に関する手順が説明されているため、使用しているものに基づいて ► ドロップダウンを切り替えてください (Anyscale 手順はデフォルトでオンになります)。 Anyscale でこのコースを実行したい場合は、1 日ですべてを学ぶための構造、コンピューティング (GPU)、およびコミュニティが提供されます。次回のライブ コホートに参加してください → ここでサインアップしてください。
まず、環境とコンピューティング構成を使用してクラスターをセットアップします。
Web ページ 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 ワークスペースのセットアップ時に使用したクラスター環境を通じて、すでにすべて設定されています。したがって、次のコマンドを実行するだけです。
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdate
まず、jupyter ノートブックを調べて、コアの機械学習ワークロードを対話的にウォークスルーします。
# 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 Tracking 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 上、または自分で管理する (Ray を使用した) クラウド VM/オンプレミス クラスター上のいずれかに存在する必要があります。 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 ワークロードを実行する準備が整いました。これらをすべて 1 つのジョブに結合することにしましたが、ワークロード (トレーニング、評価など) ごとに個別のジョブを作成することもできます。 まず、 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