カスタム Docker イメージを使用してモデルをトレーニングする

適用対象:Python SDK azureml v1

この記事では、Azure Machine Learning でモデルをトレーニングするときに、カスタム Docker イメージを使用する方法について説明します。 この記事のサンプル スクリプトは、畳み込みニューラル ネットワークを作成してペットの画像を分類するために使用します。

Azure Machine Learning では既定の Docker 基本イメージを提供します。 Azure Machine Learning 環境を使用して、保守されている Azure Machine Learning 基本イメージの 1 つや独自のカスタム イメージなど、さまざまなの基本イメージを指定することもできます。 カスタム基本イメージを使用すると、依存関係を詳細に管理し、トレーニング ジョブの実行時にコンポーネントのバージョンを厳密に制御できます。

前提条件

コードは、次の環境のいずれかで実行してください。

トレーニング実験を設定する

このセクションでは、ワークスペースを初期化し、環境を定義し、コンピューティング先を構成することによって、トレーニング実験を設定します。

ワークスペースを初期化する

Azure Machine Learning ワークスペースは、サービス用の最上位のリソースです。 作成されるすべての成果物を操作できる一元的な場所が用意されています。 Python SDK では、Workspace オブジェクトを作成することでワークスペースの成果物にアクセスできます。

前提条件として作成した config.json ファイルから Workspace オブジェクトを作成します。

from azureml.core import Workspace

ws = Workspace.from_config()

環境を定義する

Environment オブジェクトを作成します。

from azureml.core import Environment

fastai_env = Environment("fastai2")

次のコードで指定された基本イメージは、分散型ディープ ラーニング機能を可能にする fast.ai ライブラリをサポートしています。 詳細については、fast.ai の Docker Hub リポジトリを参照してください。

独自のカスタム Docker イメージを使用している場合は、既に Python 環境が適切に設定されている可能性があります。 その場合は、カスタム イメージの組み込みの Python 環境を使用するために、user_managed_dependencies フラグを True に設定します。 既定では、Azure Machine Learning では、指定した依存関係を持つ Conda 環境が構築されます。 サービスは、基本イメージにインストールした Python ライブラリを使用するのではなく、その環境でスクリプトを実行します。

fastai_env.docker.base_image = "fastdotai/fastai2:latest"
fastai_env.python.user_managed_dependencies = True

プライベート コンテナー レジストリを作成する (省略可能)

ご自分のワークスペース内にないプライベート コンテナー レジストリのイメージを使用するには、docker.base_image_registry でリポジトリのアドレスとユーザー名とパスワードを指定します。

# Set the container registry information.
fastai_env.docker.base_image_registry.address = "myregistry.azurecr.io"
fastai_env.docker.base_image_registry.username = "username"
fastai_env.docker.base_image_registry.password = "password"

カスタム Dockerfile を使用する (省略可能)

カスタム Dockerfile を使用することも可能です。 Python 以外のパッケージを依存関係としてインストールする必要がある場合は、この方法を使用します。 基本イメージは必ず None に設定してください。

# Specify Docker steps as a string. 
dockerfile = r"""
FROM mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210615.v1
RUN echo "Hello from custom container!"
"""

# Set the base image to None, because the image is defined by Dockerfile.
fastai_env.docker.base_image = None
fastai_env.docker.base_dockerfile = dockerfile

# Alternatively, load the string from a file.
fastai_env.docker.base_image = None
fastai_env.docker.base_dockerfile = "./Dockerfile"

重要

Azure Machine Learning では、次のソフトウェアを提供する Docker イメージのみがサポートされています。

  • Ubuntu 18.04 以上。
  • Conda 4.7.# 以上。
  • Python 3.7 以上。
  • /bin/sh で入手可能な POSIX 準拠シェルは、トレーニングに使用されるすべてのコンテナー イメージで必要です。

Azure Machine Learning 環境の作成と管理の詳細について詳しくは、ソフトウェア環境を作成して使用する方法に関するページを参照してください。

コンピューティング先を作成またはアタッチする

モデルをトレーニングするにはコンピューティング先を作成する必要があります。 このチュートリアルでは、トレーニング コンピューティング リソースとして AmlCompute を作成します。

AmlCompute の作成には数分かかります。 AmlCompute リソースがワークスペースに既にある場合、このコードの作成プロセスはスキップされます。

他の Azure サービスと同様に、Azure Machine Learning サービスに関連付けられている特定のリソース (たとえば AmlCompute) にも制限があります。 詳細については、既定の制限と高いクォータを要求する方法に関するページを参照してください。

from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

# Choose a name for your cluster.
cluster_name = "gpu-cluster"

try:
    compute_target = ComputeTarget(workspace=ws, name=cluster_name)
    print('Found existing compute target.')
except ComputeTargetException:
    print('Creating a new compute target...')
    compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_NC6',
                                                           max_nodes=4)

    # Create the cluster.
    compute_target = ComputeTarget.create(ws, cluster_name, compute_config)

    compute_target.wait_for_completion(show_output=True)

# Use get_status() to get a detailed status for the current AmlCompute.
print(compute_target.get_status().serialize())

重要

コンピューティング上の任意のイメージ ビルドに CPU SKU を使用します。

トレーニング ジョブを構成する

このチュートリアルでは、GitHub 上のトレーニング スクリプト train.py を使用します。 実際には、任意のカスタム トレーニング スクリプトを使用し、そのまま Azure Machine Learning で実行できます。

ScriptRunConfig リソースを作成し、目的のコンピューティング先で実行されるようにジョブを構成します。

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory='fastai-example',
                      script='train.py',
                      compute_target=compute_target,
                      environment=fastai_env)

トレーニング ジョブを送信する

ScriptRunConfig オブジェクトを使用してトレーニングの実行を送信すると、submit メソッドによって ScriptRun 型のオブジェクトが返されます。 返された ScriptRun オブジェクトを使用すると、トレーニング実行に関する情報へのプログラムによるアクセスが可能になります。

from azureml.core import Experiment

run = Experiment(ws,'Tutorial-fastai').submit(src)
run.wait_for_completion(show_output=True)

警告

Azure Machine Learning では、ソース ディレクトリ全体をコピーすることで、トレーニング スクリプトが実行されます。 アップロードしたくない機密データがある場合は、.ignore ファイルを使用するか、ソース ディレクトリに含めないようにします。 代わりに、データストアを使用してデータにアクセスしてください。

次の手順

この記事では、カスタム Docker イメージを使用してモデルをトレーニングしました。 Azure Machine Learning の詳細については、以下の他の記事をご覧ください。