Python関数を書いて、それをアセットとして保存し、モデルをデプロイする方法を学びます。
デプロイ可能な関数の一般要件のリストについては、 デプロイ可能関数の一般要件を参照してください。 関数のデプロイメント中に何が発生するかについては、 関数のデプロイメント・プロセス を参照してください
デプロイ可能関数の一般要件
正常にデプロイするには、関数が以下の要件を満たす必要があります:
- インポート時の Python 関数ファイルには、そのスコープの一部として
score
関数オブジェクトが含まれている必要があります。 スコア関数の要件 を参照してください - 評価入力ペイロードは、 入力要件のスコアリング にリストされている要件を満たしている必要があります。
score
の出力として予期される出力ペイロードには、状況コード 200 のscore_response
変数のスキーマが含まれている必要があります。score
出力では、JSON オブジェクトの配列を値とするprediction
パラメーターが必須であることに注意してください。- Python クライアントを使用して、外部関数への参照を含む Python 関数を保存すると、外部関数のスコープ内のコード (ネストされた関数を含む) のみが保存されます。 したがって、外部関数の有効範囲外のコードは保存されないため、関数をデプロイするときに使用できません。
スコア関数の要件
score
関数オブジェクトを追加するには、次の 2 つの方法があります。- 明示的にユーザーが追加する方法と、
- Python関数をアセットとしてwatsonx.aiRuntime リポジトリに保存する際に使用されるメソッドによって、暗黙的に保存されます
score
関数は、1つのJSON入力パラメータ、または2つのパラメータ(ペイロードとベアラートークン)を受け取ることができる。score
関数が JSON 直列化可能オブジェクトを返す必要があります (例: ディクショナリーまたはリスト)。
スコアリング入力要件
スコアリング入力ペイロードには、このサンプル・スキーマに示すように、
values
という名前の配列が含まれている必要があります。 ペイロードではinput_data
パラメーターは必須です。input_data
パラメーターには、追加の名前と値のペアを含めることもできます。{"input_data": [{ "values": [["Hello world!"]] }] }
得点入力ペイロードは、'
score
の入力パラメータ値として渡されなければならない。 この方法により、score
入力パラメーターの値がscore
内で適切に処理されるようにすることができます。スコアリング入力ペイロードは、当該の Python 関数の入力要件に一致する必要があります。
スコアリング入力ペイロードには、 入力データ・スキーマの例と一致する配列が含まれている必要があります。
入力データ・スキーマの例
{"input_data": [{
"values": [["Hello, world!"]]
}]
}
Pythonコード例(ペイロードとトークン)
#wml_python_function
def my_deployable_function():
def score(payload, token):
message_from_input_payload = payload.get("input_data")[0].get("values")[0][0]
response_message = "Received message - {0}".format(message_from_input_payload)
# Score using the pre-defined model
score_response = {
'predictions': [{'fields': ['Response_message_field'],
'values': [[response_message]]
}]
}
return score_response
return score
score = my_deployable_function()
Python関数のテスト
Python関数をテストする方法を紹介します:
input_data = { "input_data": [{ "fields": [ "message" ],
"values": [[ "Hello, world!" ]]
}
]
}
function_result = score( input_data )
print( function_result )
Hello, world!"というメッセージを返す。
機能のデプロイメント・プロセス
The Python code of your Function asset gets loaded as a Python module by the watsonx.ai Runtime engine by using an import
statement. これは、コードが 1 回だけ実行されることを意味します (機能がデプロイされるとき、または対応するポッドが再始動されるたびに)。 その後、関数資産によって定義された score
関数が、すべての予測要求で呼び出されます。
デプロイ可能な関数を処理する
以下のいずれかの方法を使用して、デプロイ可能な Python 関数を作成します:
始める前に
APIキーを生成して、タスクの認証情報を設定する必要があります。 詳細については、タスク資格情報の管理を参照のこと。
REST API を使用したデプロイ可能な関数を作成する
REST API の場合、 Python 関数はファイルを介して直接アップロードされるため、このファイルには既に score
関数が含まれている必要があります。 score
関数内で後で使用するために実行する必要がある 1 回限りのインポートは、ファイルのグローバル・スコープ内で実行できます。 このファイルを Python 関数としてデプロイすると、グローバル・スコープで使用可能な一回限りのインポートがデプロイメント中に実行され、後ですべての予測要求で再利用されます。
関数アーカイブは .gz
ファイルでなければなりません。
score
関数ファイルの例:
Score function.py
---------------------
def score(input_data):
return {'predictions': [{'values': [['Just a test']]}]}
一回限りのインポートを使用する score
関数の例:
import subprocess
subprocess.check_output('pip install gensim --user', shell=True)
import gensim
def score(input_data):
return {'predictions': [{'fields': ['gensim_version'], 'values': [[gensim.__version__]]}]}
Python クライアントを使用したデプロイ可能な関数を作成する
Python 関数をアセットとして永続化するために、 Python クライアントは wml_client.repository.store_function
メソッドを使用します。 Python関数を永続化するには2つの方法があります:
Python 関数を含むファイルを使用した関数の永続化
このメソッドは、REST API を介して Python 関数ファイルを永続化するのと同じです (score
は、 Python ソース・ファイルの有効範囲内で定義する必要があります)。 詳しくは、 REST API を使用したデプロイ可能な関数の作成を参照してください。
wml_client.repository.store_function
メソッドを呼び出す場合は、ファイル名を最初の引数として渡します。
関数オブジェクトを介して関数を永続化にします
score
という名前のネストされた関数を使用して Python Closures を作成することにより、 Python 関数オブジェクトを永続化することができます。 score
関数は、呼び出されたときに、関数オブジェクトとして保管されている外部関数によって戻されます。 この score
関数は、 デプロイ可能関数の一般要件にリストされている要件を満たしている必要があります。 この場合、1 回限りのインポートと初期セットアップ・ロジックを外部のネストされた関数に追加して、デプロイメント中に実行され、 score
関数内で使用されるようにする必要があります。 prediction
要求中に繰り返し必要になるロジックは、ネストされた score
関数内に追加する必要があります。
Python クライアントを使用して保存するサンプル Python 関数:
def my_deployable_function():
import subprocess
subprocess.check_output('pip install gensim', shell=True)
import gensim
def score(input_data):
import
message_from_input_payload = payload.get("input_data")[0].get("values")[0][0]
response_message = "Received message - {0}".format(message_from_input_payload)
# Score using the pre-defined model
score_response = {
'predictions': [{'fields': ['Response_message_field', 'installed_lib_version'],
'values': [[response_message, gensim.__version__]]
}]
}
return score_response
return score
function_meta = {
client.repository.FunctionMetaNames.NAME:"test_function",
client.repository.FunctionMetaNames.SOFTWARE_SPEC_ID: sw_spec_id
}
func_details = client.repository.store_function(my_deployable_function, function_meta)
このシナリオでは、Python関数が 'score
関数を含むPythonファイルを作成し、その関数ファイルをwatsonx.aiRuntime リポジトリにアセットとして保存します:
score = my_deployable_function()
もっと見る
親トピック: Python 関数をデプロイする