Azure Machine Learning データセットを使用してモデルをトレーニングする

注意

この記事では、間もなくサポート終了 (EOL) 状態になる Linux ディストリビューションである CentOS について説明します。 適宜、使用と計画を検討してください。 詳細については、「CentOS のサポート終了に関するガイダンス」を参照してください。

適用対象:Python SDK azureml v1

この記事では、Azure Machine Learning データセットを使用して、機械学習モデルのトレーニングを行う方法について説明します。 接続文字列やデータ パスを気にすることなく、ローカルまたはリモートのコンピューティング先でデータセットを使用することができます。

Azure Machine Learning データセットにより、ScriptRunConfigHyperDriveAzure Machine Learning パイプラインなどの Azure Machine Learning トレーニング機能とのシームレスな統合が提供されます。

モデル トレーニングに向けてデータを使用できるようにする準備はできていないものの、データ探索用のノートブックにデータを読み込みたい場合は、データセット内でデータを探索する方法に関する記事を参照してください。

前提条件

データセットを作成し、それを使用してトレーニングするには、以下が必要です。

注意

一部の Dataset クラスは、azureml-dataprep パッケージに依存しています。 Linux ユーザーの場合、これらのクラスは次のディストリビューションでのみサポートされています。Red Hat Enterprise Linux、Ubuntu、Fedora、および CentOS。

Machine learning トレーニング スクリプトでデータセットを使用する

データセットとしてまだ登録されていない構造化データがある場合は、TabularDataset を作成し、それをローカルまたはリモートの実験用のトレーニング スクリプトで直接使用します。

この例では、未登録の TabularDataset を作成し、トレーニング用の ScriptRunConfig オブジェクトのスクリプト引数として指定します。 この TabularDataset をワークスペースの他の実験で再利用する場合は、データセットをワークスペースに登録する方法に関する記事を参照してください。

TabularDataset を作成する

次のコードでは、Web URL から未登録の TabularDataset を作成します。

from azureml.core.dataset import Dataset

web_path ='https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_path)

TabularDataset オブジェクトを使用すると、TabularDataset のデータを pandas または Spark DataFrame に読み込むことができるため、お使いのノートブックを離れることなく、使い慣れたデータ準備とトレーニングのライブラリを操作することができます。

トレーニング スクリプトでデータセットにアクセスする

次のコードでは、トレーニングの実行を構成するときに指定するスクリプト引数 --input-data を構成します (次のセクションを参照してください)。 表形式のデータセットが引数値として渡されると、Azure Machine Learning によってデータセットの ID に解決されます。これを使用すると、トレーニング スクリプトのデータセットにアクセスできます (スクリプトにデータセットの名前や ID をハードコーディングする必要はありません)。 次に、トレーニングの前にデータをさらに調べて準備するために、to_pandas_dataframe() メソッドを使用して、そのデータセットを pandas データフレームに読み込みます。

注意

元のデータ ソースに NaN、空の文字列、または空白の値が含まれている場合、to_pandas_dataframe() を使用すると、それらの値は Null 値として置き換えられます。

準備されたデータをイン メモリの pandas データ フレームから新しいデータセットに読み込む必要がある場合は、そのデータを parquet などのローカル ファイルに書き込み、そのファイルから新しいデータセットを作成します。 データセットを作成する方法の詳細をご覧ください。

%%writefile $script_folder/train_titanic.py

import argparse
from azureml.core import Dataset, Run

parser = argparse.ArgumentParser()
parser.add_argument("--input-data", type=str)
args = parser.parse_args()

run = Run.get_context()
ws = run.experiment.workspace

# get the input dataset by ID
dataset = Dataset.get_by_id(ws, id=args.input_data)

# load the TabularDataset to pandas DataFrame
df = dataset.to_pandas_dataframe()

トレーニングの実行を構成する

ScriptRunConfig オブジェクトは、トレーニング実行を構成および送信するために使用されます。

