コマンドで理解する New Azure ML ステップ・バイ・ステップ

新しい Azure Machine Learning (Preview) は基本的にコマンドから使う。(実際、Azure Portal からは一部の機能しか使えない。)

ここでは、このコマンドを順に見くことで、新しい Azure Machine Learning がどのようなものか確認する。
ざっくりと Experimentation と Model Management という独立した 2 つの作業にわかれている。

準備

ここで紹介するコマンドを使うには、後述の Azure Machine Learning Workbench をインストールするか、下記の通り個別にパッケージをインストールする。

pip install azure-cli
pip install azure-cli-ml

CLI コマンドのヘルプを見るには -h オプションを使用する。
この投稿では、コマンドを難解にしない目的から必要最小限の引数しか指定しないが、細かな設定については下記のように確認してほしい。

# show what resource can be used
az ml -h
# show what command can be used for workspace
az ml workspace -h
# show what option can be used for workspace creation
az ml workspace create -h

また、以降を進める前に、CLI から、あらかじめ Azure にログインをしておこう。(az login を実行する。)

Experimentation Account と Workspace の作成

新しい Azure ML のアカウントには Experimentation Account と Model Management Account がある。
モデル構築時は Experimentation Account を作成し、ここに Workspace を作成して、Workspace 内で個々の Project を作成する。

下記は、CLI コマンドを使って、リソースグループ myRG01 に Experimentation Account (名前 exacc01) と Workspace (名前 testws01) を作成している。(なお、Experimentation Account と Workspace は Azure Portal からも作成できる。)

# Create experimentation account
az ml account experimentation create -n "exacc01" -g "myRG01"
# Create workspace
az ml workspace create -a "exacc01" -n "testws01" -g "myRG01"

Training フェーズ (モデルの作成)

Python のコード作成、トレーニング、モデル作成には Azure Machine Learning Workbench (Windows 版、Mac 版) や Visual Studio Code Tools for AI というデスクトップ ツール (IDE) が提供されている。
なお、これらを使うには、あらかじめ前述の Experimentation Account を作っておく必要がある。(起動時に Experimentation Account を確認する。)

aml_workbench

ここではこれらのツールの使い方は説明しないので “チュートリアル : Classify Iris” を参照してほしいが、主に下記のようなことをおこなう。

  • 上記で作成した Workspace に Project を新規作成
  • Data Set を準備・整形 (dataprep)
  • Python で Training のコードを作成 (学習済モデルの作成)
  • 実行と結果の確認

(補足 : Project は単なるローカル環境のフォルダではなく、Azure 上のリソースとして作成される。カレントフォルダーの Project が Active Project として認識され、例えば、Active Project 上で az ml account experimentation show と入力すると、その Project の Experimentation が表示される。)

新しい Azure Machine Learning はツールに依存しておらず (Open で)、その後の作業も含め Azure Machine Learning Workbench などがなくても Azure Machine Learning のサービス全体を利用できるが、実際、Azure Machine Learning を使うなら Workbench を使わないともったいない。理由は、下記の通り Azure Machine Learning Workbench 自体が高機能なためだ。
(言い換えるなら、この Azure Machine Learning Workbench 自体が、新しい Azure Machine Learning の半分を占めているといっても過言ではない。)

  • Data の準備では、元のデータを変えることなく、Data cleaning のための細かなステップをエディタでビジュアルに定義できる。(Power BI などで使われていた手法だ)
    メトリクスごとのデータ プロファイルをみながら編集できる。
  • PROSE と呼ばれる AI による Data Wrangling テクノロジにより、ちょっとしたデータ整形なら、Excel の Autofill のように賢く自動解釈する。(“Diving deep into what’s new with Azure Machine Learning” 参照)
  • トレーニングでは、config を構成し、ローカルマシン以外に、DSVM や HDInsight Spark cluster などを容易に使える。つまり、学習の際、Azure 上の GPU 等の高尚なコンピューティング環境を容易に扱える。(“Configure compute environment” 参照)
    なお、Azure のサービスを介しておこなわれるので、Workbench を使わない場合でも Experimentation Account が必要だ。

Workbench には、他にも Jupyter Notebook とのインテグレーション、ROC 曲線などによる可視化 等、多くのサポート機能を備えている。

Python のコードを作成して学習が完了したら、学習済のモデル ファイル (.pkl) を作成しておく。

