Azure Machine Learning (SDK v1) を使用して scikit-learn モデルを大規模にトレーニングする

適用対象:Python SDK azureml v1

この記事では、Azure Machine Learning を使用して scikit-learn トレーニング スクリプトを実行する方法について説明します。

この記事のサンプル スクリプトを使用し、アイリスの花の画像を分類して、scikit-learn のアイリス データセットに基づく機械学習モデルを構築します。

scikit-learn の機械学習モデルを一からトレーニングする場合でも、既存のモデルをクラウドに持ち込む場合でも、Azure Machine Learning のエラスティック クラウド コンピューティング リソースを使用して、オープンソースのトレーニング ジョブをスケールアウトできます。 Azure Machine Learning を使用して、運用レベルのモデルをビルド、デプロイ、バージョン管理、および監視することができます。

前提条件

このコードは、Azure Machine Learning コンピューティング インスタンスまたは独自の Jupyter Notebook のいずれかで実行できます。

  • Azure Machine Learning コンピューティング インスタンス

    • Azure Machine Learning の利用開始に関するクイック スタートを参照して、コンピューティング インスタンスを作成します。 すべてのコンピューティング インスタンスには、SDK と notebook サンプル リポジトリにあらかじめ読み込まれている専用の notebook サーバーが含まれています。
    • Azure Machine Learning スタジオの [notebook] タブを選択します。 サンプルのトレーニング用フォルダーで、how-to-use-azureml > ml-frameworks > scikit-learn > train-hyperparameter-tune-deploy-with-sklearn フォルダーの順に選択してこのディレクトリに移動し、完了済みで展開済みのノートブックを見つけます。
    • サンプルのトレーニング用フォルダーの事前設定されたコードを使用すると、このチュートリアルを完了できます。
  • Jupyter Notebook サーバーを作成し、次のセクションのコードを実行します。

実験を設定する

このセクションでは、必要な Python パッケージを読み込み、ワークスペースを初期化し、トレーニング環境を定義し、トレーニング スクリプトを準備することで、トレーニング実験を設定します。

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

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

config.jsonで作成した config.json ファイルからワークスペース オブジェクトを作成します。

from azureml.core import Workspace

ws = Workspace.from_config()

スクリプトを準備する

このチュートリアルでは、トレーニング スクリプトの train_iris.py は既に用意されています。 実際には、コードを変更しなくても、あらゆるカスタム トレーニング スクリプトをそのまま Azure Machine Learning で実行できるはずです。

Note

  • 提供されているトレーニング スクリプトは、スクリプト内の Run オブジェクトを使用して Azure Machine Learning 実行にいくつかのメトリックをログ記録する方法を示しています。
  • 指定されたトレーニング スクリプトでは、iris = datasets.load_iris() 関数のサンプル データを使用します。 独自のデータを使用してデータにアクセスするには、データセットを使用したトレーニング方法を参照して、トレーニング中にデータを使用できるようにしてください。

環境を定義する

トレーニング スクリプトの依存関係をカプセル化する Azure Machine Learning 環境を定義するには、カスタム環境を定義するか、Azure Machine Learning のキュレーションされた環境を使用します。

選別された環境を使用する

独自のイメージを作成しない場合には、必要に応じて、事前に構築され、キュレーションされた環境が Azure Machine Learning によって提供されます。

キュレーションが行われた環境を使用する場合は、代わりに次のコマンドを実行できます。

from azureml.core import Environment

sklearn_env = Environment.get(workspace=ws, name='AzureML-Tutorial')

カスタム環境を作成する

独自のカスタム環境を作成することもできます。 YAML ファイルで conda の依存関係を定義します。この例では、ファイルの名前は conda_dependencies.yml です。

dependencies:
  - python=3.7
  - scikit-learn
  - numpy
  - pip:
    - azureml-defaults

この Conda 環境仕様から Azure Machine Learning 環境を作成します。 環境は、実行時に Docker コンテナーにパッケージ化されます。

from azureml.core import Environment

sklearn_env = Environment.from_conda_specification(name='sklearn-env', file_path='conda_dependencies.yml')

環境の作成と使用の詳細については、「Azure Machine Learning でソフトウェア環境を作成して使用する」をご覧ください。

トレーニングの実行を構成して送信する

ScriptRunConfig を作成する

ScriptRunConfig オブジェクトを作成して、トレーニング スクリプト、使用する環境、実行するコンピューティング先など、トレーニング ジョブの構成の詳細を指定します。 arguments パラメーターで指定されている場合、トレーニング スクリプトへの引数はすべてコマンド ラインを使用して渡されます。

