このページの本文へ

FIXER cloud.config Tech Blog

自分が思う一番簡単な方法でAzureMLのAutoMLによるMLOpsを組んだ

2020年05月15日 11時00分更新

文● 河口 祭/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「自分が思う一番簡単な方法でAzureMLのAutoMLでMLOpsを組んだ #Azureリレー」を再編集したものです。

 こんにちは四日市事業所の河口です。

 今回は新しいAzure Machine LearningとAzure DevOpsを使って自動的にAutoMLで作成したモデルをAzure Container Instancesにデプロイしていきます。

準備

 学習のデータセットは以下のものを使用しました。

 http://archive.ics.uci.edu/ml/datasets/Iris

 ダウンロードしたファイルの拡張子をcsvにしておき、先頭に以下のパラメータ名を追加します。

sepal_length sepal_width petal_length petal_width class

 Azure DevOpsと連携するのでgithubか何かのリポジトリに以下のコードを上げておきます。

 ServicePrincipalAuthenticationに入力するデータは後程説明します。

condaEnv.yml


name: project_environment
dependencies:
  # The python interpreter version.
  # Currently Azure ML only supports 3.5.2 and later.
- python=3.6.2
- psutil=5.3

- pip:
  - azureml-sdk[notebooks]
  - pandas==0.23.4
  - joblib
  - azureml-defaults
  - azureml.automl.runtime

deploymentConfig.yml


---
containerResourceRequirements:
  cpu: 1
  memoryInGB: 2
computeType: ACI
location: japaneast

inferenceConfig.yml


entryScript: score.py
runtime: python
condaFile: condaEnv.yml
schemaFile:
sourceDirectory:
enableGpu: False
baseImage:
baseImageRegistry:

trainAndCreatemodel.py


from azureml.train.automl import AutoMLConfig
from azureml.core import Workspace, Dataset
from azureml.core.experiment import Experiment
from azureml.core.model import Model
from azureml.core.authentication import ServicePrincipalAuthentication

auth = ServicePrincipalAuthentication(
    tenant_id="",
    service_principal_id="",
    service_principal_password="")

subscription_id = ''
resource_group = ''
workspace_name = ''

ws = Workspace(subscription_id, resource_group, workspace_name, auth=auth)

train_data = Dataset.get_by_name(ws, name='')

label = "class"

automl_classifier = AutoMLConfig(
    task='classification',
    primary_metric='AUC_weighted',
    experiment_timeout_minutes=30,
    blacklist_models='XGBoostClassifier',
    training_data=train_data,
    label_column_name=label,
    n_cross_validations=2)

experiment_name = ''

experiment = Experiment(ws, experiment_name)

run = experiment.submit(automl_classifier, show_output=True)

description = ''

model = run.register_model(description=description,
                           model_name='')

score.py


import pickle
import json
import pandas as pd
import joblib
from azureml.core.model import Model
from azureml.core import Workspace, Dataset
from azureml.core.authentication import ServicePrincipalAuthentication


def init():
    global model
    global ws

    try:
        auth = ServicePrincipalAuthentication(
        tenant_id="",
        service_principal_id="",
        service_principal_password="")

        subscription_id = ''
        resource_group = ''
        workspace_name = ''

        ws = Workspace(subscription_id, resource_group,
                       workspace_name, auth=auth)

        model_path = Model.get_model_path(
            '', _workspace=ws)

        model = joblib.load(model_path)
    except Exception as e:
        print(e)


def run(raw_data):
    try:
        data = json.loads(raw_data)["data"]
        data = pd.DataFrame(data)
        data.columns = ['sepal_length', 'sepal_width',
                        'petal_length', 'petal_width']

        result = model.predict(data)
        return json.dumps({"result": result.tolist()})
    except Exception as e:
        result = str(e)
        return json.dumps({"error": result})


if __name__ == "__main__":
    init()

    test_data = '{"data":[[0,0,0,0]]}'
    prediction = run(test_data)
    print("Test result: ", prediction)