Scoring フェーズ

学習済モデル ファイル (.pkl) ができたら、これを元に Scoring のコードを作成して、これを Web Service として発行する。

以下は、付属している Iris の Scoring のサンプルだ。(あやめの種類を区別する Logistic Regression のモデルを扱っている。)
この中の以下の処理に注目してほしい。

  • カレント フォルダから、前述で学習したモデル (下記の model.pkl) をロードしている。
  • 下記の通り、このあとの Web Service 化にそなえて、init() (初期化の処理), run() (Web Service 本体の処理) を定義し、これらを main から呼び出してデバッグする。
  • Azure Machine Learning が提供する generate_schema() 関数で、Input (入力引数), Output などの Web Service の仕様を json で出力している。
# Import data collection library. Only supported for docker mode.
# Functionality will be ignored when package isn't found
try:
  from azureml.datacollector import ModelDataCollector
except ImportError:
  print("Data collection is currently only supported in docker mode. May be disabled for local mode.")
  # Mocking out model data collector functionality
  class ModelDataCollector(object):
    def nop(*args, **kw): pass
    def __getattr__(self, _): return self.nop
    def __init__(self, *args, **kw): return None
  pass

import os

# Prepare the web service definition by authoring
# init() and run() functions. Test the functions
# before deploying the web service.
def init():
  global inputs_dc, prediction_dc
  from sklearn.externals import joblib

  # load the model file
  global model
  model = joblib.load('model.pkl')

  inputs_dc = ModelDataCollector("model.pkl", identifier="inputs")
  prediction_dc = ModelDataCollector("model.pkl", identifier="prediction")

def run(input_df):
  import json

  # append 40 random features just like the training script does it.
  import numpy as np
  n = 40
  random_state = np.random.RandomState(0)
  n_samples, n_features = input_df.shape
  input_df = np.c_[input_df, random_state.randn(n_samples, n)]
  inputs_dc.collect(input_df)

  pred = model.predict(input_df)
  prediction_dc.collect(pred)
  return json.dumps(str(pred[0]))

def main():
  from azureml.api.schema.dataTypes import DataTypes
  from azureml.api.schema.sampleDefinition import SampleDefinition
  from azureml.api.realtime.services import generate_schema
  import pandas

  df = pandas.DataFrame(data=[[3.0, 3.6, 1.3, 0.25]], columns=['sepal length', 'sepal width','petal length','petal width'])

  # Turn on data collection debug mode to view output in stdout
  os.environ["AML_MODEL_DC_DEBUG"] = 'true'

  # Test the output of the functions
  init()
  input1 = pandas.DataFrame([[3.0, 3.6, 1.3, 0.25]])
  print("Result: " + run(input1))

  inputs = {"input_df": SampleDefinition(DataTypes.PANDAS, df)}

  #Genereate the schema
  generate_schema(run_func=run, inputs=inputs, filepath='./outputs/service_schema.json')
  print("Schema generated")

if __name__ == "__main__":
    main()

ここまでで、学習済モデル ファイル (上記の model.pkl)、Web Service の仕様を定義した Json ファイル (上記の service_schema.json)、そしてこの Scoring 用の Python コード (score_iris.py とする) が準備できた。

Computing Environment の作成と設定

以上で必要なファイルは整ったので、Web Service 化して展開 (deploy) する。
ここからは Model Management の作業になるが、必要なファイルさえ揃っていれば、ここまで使ってきた Experimentation Account 等は必要ない。

まず、前提知識をいくつか記載する。

新しい Azure Machine Learning を使った Web Service 化では、展開の際に AKS (Azure Container Service の Kubernetes cluster) と ACR (Azure Container Registry) が使われる。このため、あらかじめ、コマンド az provider register --namespace Microsoft.ContainerRegistry によって Azure Container Registry プロバイダーを登録しておく必要がある。(既に登録済の場合は OK)

また、Web Service 化は、ここで紹介する方法以外に、単一のコマンドですべて生成することもできるが、ここでは構成などを理解できるように、あえて複数コマンドでわけて展開をおこなう。(構造が理解できてきたら、単一コマンドで省力化しても良いだろう。)

まず、展開の前に、展開環境である Computing Environment を下記の通り新規作成する。
ここでは、testenv01 という名前の Computing Environment を East US 2 に作成する。(Kubernetes クラスタの名前は「testenv01」になる。)

