Michaelです。
今回は、前回に引き続きAzure Machine Learning Studio (ML Studio)のPowerShell用モジュール「AzureMLPS」を使用して、PowerShellによるWeb Serviceのデプロイと運用について検証していきます。
2回目は、PowerShellを使ってモデルとWeb Serviceエンドポイントの作成を行っていきます。
Web Serviceエンドポイント作成フロー
前回も紹介したように、Web Serviceのデプロイと運用をするために以下の3操作をプログラムで実行してみます。
1. 学習用Web Serviceでモデルを作成
2. 予測用Web Serviceにエンドポイントを追加
3. 追加したエンドポイントのモデルを置換
1. 学習用Web Serviceでモデルを作成
それでは、実際にPowerShellでAzure ML Studioを操作してみます。
まずは、AzureMLPS とモデル名等の各種設定を定義しておきます。学習用Web Serviceで作成したモデルはAzure Storageに保存されるため、書き込みのためにストレージアカウント名とキーも設定しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Import-Module .\AzureMLPS.dll # Blob Storageの設定 $storAccountName = '{ストレージアカウント名}' $storAccountKey = '{ストレージアカウントキー}' # 作成するモデル名 $modelName = 'pattern01' # Web Service名の定義 $trainingSvcName = 'test' # 学習用Web Service $scoringSvcName = 'test [predictive exp.]' # 予測用Web Service |
続いて、学習用Web Serviceでモデルを作成します。モデル作成のスクリプトは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#### 1. 学習用Web Serviceでモデルを作成 #### # 学習用Web Serviceのメタデータを取得 $trainingSvc = Get-AmlWebService | where Name -eq $trainingSvcName $trainingSvcEp = (Get-AmlWebServiceEndpoint -WebServiceId $trainingSvc.Id)[0]; $submitJobRequestUrl = $trainingSvcEp.ApiLocation + '/jobs?api-version=2.0'; $apiKey = $trainingSvcEp.PrimaryKey; # モデル作成ジョブの設定値 $configContent = @{ GlobalParameters = @{ inputTrainData = 'test/test_pattern/Train_SD6_' + $modelName + '.csv'; # 教師用データのBlobパス inputScoreData = 'test/test_pattern/Score_SD6_' + $modelName + '.csv'; # 評価用データのBlobパス }; Outputs = @{ trainedModel = @{ ConnectionString = 'DefaultEndpointsProtocol=https;AccountName=' + $storAccountName + ';AccountKey=' + $storAccountKey; RelativeLocation = 'test/test_model/SD6_' + $modelName + '_Model.ilearner'; }; evaluateData = @{ ConnectionString = 'DefaultEndpointsProtocol=https;AccountName=' + $storAccountName + ';AccountKey=' + $storAccountKey; RelativeLocation = 'test/test_model/SD6_' + $modelName + '_Result.csv'; }; }; } # 設定のハッシュをJSONに変換 $configJson = $configContent | ConvertTo-Json # 学習用Web Serviceを実行してモデルを生成 Write-Host ('training classsification model on ' + $modelName); $res = Invoke-AmlWebServiceBESEndpoint -JobConfigString $configJson -SubmitJobRequestUrl $submitJobRequestUrl -ApiKey $apiKey $outputRestults = $res | ConvertFrom-Json # エンドポイント更新に必要な情報を取得 |
なお、モデル作成ジョブの設定値は学習用Web Serviceの「Batch Execution」リファレンスの「Sample Request Payload」を参照して設定して下さい。
上記スクリプトを実行すると学習用Web Serviceが実行され、成功すると指定したBlob Storageの指定ディレクトリにモデル(.ilearner)とその精度評価データ(.csv)が出力されます。
2. 予測用Web Serviceにエンドポイントを追加
次に、予測用Web Serviceにエンドポイントを追加します。
Web Serviceには、作成段階で1つのデフォルトエンドポイントが作成されますが、このエンドポイントはモデルの更新ができないため、1モデルを更新しながら運用する場合でも、1つは新規エンドポイントを作成する必要があります。
エンドポイントを追加するスクリプトは以下のようになります。
1 2 3 4 5 6 7 8 |
#### 2. 予測用Web Serviceにエンドポイントを追加 #### # 予測用Web Serviceのメタデータ取得 $scoringSvc = Get-AmlWebService | where Name -eq $scoringSvcName # 予測用Web Serviceにエンドポイント追加 $endpointName = 'sd6' + $modelName; Write-Host ('adding endpoint ' + $endpontName + '...') Add-AmlWebServiceEndpoint -WebServiceId $scoringSvc.Id -EndpointName $endpointName -Description $endpointName |
上記スクリプトまでを実行するとWeb Serviceにエンドポイントが追加されます。ここで作成されるエンドポイントはデフォルトエンドポイントのコピーであるため、まだ予測モデルは適用されていません。試しに、モデル作成時に使用した評価データをテストデータとして予測してみると、データが全く異なるため実際の分類とは異なるスコアリングがされたデータが返ってきました。
3. 追加したエンドポイントのモデルを置換
最後に、エンドポイントのモデルを新規に作成したモデルで置換します。
モデル置換に使用するPatch-AmlWebServiceEndpointコマンドレットは若干設定の複雑なコマンドレットで、設定値に設定先エンドポイント、Blob Storage上のモデルのパスのほか、置換する予測用Experiment上のモデルの名称を指定する必要があります。
モデルのパスについてはモデル作成時のレスポンスを参照すれば取得でき、予測用Experiment上のモデルの名称についてはGet-AmlTrainedModelコマンドレットで取得できます。
エンドポイントのモデルを置換するスクリプトは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#### 3. 追加したエンドポイントにモデルを割り当て #### # 作成したモデルのUrl、ディレクトリ、SAS Tokenを取得 $modelLoc = $outputRestults.Results.trainedModel # 予測用Experiment上の置き換えるモデルのメタデータを取得 $scoringExp = Get-AmlExperiment | where Description -eq $scoringSvcName $scoringExpModel = Get-AmlTrainedModel -Scope Experiment -ExperimentId $scoringExp.ExperimentId # エンドポイントに作成したモデルを割り当て Write-Host ('Patching endpoint ' + $endpointName + '...'); Patch-AmlWebServiceEndpoint ` -WebServiceId $scoringSvc.Id ` -EndpointName $endpointName ` -ResourceName $scoringExpModel.Name ` -BaseLocation $modelLoc.BaseLocation ` -RelativeLocation $modelLoc.RelativeLocation ` -SasBlobToken $modelLoc.SasBlobToken |
上記スクリプトを実行するとエンドポイントのモデルが置き換わり、新規作成したモデルで予測ができるになります。モデル置換後のエンドポイントで再度評価データをスコアリングしてみると、モデル評価と全く同じスコアリング結果が得られていることがわかりました。
まとめ
今回は、1つのモデルについて学習からエンドポイント作成までを行いました。この一連の流れが、モデルとエンドポイントの作成の基本となり、ループ処理を加えることでバッチ的に複数のモデルとエンドポイントを作成できます。
次回は、作成したスクリプトにループ処理を追加して複数のモデルとエンドポイントを作成してみます。