0 / 0
Go back to the English version of the documentation
编写可部署的 Python 函数
Last updated: 2024年12月05日
编写可部署的 Python 函数

学习如何编写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 函数

Generative AI search and answer
These answers are generated by a large language model in watsonx.ai based on content from the product documentation. Learn more