なお、下記の -c (--cluster) オプションで Azure Container Service (AKS) が使用されるが、オプションを指定しない場合は local の docker container に展開される。(ここでは省略するが、コマンドを使って local と AKS を切り替えることも可能。)

az ml env setup -n testenv01 -l eastus2 -c

上記のように -g (--resource-group) オプションを省略すると、このコマンドによって testenv01rg と testenv01rg-azureml-cxxxx の 2 つのリソースグループが新規作成され、後者のリソースグループに Azure Container Service の各ノード (VM) が展開される。(xxxx は数字。今回は testenv01rg-azureml-c7294 だった。)
これらのリソースグループはこのあとのコマンドで使うのでおぼえておく。

下記のコマンドで Computing Environment がすべて表示されるので、作成中の環境の provisioning state が Succeeded になるまで待つ。(特に新規に Azure Container Service を作成する場合は、最初のノード作成に時間がかかる。)

az ml env list

Succeeded になったら、下記コマンドを実行して、この作成した環境を Active Compute Environment として設定する。

az ml env set -n testenv01 -g testenv01rg

なお、作成された Compute Environment の情報は Azure 上に保存されるが、この Active Compute Environment はその作業環境上のみ (使用しているクライアント上のみ) の設定なので注意。
以下のコマンドで Active (Current) の環境を確認できる。

az ml env show

Model Management Account の作成と設定

次に、下記コマンドで Model Management Account を新規作成する。(このあと登録するモデルは、ここでバージョン等が管理される。)

az ml account modelmanagement create -l eastus2 -n testmg01 -g myRG01

つぎに、下記コマンドによって、上記で作成した Model Management Account  を使用中の作業環境 (クライアント) における Active な Model Management Account として設定する。

az ml account modelmanagement set -n testmg01 -g myRG01

Active な Model Management Account は下記コマンドで確認できる。

az ml account modelmanagement show

Web Service としての展開 (Deploy)

下記コマンドで、前述で作成した学習済モデル ファイル (model.pkl) を登録する。(何度も登録するとバージョンが 2, 3 とあがっていくので注意。)
この際、登録されたモデルの ID (model id) が出力されるので、これをコピーしておく。(以降では model id を 08ceeb5842eb4fa4a94d47533d7e3aab とする。)

az ml model register -m model.pkl -n model.pkl

つぎに、下記コマンドで、上記で準備した Web Service 用の Scoring のソース (score_iris.py) と仕様 (service_schema.json) を登録して Manifest を作成する。ここで、-i (--model-id) オプションは、上記で登録したモデルの ID である。つまり、使用するモデルは都度 変更できる。
(なお、何度も登録すると Manifest のバージョンがあがっていくので注意。)

この Manifest 作成時に manifest id が出力されるので、これをコピーしておく。(以降では manifest id を 789c3c18-b385-423f-b88c-429a2973b99b とする。)

az ml manifest create -n testmanifest1110 -f score_iris.py -r python -i 08ceeb5842eb4fa4a94d47533d7e3aab -s service_schema.json

この Manifest を使って、下記の通り Image を新規作成して登録する。Image の実体は、ACR (Azure Container Registry) に登録される。(この ACR は、上記の az ml env setup コマンドで新規作成されたリソースグループの中にある。)
作成時、イメージの Id が出力されるので、これをコピーしておく。(以降では image id を a61ba643-884d-4181-a7cb-b1b9c6c48b3e とする。)

az ml image create -n testimage1110 --manifest-id 789c3c18-b385-423f-b88c-429a2973b99b

あとは、この登録されたイメージを使って、下記の通り Web Service を展開して起動する。
今回は使用しないが、追加の Package が必要な場合には -c オプションで Conda Dependencies File (.yml) を指定できる。
なお、下記で “realtime” と指定しているが、今後、”batch” (Azure Batch 展開) も可能になるようだ。

az ml service create realtime --image-id a61ba643-884d-4181-a7cb-b1b9c6c48b3e -n testapp1110 --collect-model-data true

下記の通り出力されるので、出力された service id (testapp1110.testenv01-90e88070.eastus2) をおぼえておく。(このサービスを利用する際に使用する。)

