学习如何编写Python函数,然后将其存储为资产,用于部署模型。
有关可部署功能的一般需求的列表,请参阅 可部署功能的一般需求。 有关函数部署期间发生的情况的信息,请参阅 函数部署过程
可部署功能的一般要求
要成功部署功能,该功能必须满足以下需求:
- 导入时的 Python 函数文件必须将
score
函数对象作为其作用域的一部分。 请参阅 评分功能需求 - 评分输入有效内容必须满足 评分输入需求 中列出的需求
- 期望作为
score
输出的输出有效内容必须包含状态码 200 的score_response
变量的模式。 请注意,prediction
参数 (以 JSON 对象数组作为其值) 在score
输出中是必需的。 - 使用 Python 客户机保存包含对外部函数的引用的 Python 函数时,仅会保存该外部函数 (包括其嵌套函数) 作用域中的代码。 因此,外部函数作用域之外的代码将不会保存,因此在部署函数时将不可用。
评分功能要求
- 存在两种添加
score
函数对象的方法:- 显式,按用户
- 在watsonx.aiRuntime 资源库中将Python函数保存为资产时使用的方法,隐式地
score
函数可接受一个 JSON 输入参数或两个参数:有效载荷和承载令牌。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!"。
功能部署过程
watsonx.ai运行时引擎会使用 "import
语句将功能资产的Python代码作为Python模块加载。 这意味着该代码将正好执行一次 (部署函数时或每次重新启动相应的 pod 时)。 然后,将在每个预测请求中调用 "函数" 资产定义的 score
函数。
处理可部署函数
使用下列其中一种方法来创建可部署的 Python 函数:
准备工作
您必须通过生成 API 密钥来设置任务凭证。 有关更多信息,请参阅管理任务凭证。
通过 REST API 创建可部署函数
对于 REST API ,由于 Python 函数是通过文件直接上载的,因此该文件必须已包含 score
函数。 以后需要在 score
函数中使用的任何一次性导入都可以在文件的全局作用域内完成。 当此文件作为 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函数:
通过包含 Python 函数的文件持久存储函数
此方法与通过 REST API 持久存储 Python 函数文件相同 (必须在 Python 源文件的作用域中定义score
)。 有关详细信息,请参阅 通过 REST API 创建可部署函数。
当您调用 wml_client.repository.store_function
方法时,请传递文件名作为第一个自变量。
通过函数对象持久存储函数
您可以通过创建具有名为 score
的嵌套函数的 Python 关闭来持久存储 Python 函数对象。 score
函数由作为函数对象存储的外部函数 (调用时) 返回。 此 score
函数必须满足 可部署函数的一般需求中列出的需求。 在这种情况下,必须在外部嵌套函数中添加任何一次性导入和初始设置逻辑,以便在部署期间执行这些导入和设置逻辑并在 score
函数中使用这些导入和设置逻辑。 必须在嵌套的 score
函数中添加 prediction
请求期间所需的任何重现逻辑。
使用 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 函数