Azure Machine Learningの初心者がMSのAzure Learnにある”Azure Machine Learning を使用して AI ソリューションを構築する”実施したときのメモです。

正しさはあまり保証できませんが、英語交じりの内容を「Azure Machine Learning を使用して AI ソリューションを構築する」の内容を1時間程度でザッザっと不正確につかむのを目的に書いています。

 

Azure Machine Learning の概要

 

Azure Machine Learningではワークスペースという概念があり、以下のものがWorkspace内で作成される。

  • 開発、トレーニング、デプロイのためのコンピューティング先。
  • 実験およびモデル トレーニング用のデータ。
  • 共有コードとドキュメントを含むノートブック。
  • 実験 (実行履歴、ログに記録されたメトリック、出力を含む)。
  • 調整された複数ステップのプロセスを定義するパイプライン。
  • トレーニング済みのモデル。

Azure Machine Learning ワークスペース(Azure Learnから引用)

[Azure Machine Learning を使用して AI ソリューションを構築するから引用]

workspaceはMicrosoft Azure portal かAzure Machine Learning SDK for Pythonから作成可能。Azure Machine Learning SDK for Pythonを使う場合はazureml.coreのWorkspace.createを使用する。

Azure Machine Learning CLI のaz ml workspace createコマンドでも可

workspceはAzure Machine Learning StudioでGUIで管理可能、そのほかAzure Machine Learning SDK for Pythonでも可能

Azure Machine Learning SDK for Pythonはpip install azureml-sdkでインストールできる。

pythonのスクリプトにはWorkspace.getでsubscription_idとresource_groupとworkspaceのnameを指定する必要がある。

Azure Machine Learning Studioからnotebookを直接開いたり、Visual Studio Codeで開くこともできる。

 

 

Azure Machine Learning を使用して機械学習モデルをトレーニングする

 

  • ScriptRunConfigを使って、モデルを学習させるためのスクリプト(sklearn)を実行する。
  • 再利用可能でパラメータが表記されているスクリプトを作成する。
  • 学習済みのモデルを保存する

紹介されているスクリプトはすべてPython(Azure Machine Learning SDK for Python)。

普通の?sklearnの学習を実行するコードをazureml.coreに読み込ませてrunできる。

argparsを使って学習のためのスクリプトを書けばScriptRunConfigでパラメータを渡して実行することができる。実行時にいろんなパラメータを渡せるという意味か?

run.download_fileでローカルに学習済みのモデルを保存できる。

Model.registerとrun.register_modelで登録できる(どこに登録できるの?)

 

 

Work with Data in Azure Machine Learning

Azureの機械学習でデータを使って作業する

 

workspaceにはdatastoresとdatasetsがあって、されらで学習で使うデータを管理できる。

Azureではdatastoresとして以下のものを利用できる。

  • Azure Storage (blob and file containers)
  • Azure Data Lake stores
  • Azure SQL Database
  • Azure Databricks file system (DBFS)

どのworkspaceデフォルトのdatastoresとしてblob containerとfile containerを持っている。それ以外は自分で追加する。

datastoreの追加はAzure Machine Learning studioでポチポチできるがAzure Machine Learning SDK for Pythonでも可能。

azureml.coreからDatastore.register_azure_blob_containerを実行。

Datastore.getでdatastore(名前でdatastoreを指定)を取得することも可能。各worksapaseにはデフォルトのdtastoreがありそれはws.get_default_datastore()で取得可能。ws.set_default_datastore()でセットできる。

datasetsは実際にpipelinesに投げられるデータを持ったオブジェクト。

  • Tabular・・・表形式のデータ。Pandas的なデータ構造を持ったオブジェクト。
  • File・・・画像や文字列のようなファイルから読み込まれたデータセットで元のファイルのリストになっている。

データセットもAzure Machine Learning SDK を作って作成する。