Creating service............................Done
Service ID: testapp1110.testenv01-90e88070.eastus2
Usage for cmd: az ml service run realtime -i testapp1110.testenv01-90e88070.eastus2 -d "{\"input_df\": [{\"petal length\": 1.3, \"petal width\": 0.25, \"sepal width\": 3.6, \"sepal length\": 3.0}]}"
Usage for powershell: az ml service run realtime -i testapp1110.testenv01-90e88070.eastus2 --% -d "{\"input_df\": [{\"petal length\": 1.3, \"petal width\": 0.25, \"sepal width\": 3.6, \"sepal length\": 3.0}]}"
Additional usage information: 'az ml service usage realtime -i testapp1110.testenv01-90e88070.eastus2'

Web Service の利用

展開された Web Service (REST) の URL, Port, エンベロープなどは、下記コマンドで確認できる。

az ml service usage realtime -i testapp1110.testenv01-90e88070.eastus2
Scoring URL:
  http://13.68.115.32:80/api/v1/service/testapp1110/score

Headers:
  Content-Type: application/json
  Authorization: Bearer <key>
    (<key> can be found by running 'az ml service keys realtime -i testapp1110.testenv01-90e88070.eastus2')

Swagger URL:
  http://13.68.115.32:80/api/v1/service/testapp1110/swagger.json

Sample CLI command:
  Usage for cmd: az ml service run realtime -i testapp1110.testenv01-90e88070.eastus2 -d "{\"input_df\": [{\"petal width\": 0.25, \"sepal width\": 3.6, \"sepal length\": 3.0, \"petal length\": 1.3}]}"
  Usage for powershell: az ml service run realtime -i testapp1110.testenv01-90e88070.eastus2 --% -d "{\"input_df\": [{\"petal width\": 0.25, \"sepal width\": 3.6, \"sepal length\": 3.0, \"petal length\": 1.3}]}"

Sample CURL call:
  curl -X POST -H "Content-Type:application/json" -H "Authorization:Bearer <key>" --data "{\"input_df\": [{\"petal width\": 0.25, \"sepal width\": 3.6, \"sepal length\": 3.0, \"petal length\": 1.3}]}" http://13.68.115.32:80/api/v1/service/testapp1110/score

Get debug logs by calling:
  az ml service logs realtime -i testapp1110.testenv01-90e88070.eastus2

Get STDOUT/STDERR or Request/Response logs in App Insights:
  https://analytics.applicationinsights.io/subscriptions/b3ae1c15-4fef-4362-8c3a-5d804cdeb18d/resourcegroups/testenv01rg-azureml-c7294/components/mlcrpaib1917249512d#/discover/home?apptype=Other%20(preview)

ここで認証用に使用する key は、下記コマンドで出力できる。

az ml service keys realtime -i testapp1110.testenv01-90e88070.eastus2
PrimaryKey: 6d452f09a4xxxxxxxxxxxxxxxxxxxxxx
SecondaryKey: ec7453b683xxxxxxxxxxxxxxxxxxxxxx

このため、Fiddler などを使って下記の通り HTTP Request をおこなう。
今回は、あやめの情報 (ガクの幅など) を渡すことで、そのあやめの種類をモデルから推測して返している。

POST http://13.68.115.32:80/api/v1/service/testapp1110/score
Content-Type: application/json
Authorization: Bearer 6d452f09a4xxxxxxxxxxxxxxxxxxxxxx

{
  "input_df": [
    {
      "petal width": 0.25,
      "sepal width": 3.6,
      "sepal length": 3.0,
      "petal length": 1.3
    }
  ]
}
HTTP/1.1 200 OK
content-type: application/json

"\"Iris-setosa\""

Scaling

前述の通り Kubernetes の Cluster が使用されるため、以降は kubectl コマンドで管理できる。
しかし、よく使う Agent Node (Virtual Machine) や Replica の一部の管理タスクは Azure ML のコマンドも使えるので最後に紹介しておこう。

例えば、下記は、Azure ML のコマンドを使って Agent Node (Agent の Virtual Machine) を 3 台に変更する。

az acs scale -g testenv01rg-azureml-c7294 -n testenv01 --new-agent-count 3

下記は、Autoscale の設定を解除して、この Agent 上に動いている Replica を 3 つに設定している。(下記の通り kubectl コマンドを使わずに設定できる。)

az ml service update realtime -i testapp1110.testenv01-90e88070.eastus2 --autoscale-enabled false
az ml service update realtime -i testapp1110.testenv01-90e88070.eastus2 -z 3

 