このコードでは、以下を指定する ScriptRunConfig オブジェクト src を作成します

  • 使用するスクリプトのスクリプト ディレクトリ。 このディレクトリ内のすべてのファイルは、実行のためにクラスター ノード内にアップロードされます。
  • トレーニング スクリプト train_titanic.py
  • スクリプト引数としてのトレーニング用の入力データセット titanic_ds。 これがスクリプトに渡されると、Azure Machine Learning によってデータセットの対応する ID に解決されます。
  • 実行のコンピューティング先。
  • 実行の環境。
from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=script_folder,
                      script='train_titanic.py',
                      # pass dataset as an input with friendly name 'titanic'
                      arguments=['--input-data', titanic_ds.as_named_input('titanic')],
                      compute_target=compute_target,
                      environment=myenv)
                             
# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)                             

リモート コンピューティング先にファイルをマウントする

非構造化データがある場合は、FileDataset を作成し、データ ファイルをマウントまたはダウンロードして、トレーニング用にリモート コンピューティング先でそれを使用できるようにします。 リモート トレーニング実験用にマウントまたはダウンロードを使用する状況について説明します。

次に例を示します。

  • トレーニング データ用の入力 FileDataset、mnist_ds を作成する。
  • トレーニング結果の書き込み先と、それらの結果を FileDataset として昇格させることを指定する。
  • 入力データセットをコンピューティング先にマウントする。

注意

カスタム Docker ベース イメージを使用している場合は、データセットのマウントを機能させるための依存関係として、apt-get install -y fuse 経由で fuse をインストールする必要があります。 カスタム ビルド イメージを構築する方法を確認してください。

ノートブックの例については、データ入出力を使用してトレーニング実行を構成する方法に関する記事を参照してください。

FileDataset を作成する

次の例では、未登録の FileDataset、mnist_data を Web URL から作成します。 この FileDataset は、トレーニング実行用の入力データです。

他のソースからデータセットを作成する方法の詳細を参照してください。


from azureml.core.dataset import Dataset

web_paths = [
            'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
            ]

mnist_ds = Dataset.File.from_files(path = web_paths)

トレーニング出力の書き込み先

OutputFileDatasetConfig オブジェクトを使用して、トレーニング結果の書き込み先を指定できます。

OutputFileDatasetConfig オブジェクトを使用すると、次のことができます。

  • 指定したクラウド ストレージに実行の出力をマウントまたはアップロードする。
  • 出力を FileDataset として、これらのサポートされているストレージの種類に保存する。
    • Azure BLOB
    • Azure ファイル共有
    • Azure Data Lake Storage Gen 1 と 2
  • トレーニング実行間のデータ系列を追跡する。

次のコードでは、トレーニング結果を FileDataset として既定の BLOB データストア def_blob_storeoutputdataset フォルダーに保存するように指定します。

from azureml.core import Workspace
from azureml.data import OutputFileDatasetConfig

ws = Workspace.from_config()

def_blob_store = ws.get_default_datastore()
output = OutputFileDatasetConfig(destination=(def_blob_store, 'sample/outputdataset'))

トレーニングの実行を構成する

ScriptRunConfig コンストラクターの arguments パラメーターを介してマウントする場合は、データセットを引数として渡すことをお勧めします。 そうすることで、引数を介してトレーニング スクリプトのデータ パス (マウント ポイント) を取得します。 これにより、任意のクラウド プラットフォームで、ローカル デバッグとリモート トレーニングに、同じトレーニング スクリプトを使用できます。

次の例では、arguments を介して FileDataset を渡す ScriptRunConfig を作成します。 実行を送信すると、データセット mnist_ds によって参照されるデータ ファイルがコンピューティング先にマウントされ、トレーニング結果が既定のデータストア内の指定された outputdataset フォルダーに保存されます。

from azureml.core import ScriptRunConfig

input_data= mnist_ds.as_named_input('input').as_mount()# the dataset will be mounted on the remote compute 

src = ScriptRunConfig(source_directory=script_folder,
                      script='dummy_train.py',
                      arguments=[input_data, output],
                      compute_target=compute_target,
                      environment=myenv)

# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)

単純なトレーニング スクリプト

