はじめに
Azure Machine Learning Services には UI ベースで機械学習モデルを開発できる Designer や Automated ML が提供されています。これらのツールはシチズンデータサイエンティストが機械学習モデルを開発するのに便利です。また Python によるモデル開発と推論、そして運用自動化までカバーする Python SDK も提供されていて、データサイエンティストのみならず IT 部門がエンタープライズグレードの機械学習システムを構築することができます。
この Python SDK によって例えばデータサイエンティストはモデル学習をリモート仮想マシン上で分散トレーニングさせたりすることもできますが、そのためには Python SDK のお作法を理解しておく必要があります。
ここでそれらのお作法について解説してみます。
対象読者
- Azure Machine Learning (以降 Azure ML)の機能・概念をひととおり知っている
- Azure ML Python SDK をこれから触ってみようと考えている
今回のスコープ
- Azure ML が提供するパイプライン機能を使わない、もっともシンプルな環境でのデータの受けとり方
パイプラインは一連のスクリプトの単位(あるいはステップ)をいくつか連ねて実行する考え方で、CI/CD パイプラインへの移行を容易にします。
パイプラインを使わないリモート実行では、例えば ローカル PC 上で開発したスクリプトをパワフルなリモート仮想マシン上で実行するユースケースが考えられます。
登場アイテム
ここで登場するアイテムは次のとおり。
- CSVファイル(運用を意識して Azure Blob Storage に配置されていると仮定)
- リモート仮想マシン(以降 Azure ML の用語を用いて "コンピューティングクラスター")
- ローカル PC( Visual Studio Code, Azure ML Python SDKがインストール済)
- Python version は 3.8.10、Azure ML Python SDK version は 1.33.0.post1 を利用
またローカル PC 上のフォルダー構造は次のようになっている前提で記述します。 config.json は 利用する Azure ML ワークスペースの情報を保持しているファイルで、ポータルからダウンロードすることができます。ダウンロードしたら、同じディレクトリ内、 .azureml という名前のサブディレクトリ内、または親ディレクトリ内のいずれかに配置しておきます。
script.py は blob Storage 上の CSV ファイルを Read して outputs ディレクトリに書きだすだけの簡単な内容でサンプルとして用意しました。
その script.py をコンピューティングクラスターに送りこんで実行させるのが HelloWorld1.ipynb の役目になります。
HelloWorld1.ipynb の手順は以下のとおり。
手順
順番にみていきましょう。
-
パッケージの読込み
まずパッケージを読込みます。
workspace には config.json から Azure ML ワークスペースの情報がセットされ、実験の実行時に変数として渡されます。from azureml.core import Workspace, Experiment, Dataset, Datastore, ScriptRunConfig, Environment from azureml.core.compute import ComputeTarget from azureml.core.compute_target import ComputeTargetException from azureml.core.conda_dependencies import CondaDependencies from azureml.core.runconfig import DockerConfiguration workspace = Workspace.from_config()
-
コンピューティングクラスターの指定
Python SDK でリモートコンピュートリソースを作成することもできますが、ここでは全体の見通しがよくなるように事前にAzure ML Studop ワークスペースでコンピューティングクラスターを作成しておきました。aml_compute_target = "demo-cpucluster" # <== The name of the cluster being used try: aml_compute = ComputeTarget(workspace, aml_compute_target) print("found existing compute target.") except ComputeTargetException: print("no compute target with the specified name found")
-
CSV ファイルのパス指定
ここで demostore は Azure ML Studio ワークスペースに登録したデータストア名です。データストアの BLOB コンテナ内のファイルパスを dataset クラスに渡しています。
表形式のファイルを渡す場合には Tabular.from_delimited_files() を使い、それ以外のファイルやディレクトリを渡す場合は File.from_files() を使います。ds = Datastore(workspace, 'demostore') dataset = Dataset.Tabular.from_delimited_files(path=(ds, 'work/HelloWorld.txt'))
-
環境の指定
ここでは実行環境を指定します。環境名として myenv を指定し、その環境(コンテナイメージ)で使用するパッケージを指定します。myenv = Environment.from_conda_specification(name="my-env", file_path="conda.yml") docker_config = DockerConfiguration(use_docker=True)
conda.yml はノートブックと同じフォルダに配置されているものとします。
name: my-env dependencies: - python=3.8.5 - pip: - azureml-defaults - pandas==1.1.4 channels: - anaconda - conda-forge
-
実行ファイル名の指定
source_directory で リモート実行するスクリプト一式がはいったフォルダ名を指定します。また script でリモート実行のエントリーとなるスクリプトファイル名を指定します。
リモート実行では指定した script_folder 内のファイル、サブディレクトリ全てが コンテナに渡されるので、不要なファイルは配置しないように注意します。
インプットファイル名を as_named_input メソッドで渡します。ここで指定した input_ds が引数として渡されます。src = ScriptRunConfig(source_directory='script_folder1', script='script1.0.py', arguments=[dataset.as_named_input('input_ds')], compute_target=aml_compute, environment=myenv, docker_runtime_config=docker_config)
-
実験の実行
experiment_name は実験の表示名として使われます。experiment_name = 'ScriptRunConfig1A' experiment = Experiment(workspace = workspace, name = experiment_name) run = experiment.submit(config=src) run
このセルは非同期に終了するので、実行の終了を待つ場合は 次のステートメントを実行しておきましょう。
%%time # Shows output of the run on stdout. run.wait_for_completion(show_output=True)
-
script1.0.py
リモート実行されるスクリプトの中身です。
get_context() によって呼び出し側スクリプトの実行情報が渡されます。この run の中には引数として渡されるインプットファイル名も含まれているので、これを取り出します。
最後に outputs フォルダに書きだしています。この outputs フォルダは既定で何もしなくても作成され、実行後に実験の 「出力とログ」 から参照することができます。from azureml.core import Run, Dataset run = Run.get_context() print(run.input_datasets) input_ds = run.input_datasets['input_ds'] df = input_ds.to_pandas_dataframe() df.to_csv('./outputs/HelloWorld.csv', mode='w', index=False)
おわりに
いかがでしょうか。Azure ML Python SDK の input/output にはいくつかのバリエーションがあって混乱するユーザーも多いのではと思います。
公式ドキュメントの Tutorial や How-to-use-azureml のサンプルは長大なものが多く見とおしが悪いので、シンプルにしたものをポストしていければと思います。
参考資料
Azure Machine Learning SDK for Python とは
Train with Azure Machine Learning datasets
Azure ML Python SDK を使う2:データセットをインプットとして使う - その2
Azure ML Python SDK を使う3:アウトプットを Blob ストレージに書きだす - その1
Azure ML Python SDK を使う4:アウトプットを Blob ストレージに書きだす - その2
Azure ML Python SDK を使う5:パイプラインの基本