ご覧のように、新しい Azure Machine Learning を使うと Python で構築した Score (Test) の処理をそのまま Web Service として発行できるが、同じようなことが可能な Server Platform (オンプレミスの製品) として Machine Learning Server というものが使えるのをご存じだろうか。旧 R Server と呼んでいたもので、現在は Python も使えるようになっている。
また、コマンドや構成の一部で runtime として「python」を指定している点に気づいたかと思うが、現在 Model Management のみ R がサポートされているらしく、今後、R の Experimentation やドキュメントも出てくることだろう。
Machine Learning Team Blog で書いているように、これらのプラットフォーム (クラウド版の Azure ML とオンプレ Server の ML Server) は今後 統一化されていく予定らしい。

 

参考にした情報 :

Azure Machine Learning Tutorial – Classify Iris :
https://docs.microsoft.com/en-gb/azure/machine-learning/preview/tutorial-classifying-iris-part-1

Azure Machine Learning Reference :
https://docs.microsoft.com/en-us/azure/machine-learning/preview/data-prep-python-extensibility-overview

Advertisements

R で日本語 OCR (tesseract)

今回実際に必要になった例だが、大量の伝票画像を電子化 (文字化) して、そこから情報を得るようなケースを考えてみたい。
伝票のヘッダー・明細や、項目の位置などは DNN を使ってあらかた学習できるかもしれないが、問題なのは、そこから文字を読み取る作業だ。

MNIST のサンプルなど、文字認識はいまや使い古された画像認識の手法だが、アルファベットや数字とは違い、日本語の場合、漢字も含め相当な数の文字があるため、一から教師あり画像を準備してトレーニングするのは (実際のビジネスでは) 現実的ではないからだ。

そこで、今回、tesseract の R のパッケージを使うことを検討してみた。

使い方

使い方は簡単だ。(今回は、Mac または PC 上の環境を想定する。)
まず、R コンソールなどから、tesseract のパッケージ (バイナリ) をインストールする。

install.packages("tesseract")

既定のバイナリには英語のデータしか入っていないので、Github から日本語の Trained データを落とせば良いが注意がある。
現在 Github にある最新は tesseract 4 のデータだが、CRAN のリポジトリにある tesseract 1.4 パッケージ (R のパッケージ) は tesseract 3.0X がベースになっているので (つまり、tesseract 4 ではない)、tesseract 3.04 ベースの Trained データを落としてくる必要があるのだ。
このため、現在は、以下の通り Branch を指定してダウンロード (Clone) する。

git clone --branch 3.04.00 https://github.com/tesseract-ocr/tessdata.git

下図の通り、各言語ごとの .traineddata がダウンロードされるので、この中の jpn.traineddata を、tesseract のインストール・ディレクトリである %userprofile%\Documents\R\win-library\3.4\tesseract\tessdata にコピーする。

以上で準備完了だ。

今回は Windows や Mac 上でのセットアップ方法だが、本番運用などで Linux に環境を作る際には下記を参照してほしい。

https://github.com/ropensci/tesseract

プログラミング

今回は、下図のサンプル画像を読み込ませよう。

下記の通り、R を使って、日本語用の Trained データ (エンジン) をロードし、これで OCR を行えば良い。

library(tesseract)
tseng <- tesseract(language = "jpn")
text <- ocr(
  "C:\\tmp\\sample.png",
  engine = tseng)
cat(text)

実行結果は、一見、良い感じだ。(下図参照)
今回学習済みデータ (.traineddata) をダウンロードして使ったが、オープンソースなので元データのカスタマイズなども可能らしい。

が、しかし、、、

いろいろやってみたが、今回のような機械で出力した伝票のようなケース (大きさも均一で、一定精度以上のフォント画像) には使えるが、精度の問題で、フリーな手書きの認識などにはまだ耐えられない感じだ。

例えば、文字の大きさ (解像度) を変えると認識率が大きく変わってしまうので、上記の例も、画像サイズによっては誤った結果が返ってくるので注意が必要だ。
また、下図のような手書きのデータもひらがなの「すばる」をまったく認識してくれない状況だった。(解像度を変えると、このひらがなの箇所の結果がいろいろ変化する状況。。。)

日本語については、現状はまだ用途を限定して使う感じだ。(英語の精度はすこぶる良いが)