次のスクリプトは、ScriptRunConfig を介して送信されます。 mnist_ds データセットを入力として読み取って、既定の BLOB データストア def_blob_store 内の outputdataset フォルダーにファイルを書き込みます。

%%writefile $source_directory/dummy_train.py

# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
import sys
import os

print("*********************************************************")
print("Hello Azure Machine Learning!")

mounted_input_path = sys.argv[1]
mounted_output_path = sys.argv[2]

print("Argument 1: %s" % mounted_input_path)
print("Argument 2: %s" % mounted_output_path)
    
with open(mounted_input_path, 'r') as f:
    content = f.read()
    with open(os.path.join(mounted_output_path, 'output.csv'), 'w') as fw:
        fw.write(content)

マウントまたはダウンロード

任意の形式のファイルをダウンロードしたりマウントしたりすることは、Azure BLOB ストレージ、Azure Files、Azure Data Lake Storage Gen1、Azure Data Lake Storage Gen2、Azure SQL Database、および Azure Database for PostgreSQL から作成されたデータセットに対してサポートされています。

データセットをマウントする場合は、データセットによって参照されているファイルをディレクトリ (マウント ポイント) に接続し、コンピューティング先で使用できるようにします。 Azure Machine Learning コンピューティング、仮想マシン、HDInsight など、Linux ベースのコンピューティングでは、マウントがサポートされています。 データ サイズがコンピューティング ディスクのサイズを超えると、ダウンロードできません。 このシナリオでは、処理時にスクリプトで使用されるデータ ファイルのみが読み込まれるため、マウントすることをお勧めします。

データセットをダウンロードするとき、データセットによって参照されるすべてのファイルが、コンピューティング先にダウンロードされます。 すべてのコンピューティングの種類でダウンロードがサポートされています。 データセットによって参照されるファイルのすべてがスクリプトで処理され、コンピューティング ディスクが完全なデータセットに収まる場合は、ダウンロードによって、ストレージ サービスからのデータ ストリーミングのオーバーヘッドを回避することをお勧めします。 マルチノードのダウンロードについては、調整を回避する方法を参照してください。

注意

ダウンロード パス名は、Windows OS の場合は英数字で 255 文字を超えないようにしてください。 Linux OS の場合、ダウンロード パス名は英数字で 4,096 文字を超えないようにしてください。 また、Linux OS の場合、ファイル名 (ダウンロード パス /path/to/file/{filename} の最後のセグメント) は英数字で 255 文字を超えないようにしてください。

次のコードを実行すると、datasetmounted_path の一時ディレクトリにマウントされます

import tempfile
mounted_path = tempfile.mkdtemp()

# mount dataset onto the mounted_path of a Linux-based compute
mount_context = dataset.mount(mounted_path)

mount_context.start()

import os
print(os.listdir(mounted_path))
print (mounted_path)

Machine learning スクリプトでデータセットを取得する

登録されたデータセットは、Azure Machine Learning コンピューティングなどのコンピューティング クラスター上で、ローカルまたはリモートでアクセスできます。 複数の実験で登録済みデータセットにアクセスするには、以下のコードを使用してワークスペースにアクセスし、以前送信した実行で使用されたデータセットを取得します。 既定では、Dataset クラスの get_by_name() メソッドからは、ワークスペースに登録されているデータセットの最新バージョンが返されます。

%%writefile $script_folder/train.py

from azureml.core import Dataset, Run

run = Run.get_context()
workspace = run.experiment.workspace

dataset_name = 'titanic_ds'

# Get a dataset by name
titanic_ds = Dataset.get_by_name(workspace=workspace, name=dataset_name)

# Load a TabularDataset into pandas DataFrame
df = titanic_ds.to_pandas_dataframe()

トレーニング中のソース コードへのアクセス

Azure BLOB ストレージは、スループット速度が Azure ファイル共有よりも高く、並列で開始される多数のジョブに対応します。 このため、ソース コード ファイルの転送については、BLOB ストレージを使用するように実行を構成することをお勧めします。

次のコード例では、実行構成で、ソース コード転送に使用する BLOB データストアを指定します。