次のコードは、ローカル コンピューターで実行するジョブを送信するように ScriptRunConfig オブジェクトを構成します。

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory='.',
                      script='train_iris.py',
                      arguments=['--kernel', 'linear', '--penalty', 1.0],
                      environment=sklearn_env)

代わりにリモート クラスターでジョブを実行する場合は、目的のコンピューティング先を ScriptRunConfig の compute_target パラメーターに指定できます。

from azureml.core import ScriptRunConfig

compute_target = ws.compute_targets['<my-cluster-name>']
src = ScriptRunConfig(source_directory='.',
                      script='train_iris.py',
                      arguments=['--kernel', 'linear', '--penalty', 1.0],
                      compute_target=compute_target,
                      environment=sklearn_env)

実行を送信する

from azureml.core import Experiment

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

警告

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

実行実施中の動作

実行は、以下の段階を経て実施されます。

  • 準備:Docker イメージは、定義されている環境に従って作成されます。 イメージはワークスペースのコンテナー レジストリにアップロードされ、後で実行するためにキャッシュされます。 ログは実行履歴にもストリーミングされ、進行状況を監視するために表示することができます。 代わりに、キュレーションされた環境が指定されている場合は、そのキュレーションされた環境を補足するキャッシュ済みのイメージが使用されます。

  • 拡大縮小:Batch AI クラスターでの実行に現在使用可能な数より多くのノードが必要な場合、クラスターはスケールアップを試みます。

  • 実行中: スクリプト フォルダー内のすべてのスクリプトがコンピューティング先にアップロードされ、データ ストアがマウントまたはコピーされて、 が実行されます。 stdout からの出力と ./logs フォルダーが実行履歴にストリーミングされるので、実行の監視のために使用できます。

  • 後処理:実行の ./outputs フォルダーが実行履歴にコピーされます。

モデルを保存して登録する

モデルのトレーニングが終わったら、それをワークスペースに保存して登録できます。 モデルの登録を使用すると、モデルをワークスペースに格納し、バージョン管理して、モデルの管理とデプロイを簡単にすることができます。

モデルを保存するには、トレーニング スクリプト train_iris.py に次のコードを追加します。

import joblib

joblib.dump(svm_model_linear, 'model.joblib')

次のコードでワークスペースにモデルを登録します。 パラメーター model_frameworkmodel_framework_version、および resource_configuration を指定することによって、コードなしのモデル デプロイが使用可能になります。 コードなしのモデル デプロイを使用すると、登録済みのモデルからモデルを Web サービスとして直接デプロイできるようになり、ResourceConfiguration オブジェクトによって、Web サービスのコンピューティング リソースが定義されます。

from azureml.core import Model
from azureml.core.resource_configuration import ResourceConfiguration

model = run.register_model(model_name='sklearn-iris', 
                           model_path='outputs/model.joblib',
                           model_framework=Model.Framework.SCIKITLEARN,
                           model_framework_version='0.19.1',
                           resource_configuration=ResourceConfiguration(cpu=1, memory_in_gb=0.5))

デプロイ

先ほど登録したモデルは、Azure Machine Learning に登録されている他のモデルとまったく同じ方法でデプロイできます。 デプロイ方法にはモデルの登録に関するセクションが含まれていますが、登録済みのモデルが既にあるため、デプロイのためにコンピューティング先の作成に直接スキップできます。

(プレビュー) コードなしのモデル デプロイ

重要

現在、この機能はパブリック プレビュー段階にあります。 このプレビュー バージョンはサービス レベル アグリーメントなしで提供されており、運用環境のワークロードに使用することは推奨されません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。

詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

従来のデプロイ ルートの代わりに、scikit-learn でコードなしのデプロイ機能 (プレビュー) を使用することもできます。 コードなしのモデル デプロイは、すべての組み込みの scikit-learn モデルの種類に対してサポートされています。 model_frameworkmodel_framework_version、および resource_configuration パラメーターを使用して前に示したようにモデルを登録することにより、単純に deploy() 静的関数を使用してモデルをデプロイできます。

web_service = Model.deploy(ws, "scikit-learn-service", [model])

Note

事前に構築された scikit-learn 推論コンテナーには、次の依存関係が含まれています。

    - azureml-defaults
    - inference-schema[numpy-support]
    - scikit-learn
    - numpy

完全な方法では、Azure Machine Learning を使用したデプロイがさらに詳細に説明されています。

次のステップ

この記事では、scikit-learn モデルをトレーニングして登録した後、デプロイ オプションについて学習しました。 Azure Machine Learning の詳細については、以下の他の記事をご覧ください。