Azure Machine Learning の Juypter Notebook 対応 ( 後編 )


Microsoft Japan Data Platform Tech Sales Team

森本 信次

前回はサンプルデータを使ってボストンの住宅価格の予測モデルを開発しましたが、今回は実際にこのモデルを使用するための手順を見ていくことにしましょう。

 

Web サービスのセットアップ

モデルの開発後には、そのモデルを Web サービスとしてデプロイすることで、他からそのモデルを使用できるようになります。以下では Webサービスのデプロイをサポートする 「azureml」 パッケージを Notebook 環境へインポートして、「demoservice」 という名前の Web サービスをセットアップしています。

# ワークスペースに関する情報を抽出
from azureml import Workspace
ws = Workspace()
workdspace_id = ws.workspace_id
authorization_token = ws.authorization_token

# Web サービスのセットアップ
from azureml import services
@services.publish(workdspace_id, authorization_token)
@services.types(crim=float, zn=float, indus=float, chas=float, nox=float, rm=float, age=float, dis=float, rad=float, tax=float, ptratio=float, black=float, lstat=float)
@services.returns(float)
def demoservice(crim, zn, indus, chas, nox, rm, age, dis, rad, tax, ptratio, black, lstat):
    # predict the label
    feature_vector = [crim, zn, indus, chas, nox, rm, age, dis, rad, tax, ptratio, black, lstat]
    return lm.predict(feature_vector)

 

Web サービスの使用

Web サービスのセットアップを行う前述のコードを実行すると、以下のコードのようにこの Web サービスを使用できるようになります。この Webサービスの使用する方法は Notebook の現在のセッションでのみ有効な方法です。

# Web サービスを使用
demoservice (0.00632, 18, 2.31, 0, 0.538, 6.575, 65.2, 4.09, 1, 296, 15.3, 396.9, 4.98)
# 予測結果
30.008212692344628

 

では現在の Notebook のセッションの外部からこの Web サービスを使用するにはどうすれば良いでしょうか ? 実は Python のスクリプトを使って service url、api_key  を指定するだけで使用できるのです。必要となる service_url および api_key は 以下のコードを実行すれば help_url 、 service_id も含めて取得しています。

# Web サービスを使用するために必要となる情報を入手
service_url = demoservice.service.url
api_key = demoservice.service.api_key
help_url = demoservice.service.help_url
service_id = demoservice.service.service_id
# print(service_url)
# print(api_key)
# Web サービス が正常にデプロイされ、使用可能となるまで数秒ほど待ちます
 import time
time.sleep(10)



import urllib2

# Python 3 以降を使用している場合は、urllib を urllib2 の替わりにインポートします。
 import json
data =  {

        "Inputs": {

                "input1":
                {
                    "ColumnNames": ["crim", "zn", "lstat", "age", "tax", "rad", "black",
                                    "chas", "nox", "rm", "indus", "ptratio", "dis"],
                    "Values": [ [ "0.00632", "18", "4.98", "65.2", "296", "1", "396.9",
                                 "0", "0.538", "6.575", "2.31", "15.3", "4.09" ],
                               ["0.02731", "0", "9.14", "78.9", "242", "2", "396.9",
                                "0", "0.469", "6.421", "7.07", "17.8", "4.9671"],
                            ]
                },        },
            "GlobalParameters": {

}
    }
body = str.encode(json.dumps(data))

url = service_url
api_key = api_key # Replace this with the API key for the web service

headers = {'Content-Type':'application/json', 'Authorization':('Bearer '+ api_key)}

req = urllib2.Request(url, body, headers)

 try:
    response = urllib2.urlopen(req)

    # If you are using Python 3+, replace urllib2 with urllib.request in the above code:
    # req = urllib.request.Request(url, body, headers)
    # response = urllib.request.urlopen(req)

    result = response.read()
    print(result)
 except urllib2.HTTPError, error:
    print("The request failed with status code: " + str(error.code))
    # Print the headers - they include the requert ID and the timestamp,
    # which are useful for debugging the failure

    print(error.info())
    print(json.loads(error.read())) 

# 予測結果
{"Results":{"output1":{"type":"table","value":{"Values":[["30.0082126923446"],["25.0298606038187"]]}},"output2":{"type":"table","value":{"Values":[["data:text/plain,Execution OK\r\n",null]]}}}}

 

Web サービスの再デプロイ

既定では [ Web サービスのセットアップ ] のセクションのコードを複数回実行するとサービスが複数生成されてしまいます。それらのサービスが異なる url、api_key、help_url および service_id を持つことになるので、単に Webサービスの再デプロイを行いたい場合には、以下のように service_id を指定する必要があります。この指定を行わない場合には、Webサービスを呼び出す側のコード内の url および api_key を Web サービスのデプロイの都度変更しなくてはなりません。

 from azureml import services
 @services.publish(workdspace_id, authorization_token)
 @services.service_id(service_id)
 @services.types(crim=float, zn=float, indus=float, chas=float, nox=float, rm=float, age=float, dis=float, rad=float, tax=float, ptratio=float, black=float, lstat=float)
 @services.returns(float)
def demoservice(crim, zn, indus, chas, nox, rm, age, dis, rad, tax, ptratio, black, lstat):
   # predict the label
    feature_vector = [crim, zn, indus, chas, nox, rm, age, dis, rad, tax, ptratio, black, lstat]
    return lm.predict(feature_vector)

 

まとめ

いかがでしたでしょうか? 前編と後編を通して Azure ML の Jupyter Notebook を使用して、モデルの開発およびフィッティング、モデルの Azure へデプロイ、および デプロイしたサービスの利用方法を見てきました。他にも Notebook の解説付サンプルが提供されいますので、是非お試しいただければと思います。

Comments (0)

Skip to main content