環境
Azure ML 環境 (Environments) は、コードを実行するコンテナを定義するために用いられます。最もシンプルなケースとしては、pip、Conda、または Azure ML Python SDK 経由で直接、カスタムの Python ライブラリを追加することができます。もっとカスタムが必要であれば、カスタムの Docker イメージを使うことができます。
このページでは、環境の作成について例示します:
- pip の
requirements.txt
ファイルから作成 - Conda の
env.yml
ファイルから作成 - Azure ML Python SDK 経由で直接作成
- カスタム Docker イメージから作成
#
Azure ML が管理する Python 環境#
pip から作成pip の requirements.txt
ファイルから環境を作成します。
#
Conda から作成Conda の env.yml
ファイルから環境を作成します。
#
Azure ML SDK で作成Azure ML Python SDK を使って直接 Python 環境を作成するために、 CondaDependencies
クラスを使います:
#
カスタム Docker イメージ または Dockerfile で作成カスタム Docker イメージから 環境
を作成するには、以下のように定義します:
例えば、 Azure Container Registry のアドレスは、 "<acr-name>.azurecr.io"
という形式です。
パスワードは絶対に入力しないでください。 この例では、環境変数を経由してパスワードを渡しています。
Dockerfile から 環境
を作成するには、以下のように定義します:
備考
user_managed_dependencies = True
: 必要となるすべての Python ライブラリをインストールする必要があります。 Docker イメージの中で実行するのが典型です。interpreter_path
:user_managed_dependencies=True
のときにのみ使用され、 Python インタプリタのパスを設定します。 (例:which python
)
カスタムのベースイメージを用いることで、Azure ML に Python のインストールを管理させることができます。例えば、 pip の requirements.txt
を使って、以下のように定義します:
メモ: このケースでは、 Dockerfile
でインストールされた Python ライブラリは、利用 できなく なります。
#
Azure ML 用にカスタムの Docker イメージをビルドするこちらで入手可能な Azure ML ベースイメージ から Docker イメージをビルドすることを 強く 推奨します: AzureML-Containers GitHub Repo - このように定義してください:
これらのイメージには、 Azure ML 上で動作するために必要となるすべての設定がなされています。
スクラッチでビルドしたい方は、留意すべき要件と推奨のリストを以下に示しますので、ご覧ください:
- Conda: デフォルトでは、 Azure ML は Python 環境を管理するために Conda を使用します。 Azure ML に Python 環境の管理をさせるつもりであれば、 Conda が必須となります。
- libfuse:
Dataset
を使う際に必須となります。 - Openmpi: 分散実行をする際に必須となります。
- nvidia/cuda: (推奨) GPU ベースの学習をするためには、 nvidia/cuda からイメージをビルドしてください。
- Mellanox OFED user space drivers: (推奨) Infiniband のある SKU が対象です。
参考として dockerfiles of Azure ML base images をご覧ください。
#
プライベート・レジストリにあるカスタムイメージを使用するログイン情報があれば、プライベート・レジストリにあるカスタムイメージを Azure ML で利用することができます。
#
環境の管理#
登録された環境チームで再利用したり共有したりするために、 環境 env: Environment
をワークスペース ws
に登録します。
登録された環境は、ワークスペースのハンドラ ws
から直接取得することができます:
このディクショナリには、ワークスペースに登録されているカスタムの環境が含まれています。これは、 Azure ML によって管理される curated environments のコレクションと同様です。
#
例#
環境の保存と読み出しローカルのディレクトリに環境を保存します:
これによって、(人間が理解し編集することができる) 2つのファイルを含むディレクトリが生成されます:
azureml_environment.json
: 名前、バージョン、環境変数、 Python と Docker の設定を含むメタデータです。conda_dependencies.yml
: Conda で標準の、依存関係を表す YAML です。 (詳細は以下をご覧ください。 Conda docs)
この環境を後で以下の要領で読み出します。
#
環境変数環境変数をセットするためには、 environment_variables: Dict[str, str]
アトリビュートを使用してください。環境変数は、スクリプトが実行されるプロセスにてセットされます。
#
ヒントと TipsAzure ML が Conda の依存関係を管理する場合 (デフォルトでは user_managed_dependencies=False
)、Azure ML ワークスペースと関連付けられた Azure Container Registry にある Docker イメージにて同じ環境が構成されているかどうかを、 Azure ML がチェックします。新規の環境の場合、Azure ML には、新しい環境用の新しい Docker イメージを構築するためのジョブ準備段階があります。 logs にあるイメージ・ビルドのログファイルをみて、その進捗を監視しましょう。このジョブは、イメージがビルドされ、コンテナ・レジストリに push されるまで開始しません。
イメージをビルドするプロセスには少し時間がかかり、ジョブの開始が遅れます。不必要なビルドを避けるために、以下を検討してください:
- 必要となる多くのパッケージを含む環境を登録し、可能であれば再利用してください。
- 既存の環境に対して少しの追加パッケージを上乗せする必要があるというだけであれば、
- 既存の環境が Docker イメージである場合、この Docker イメージの Dockerfile を使ってください。追加パッケージをインストールするためのレイヤーを1つ追加するだけで済みます。
- ユーザースクリプトにて追加の Python パッケージをインストールするようにしてください。スクリプト内で発生するパッケージのインストールは、あなたのコードの一部として実行されます。これは新規の環境の一部として Azure ML に取り扱いを依頼することの代わりとなります。setup script を使うことを検討してください。
Python パッケージの依存関係が複雑で、バージョンが競合する可能性があるため、カスタムの Docker イメージと Dockerfile (Azure ML のベースイメージをベースにしたもの) を使用することをお勧めします。この方法により、環境の透明性が完全なものとなるだけでなく、アジャイル開発段階でイメージをビルドする時間を節約することができます。
#
Docker イメージをローカルでビルドし、 Azure Container Registry にプッシュするDocker をローカルにインストールしている場合、 Workspace の ACR に直接イメージをプッシュするオプションを利用して、 Azure ML の環境からの Docker イメージをローカルでビルドすることができます。ローカル・ビルドではキャッシュされたレイヤーを利用できるため、 Dockerfile を反復処理する場合にお勧めです。
#
ブートストラップ・スクリプト開発を高速化するには、 bootstrap.sh
を呼び出すと便利です。イメージの再ビルドが頻繁に発生することを避けるために、 実行時に Python をインストールするよう変更するのが1つの典型例です。
コマンド を使うことでとてもシンプルに実行できます。まずは bootstrap.sh
スクリプトをセットアップしてください。
学習用スクリプトである train.py
の前にこれが実行されるよう、次のコマンドを使用します:
ScriptRunConfig
についてより詳しく知りたい場合は、クラウド上でコードを実行する をご覧ください。
#
分散ブートストラッピング場合によっては、 bootstrap.sh
スクリプトの特定の部分を、分散セットアップの特定のランクで実行したいことがあり得ます。これは、次に示すように少し注意をすることで実現可能です:
このスクリプトは、他のプロセスが続行するよりも前に、ローカルランク0 ($AZ_BATCHAI_TASK_INDEX
) が MARKER
ファイルを作成するのを待ちます。
#
シークレットを渡すために Keyvault を使う#
Workspace のデフォルトの KeyvaultAzure の各 Workspace には Keyvault が付属しています。(これは Azure Portal 内で Workspace と同じリソースグループ配下にあります。)
これは、シークレットの get と set の両方に使うことができます。
#
汎用の Azure Keyvaultもちろん、Azure 内にある他の Keyvault を使うこともできます。
この場合、 azure-identity
と azure-keyvault
をプロジェクトの requirements に追加してください。