構築

 1.Azure MLのワークスペース作成

 2.各項目を入力

 3.新しい Azure Machine Learning Studioを起動

 4.データセット作成のローカルファイルからを選択

 5.データセット名を入力し次へ

 6.データストアを選択した後、参照からデータセットのファイル(Iris.csv)をアップロードし次へ

 7.列見出しを最初のファイルのヘッダーを使用するを選択し次へ

 8.入力する列や種類を決定し次へ

 9.問題がなければ作成を選択

 10.以下のリンクからAzure DevOpsにMachine Learningのツールをインストール

 https://marketplace.visualstudio.com/items?itemName=ms-air-aiagility.vss-services-azureml&targetId=d424a5c7-3838-4940-a5b4-4e0fce535f2c

 11.DevOpsのプロジェクトを選択しインストール

 12.インストールが完了したらDevOpsの画面に遷移する

 13.Project Settings -> Service connections -> New service connectionを選択

 14.Azure Resource Manager -> Service principal -> Machine Learning Workspaceを選択し、各項目を入力しSave

 15.Azure ポータルのActive Directoryの画面を開きアプリの登録から先ほど作成したサービスコネクションを選択する

 16.ここで表示されるアプリケーション ID、テナントIDをメモしておく

 17.証明書シークレットから新しいクライアントシークレットを追加する

 18.表示される値がパスワードになるので、先ほどメモしたアプリケーションID、テナントIDと合わせて冒頭の準備で示したServicePrincipalAuthenticationに入力する

 19.再びDevOpsの画面に移りビルドパイプラインを作成する。初めにUse Python versionに3.6と入力し追加する

 20.BashのTypeをFile Path、Script Pathをinstall_requirements.shとし追加する

 21.Azure CLIを選択し、サブスクリプションの選択、Script TypeをShell、Script LocationをInline script、Inline Scriptをpython trainAndCreateModelにし追加する

 22.Copy filesを選択し、SourceFolderに$(Build.SourcesDirectory)、TargetFolderに$(Build.ArtifactStagingDirectory)を入力し追加

 23.Publish build artifactsのPath to publishに$(Build.ArtifactStagingDirectory)を入力し追加

 24.最終的にazure-pipelines.ymlが以下のようになっていれば良い

azure-pipelines.yml


# Python package
# Create and test a Python package on multiple Python versions.
# Add steps that analyze code, save the dist with the build record, publish to a PyPI-compatible index, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/python

trigger:
- master

resources:
- repo: self

steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.6'
      addToPath: true
      architecture: 'x64'

  - task: Bash@3
    inputs:
      filePath: 'install_requirements.sh'

  - task: AzureCLI@2
    inputs:
      azureSubscription: 'azureMLConnection2'
      scriptType: 'bash'
      scriptLocation: 'inlineScript'
      inlineScript: 'python trainAndCreateModel.py'
  
  - task: CopyFiles@2
    inputs:
      SourceFolder: '$(Build.SourcesDirectory)'
      Contents: '**'
      TargetFolder: '$(Build.ArtifactStagingDirectory)'

  - task: PublishBuildArtifacts@1
    inputs:
      PathtoPublish: '$(Build.ArtifactStagingDirectory)'
      ArtifactName: 'drop'
      publishLocation: 'Container'

 25.ビルドパイプラインをトリガーすることでモデルの再トレーニングが行なわれ、モデルが登録される。正常に終了すればAzure ML Studioの方にモデルが登録されている

 26.リリースパイプラインを作成する。テンプレートはEmpty jobを選択する

 27.ArtifactsのAddからビルドパイプラインのソースを選択して追加

 28.ArtifactsのAddからAzureML Model Artifactも追加する

 29.Artifactsのビルドパイプラインのソースのトリガーを有効化する

 30.Stagesのjobを設定する。AzureML Model Deployを選択し追加

 31.各項目を入力

 Azure ML Workspace:サービスコネクションを選択
 Inference config Path:inferenceConfig.ymlを選択
 Model Deployment Target:Azure Containre Instanceを選択
 Deployment Name:ACIの名前を入力
 Deployment configuration file:deploymentConfig.ymlを選択
 Overwrite existing deployment:同名のACIを上書きするためにチェックマークを付ける

 32.リリースパイプラインを走らせ正常に終了すればAzureML StudioのエンドポイントにACIが追加されている

 33.詳細にエンドポイントがあるためメモをする

 34.正常に動作するかテストする。Postman等でメモをしたエンドポイントに対してPostすることで結果が返ってくれば成功

 以上でAzureMLのAutoMLでMLOpsの構築が完了しました。ここまで読んでくれた方ありがとうございます!

  河口 祭/FIXER

 四日市事業所所属

[転載元]
 自分が思う一番簡単な方法でAzureMLのAutoMLでMLOpsを組んだ #Azureリレー

カテゴリートップへ