Posted at

【メモ】Watson ML用Python Functionの中からWatson APIを呼ぶ


はじめに

自分用メモ。

Watson MLに登録することを目的にPython Functionを定義するのだが、その中でデフォルト構成に含まれていない追加ライブラリを導入するにはどうしたらいいかという問題。


サンプルコード

Python Functionの中でWatson APIの一つNLCを呼び出しています。

そのために必要なライブラリibm_watsonをどのように導入するかという問題です。

# NLC用のパラメータ

nlc_parms = { "nlc_apikey" : 'xxxx',
"nlc_classifier_id" : 'xxxx' }

# Python Function定義
def nlc_function(parms=nlc_parms):

# subprocess関数の中で、pipコマンドを発行します。
import subprocess
subprocess.check_output( "pip install ibm_watson --user",
stderr=subprocess.STDOUT, shell=True )

# これでWatson API用ライブラリが利用可能になります。
from ibm_watson import NaturalLanguageClassifierV1
nlc = NaturalLanguageClassifierV1(iam_apikey=parms['nlc_apikey'])

# score関数の定義
def score(payload):
texts = payload['values']
classes = ['j-hist', 'j-geo', 'science']
rets = []
for text in texts:
text = text[0]
text = text.replace(' ', '')
res0 = nlc.classify(parms['nlc_classifier_id'], text).get_result()
res = res0["classes"]
ret = [0] * len(classes)
top_class = res0['top_class']
for i, c in enumerate(classes):
if top_class == c:
cls = i
for item in res:
if item['class_name'] == c:
conf = item['confidence']
ret[i] = conf
rets.append([cls, ret])
retf = {'fields': ['prediction', 'probability'], 'values': rets }
return retf
return score


テスト

payload = {"fields": ["text"], "values": [[text1_wakati], [text2_wakati]]}

nlc_result = nlc_function()(payload)
print(nlc_result)

テスト結果



{'fields': ['prediction', 'probability'], 'values': [[0, [0.9847133162000282, 0.008789426452271184, 0.0064972573477005725]], [2, [0.006931840825441473, 0.005807992260436062, 0.9872601669141225]]]}


Python Functionの登録

これでPython FunctionをWatson MLに登録可能です。

具体的な手順は以下のとおり。

wml_credentials = {

"apikey": "xxxx",
"instance_id": "xxxx",
"password": "xxxx",
"url": "https://us-south.ml.cloud.ibm.com",
"username": "xxxx"
}

from watson_machine_learning_client import WatsonMachineLearningAPIClient
client = WatsonMachineLearningAPIClient(wml_credentials)

# PythonFunctionをstore_function関数で登録します
meta_data = { client.repository.FunctionMetaNames.NAME : 'NLC model' }
function_details = client.repository.store_function( meta_props=meta_data, function=nlc_function )

# Function IDを取得します
function_id = function_details["metadata"]["guid"]
print(function_id)

# Functionをdeployします

function_deployment_details = client.deployments.create(artifact_uid=function_id, name='NLC deployment' )