datastoreからdatastore内のファイルのパスを指定してazureml.coreが持つDataset.Tabular()でデータを読み込む(例えばblobのdata/files/*.csvなど)。

tabular datasetからP直接データを持ってきてPandasやSparkで利用することも可能

データセットはワークスペース内でIDが振られそのIDをパラメータとしてスクリプトに渡すことで学習に利用することができる。

file datasetの場合は名前を指定してファイルを取得する。

 

 

Work with Compute in Azure Machine Learning

Azureの機械学習での計算リソースとの連携

 

自分でVMなどの実行環境を構築してAzure Machine Learningを動かすことも可能。

実行環境は実機やコンテナ、vm、クラスタなどのいろいろConda or pipが必要)。

conda.ymlに実行環境を書いて、azureml.coreのEnvironment.from_conda_specificationで環境を作成することもできる。その際指定したパッケージが自動でインストールされる(作成先は指定できるの?)。

dockerも使える(env.docker.enabledをTrueに)。

環境をworkdpaceと共に登録しておけば、再利用することも可能。登録はenv.registerを使用、Environment.getで環境の名前を指定して取得。

  • Local compute・・・ローカルのPCで実行。
  • Compute clusters・・・クラスタを使って柔軟にスケールイン・スケールアウトできる
  • Attached compute・・・すでにあるVMやクラスタを Azure Machine Learningに追加して計算リソースとして利用できる?

実行環境を選択できるメリットは、開発段階ではローカルや小さいVMで実行して、利用者が増えてきたら大きなVMやクラスタに移せたり、CPUマシンとGPUマシンを交互に試したりできる点にある。

azureml.core.compute.ComputeTargetとAmlComputeで管理された新しい環境(インスタンス名などを指定)を作成して実行できる。

ComputeTarget.attachを使うと作成するのではなく既存のリソースを使ってスクリプトを実行できる。

ComputeTargetExceptionでそもそもそのリソースが存在しているか見ることができる。

取得した計算リソースはScriptRunConfig実行時にcompute_targetに指定する。

 

 

Orchestrate machine learning with pipelines

パイプラインを用いた機械学習のオーケストレーション

 

Azure Machine Learning pipelineの考え方を使って、効率的に開発しましょうという話です。たぶん、Azure Machine Learning pipelineは

各ステップをpipelineで実装しておけばそれをそのままREST APIとしてデプロイするのも簡単。

Azure Machine Learning pipelineには次のようなステップが含まれる。

  • PythonScriptStep: Pythonのスクリプトを実行
  • DataTransferStep: データの移動、コピー
  • DatabricksStep: databricks cluster?でnotebook、script、JARファイルを実行。
  • AdlaStep: Azure Data Lake AnalyticsのU-SQLを実行。
  • ParallelRunStep – おそらく並列化のための手順。

例えば、step1はデータの処理、step2は学習の実行、step3はモデルの評価みたいなノリか?書くstepはPipelineDataでデータを渡す。各々ステップで何を入力にして何を出力にするのか指定できる。

各ステップの出力は次のステップに渡された後でも再利用可能。もし禁止したくなったらallow_reuseをfalseに。

pipeline.publishでpipelineをpublishedできる。publishしたら.endpointがそのままAPIのエンドポイントに。postでデータを投げてあげれば結果をが返ってくる。

個別のパラメータはPipelineParameterで指定可能。

ScheduleRecurrenceを使用すれば、定期的にpipelineを実行することも可能になる。

データの更新をトリガーにしてpipelineを実行することも可能。

 

 

Azure Machine Learning を使用した機械学習モデルのデプロイ

 

モデルをどうやってデプロイするかという話です。犬の画像を送ると、Azure Machine Learningで作成したモデルが「犬です」と返してくるみたいなイメージ。

デプロイ先はいろいろな選択肢があって、 

  • local compute
  • Azure Machine Learning compute instance
  • Azure Container Instance (ACI)
  • Azure Kubernetes Service (AKS) cluster
  • Azure Function
  • Internet of Things (IoT) module

がある。

Model.registerで学習済みのモデルを登録することが可能、run.register_modelも同じ効果がある。

下の2つをentry scriptにpythonで記述する

  • init(): 初期化のためのメソッド
  • run(raw_data): データを使ってモデルを動かすときのメソッド

azureml.core.CondaDependenciesで実行環境を作成。

azureml.core.model.InferenceConfigで使用するスクリプトと環境を登録。

AKSクラスタを使用する場合は、AksComputeやAksWebserviceを使って指定。

Model.deployでモデルをサービス化。ACIかlocal以外で実行するwait_for_deploymentをサービスオブジェクトで呼び出しておく必要がある。

エンドポイントはサービスオブジェクトから.scoring_uriを呼び出すとAPIのURLの形で返される。そこに普通にリクエストを入れればOK。

キーはサービスオブジェクトから.get_keysを呼び出すことで取得できる。(ここは詳しく書かれていなった)

.stateでデバック譲歩を取得できる。.get_logsでログが見れる。

LocalWebservice.deploy_configurationを使えばローカルでも実行できる。

 

 

Deploy batch inference pipelines with Azure Machine Learning

Azure Machine Learningを使用したバッチ推論パイプラインの導入

 

タイトルどおり、非同期でバッチ推論を行う方法についてです。

1.モデルを登録する

ローカルからモデルをパイプラインに登録するには、azureml.coreのModel.registerメソッドを使ってモデルを登録する。

rnuからモデルを登録するには、runのregister_modelから可能

2. 評価用のスクリプト

パイプラインでモデルをロードするには評価用のスクリプトが必要。

  • init()・・・パイプラインを初期化。具体的には、登録したモデルのパスでモデルをロードする。
  • run(mini_batch)・・・バッチを呼び出して推論を実行。具体的にはバッチ毎にpredictメソッドで推論を実行。

スクリプト内で上の2つの関数を定義すればOK。

 

3. ParallelRunStepクラスでパイプラインを作成

ParallelRunStepを使用することで、並列でバッチ推論を実行することができ、結果はPipelineDataに書き込まれる。

出力を単一のファイルに書き込むことも可能。

pipline自体はazureml.pipeline.core.Pipelineで実装可能

 

4. pipelineを実行する。

実行結果はパスを指定してローカルにダウンロードできる。

他のpipelineと同様の手順でバッチ推論のpipelineをデプロイしてREST APIとして利用可能。

↑この場合推論結果は貯められてあとで取り出されるのか?

pipelineの実行時間をスケジュールすることも可(azureml.pipeline.coreのScheduleRecurrenceと Scheduleによる)。

 

 

ざっとここまでまとめて(演習は飛してる)、4、5時間かかっております。

疲れたのでここで一区切りつけて、残りは別の記事でまとめます。

 

それでは。