Azure Machine Learning (Azure ML) に入門してみる。
Azure MLとは
ざっくり、機械学習モデルの構築、学習、実験などの管理を行うためのSaaS型フレームワーク。
単にモデルの構築を行う環境であるだけでなく、継続的な精度向上や運用支援が考慮されている。
では、フレームワークの大構造はどういったものか。
まず、Azure MLは巨大なCompute(Cluster)を用意し、ユーザは時間課金でリソースを使用する。
実際に動作するコードのパートはいくつかの抽象化レイヤの上で構成される。
まず、Compute(Cluster)の上に、Dockerコンテナが配置される。
コンテナイメージはAzureが用意するものもあれば、自力で作成することもできる。
(ただし、自力で作成する場合はAzure ML SDKの要求する仕様を満たす必要がある。)
Dockerコンテナの上で、Condaを基盤としたPython実行環境が構成される。
この実行環境はAzureがキュレートしたものの他に自力で作成することもできる。
Azure MLが用意するフレームワークの上で、いくつかの抽象化レイヤを
決まりに従って動作させる必要があって、ドキュメント不備が目立つAzure MLにおいて、
大したことをしていないにもかかわらず、やたら難易度が高い作業になっている(気がする)。
Computeの上でEnvironmentを用意してbase_imageを設定し、
Run Scriptを実行する単位がExperimentでありJobである、という何か。
以下を上から流していって内容を確認していく。
Azure Machine Learning base images
Azureがキュレートする環境を使う
Azure MLコードの実体は、Conda上で動作するPythonで書かれたユーザコードである。
ユーザコードを実行するための依存関係をまず用意する必要がある。
やりたいことに応じて一通りAzureがセットを用意(キュレート)してくれている。
ひとまず、Azureが用意してくれる環境の一覧を取得してみる。
以下のコードはAzure ML上に作成したワークスペースの上でNotebookを作成し実行した。
1 2 3 4 5 6 7 8 9 10 11 |
from azureml.core import Workspace subscription_id = '<<subscription_id>>' resource_group = '<<resource_group_name>>' workspace_name = '<<workspace_name>>' ws = Workspace(subscription_id = subscription_id, resource_group = resource_group, workspace_name = workspace_name) envs = Environment.list(workspace=ws) for env in envs: if env.startswith("AzureML"): print("Name",env) |
出力結果は以下の通り。AzureML-から始まるのはAzureがキュレートする環境の意味。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Name AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu-inference Name AzureML-pytorch-1.9-ubuntu18.04-py37-cpu-inference Name AzureML-pytorch-1.10-ubuntu18.04-py37-cpu-inference Name AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11.0.3-gpu-inference Name AzureML-minimal-ubuntu18.04-py37-cuda11.0.3-gpu-inference Name AzureML-responsibleai-0.20-ubuntu20.04-py38-cpu Name AzureML-responsibleai-0.21-ubuntu20.04-py38-cpu Name AzureML-PTA-pytorch-1.11-py38-cuda11.3-gpu Name AzureML-PTA-pytorch-1.11-py38-cuda11.5-gpu Name AzureML-ACPT-pytorch-1.11-py38-cuda11.3-gpu Name AzureML-ACPT-pytorch-1.11-py38-cuda11.5-gpu Name AzureML-VowpalWabbit-8.8.0 ... |
このうち、AzureML-pytorch-1.9-ubuntu18.04-py37-cpu-inference というenvの
base_dockerfileを調べてみる。
ちなみに、base_imageとbase_dockerfileは排他になっていて、
こういうところがテキトーな作りだな、と感じる部分。
1 2 3 4 5 6 |
ws = Workspace(subscription_id = subscription_id, resource_group = resource_group, workspace_name = workspace_name) curated_env_name = 'AzureML-pytorch-1.9-ubuntu18.04-py37-cpu-inference' pytorch_env = Environment.get(workspace=ws, name=curated_env_name) print(pytorch_env.docker.base_dockerfile) print(pytorch_env.docker.base_image) |
出力結果は以下の通り。急にDockerfileの中身が出てきた。
1 2 |
FROM mcr.microsoft.com/azureml/pytorch-1.9-ubuntu18.04-py37-cpu-inference:20220516.v3 None |
自力で環境を作る
自力で環境を作ることができる。前述の通りAzureMLはConda のフレームワークなので、
Condaの依存関係を定義することで環境を定義する。
この依存関係は yml 形式で記述することができる。
例えば、conda-dependencies.yml というファイルを作成する。
1 2 3 4 5 6 7 |
channels: - conda-forge dependencies: - python=3.6.2 - pip: - azureml-defaults - tensorflow-gpu==2.2.0 |
以下のようにして、このconda-dependencies.ymlから環境を構築する。
1 |
env = Environment.from_conda_specification(name='my-env', file_path='./conda_dependencies.yml') |
環境を動作させるベースイメージを設定する
Azureがキュレートする環境、または独自に作成した環境を動作させるDockerイメージを設定する。
1 2 |
env.docker.enabled = True env.docker.base_image = 'mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04' |
Experimentの送信
早速、Azure ML Computeの上で、用意した環境を使ってみる。
環境はあくまで環境であって、環境の上で学習用コードなどを実行するのが目的。
今回は環境の動作が目的なので、HelloWorldを出力する学習用コード (train.py) を走らせてみる。
環境の上でコードを動かす単位を Experiment と言うらしい。
また、環境の上で動くコードの実行単位を Run と言うらしい。へぇ。
Experimentの送信って、まさにMicrosoft用語の真骨頂というか、
これだけ見ても何も分からないな。
1 2 3 4 5 6 7 8 9 10 11 12 |
from azureml.core import Workspace, Experiment from azureml.core import ScriptRunConfig compute_target = ws.compute_targets['aml-sample-compute'] src = ScriptRunConfig(source_directory='.', script='./train.py', compute_target=compute_target, environment=env) run = Experiment(workspace=ws, name='my-experiment').submit(src) run.wait_for_completion(show_output=True) |
初回実行時にDockerコンテナの作成が走る。今回は約1分程度を要した。
Azure MLのUI上から、新たなJobが開始されたことを確認できる。
StatusがCompletedとなり、Jobが完了したことがわかる。
Jobのログから、Hello Worldが出力されたことがわかる。
1 2 3 4 5 6 |
/azureml-envs/azureml_501e4318608c5015673184f817533f92/lib/python3.6/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography and will be removed in a future release. from cryptography.hazmat.backends import default_backend Hello World Cleaning up all outstanding Run operations, waiting 300.0 seconds 0 items cleaning up... Cleanup took 3.5762786865234375e-06 seconds |
おわりに
とりあえず、Azure ML に入門してみた。
最も簡単なパスでHelloWorldコードを実行することができた。