# workspaceblobstore is the default blob storage
src.run_config.source_directory_data_store = "workspaceblobstore" 

ノートブックの例

トラブルシューティング

データセットの初期化に失敗しました: マウント ポイントの準備ができるまで待っていましたがタイムアウトになりました:

  • アウトバウンド ネットワーク セキュリティ グループ規則がなく、azureml-sdk>=1.12.0 を使用している場合は、azureml-dataset-runtime とその依存関係を更新して、特定のマイナー バージョンの最新版にします。または、それを実行で使用している場合は、修正プログラムを含む最新パッチが適用されるように、お使いの環境を再作成します。
  • azureml-sdk<1.12.0 を使用している場合は、最新バージョンにアップグレードします。
  • アウトバウンド NSG 規則がある場合は、サービス タグ AzureResourceMonitor のすべてのトラフィックを許可するアウトバウンド規則があることを確認します。

データセットの初期化に失敗しました: ThrottlingException によって StreamAccessException が発生しました

マルチノード ファイルのダウンロードの場合は、すべてのノードが Azure Storage サービスからファイル データセット内のすべてのファイルをダウンロードしようとする可能性があり、それによって調整エラーが発生します。 調整を回避するには、まず環境変数 AZUREML_DOWNLOAD_CONCURRENCY を、CPU コアの数を 8 倍してノードの数で割った値に設定します。 この環境変数の値を設定するには何らかの実験が必要になる可能性があるため、上記のガイダンスは開始点にすぎません。

次の例では、32 個のコアと 4 つのノードを前提にしています。

from azureml.core.environment import Environment 
myenv = Environment(name="myenv")
myenv.environment_variables = {"AZUREML_DOWNLOAD_CONCURRENCY":64}

AzureFile ストレージ

Unable to upload project files to working directory in AzureFile because the storage is overloaded (ストレージが過負荷になっているため、プロジェクト ファイルを AzureFile 内の作業ディレクトリにアップロードできません) :

  • データ転送などの他のワークロードにファイル共有を使用している場合は、BLOB を使用して、ファイル共有を実行の送信のために自由に使用できるようにすることをお勧めします。

  • もう 1 つの選択肢は、2 つの異なるワークスペース間でワークロードを分割することです。

ConfigException: 資格情報が見つからないため、AzureFileService への接続を作成できませんでした。 アカウント キーまたは SAS トークンのいずれかが、既定のワークスペース BLOB ストアにリンクされている必要があります。

ストレージ アクセス資格情報がワークスペースおよび関連するファイル データストアにリンクされていることを確認するには、次の手順を実行します。

  1. Azure portal でワークスペースに移動します。
  2. ワークスペースの [概要] ページでストレージ リンクを選択 します。
  3. ストレージ ページの左側のメニューで [アクセス キー] を選択します。
  4. キーをコピーします。
  5. ワークスペースの Azure Machine Learning スタジオに移動します。
  6. スタジオで、認証資格情報を指定するファイル データストアを選択します。
  7. [Update authentication](認証の更新) を選択します。
  8. 前の手順のキーを貼り付けます。
  9. [保存] を選択します。

入力としてのデータの引き渡し

TypeError:FileNotFound:そのようなファイルまたはディレクトリはありません:このエラーは、指定したファイル パスにファイルがない場合に発生します。 ファイルを参照する方法が、コンピューティング先でデータセットをマウントした場所と一致していることを確認する必要があります。 確定的な状態を確保するには、データセットをコンピューティング先にマウントするときに抽象パスを使用することをお勧めします。 たとえば、次のコードでは、コンピューティング先のファイルシステムのルート /tmp にデータセットをマウントしています。

# Note the leading / in '/tmp/dataset'
script_params = {
    '--data-folder': dset.as_named_input('dogscats_train').as_mount('/tmp/dataset'),
} 

先頭のスラッシュ "/" を含めない場合は、データセットをマウントする場所を示すために、コンピューティング先の作業ディレクトリをプレフィックスとして付ける必要があります (例: /mnt/batch/.../tmp/dataset)。

次のステップ