Amazon Sagemaker:推理端点中的用户输入数据验证
Amazon Sagemaker: User Input data validation in Inference Endpoint
我已经使用 Tensorflow 模型成功构建了一个 Sagemaker 端点。预处理和 post 处理在“inference.py”内部完成,它根据本教程调用处理函数:https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/using_tf.html#how-to-implement-the-pre-and-or-post-processing-handler-s
我的问题是:
- 哪种方法适合验证 inference.py 内的用户输入数据?
- 如果此类验证测试失败(例如,错误的数据类型或数据不在允许范围内等),如何才能return向用户提供带有状态代码的适当错误消息?
- 这与端点上方的 API 网关如何兼容?
这是 inference.py 的结构,其中包含所需的验证检查作为注释:
import json
import requests
def handler(data, context):
"""Handle request.
Args:
data (obj): the request data
context (Context): an object containing request and configuration details
Returns:
(bytes, string): data to return to client, (optional) response content type
"""
processed_input = _process_input(data, context)
response = requests.post(context.rest_uri, data=processed_input)
return _process_output(response, context)
def _process_input(data, context):
if context.request_content_type == 'application/json':
# pass through json (assumes it's correctly formed)
d = data.read().decode('utf-8')
data_dict = json.loads(data)
# -----> if data_dict['input_1'] > 25000:
# -----> return some error specific message with status code 123
return some_preprocessing_function(data_dict)
raise ValueError('{{"error": "unsupported content type {}"}}'.format(
context.request_content_type or "unknown"))
def _process_output(data, context):
if data.status_code != 200:
raise ValueError(data.content.decode('utf-8'))
response_content_type = context.accept_header
prediction = data.content
return prediction, response_content_type
我将在下面在线回答您的问题:
- 哪种方法适合验证 inference.py 内的用户输入数据?
看到你有一个handler
函数,input_handler
和output_handler
被忽略了。因此,在您的 handler
函数中(正如您所做的那样),您可以拥有验证逻辑。
- 如果此类验证测试失败(例如,错误的数据类型或数据不在允许范围内等),如何才能 return 向用户提供带有状态代码的适当错误消息?
我喜欢将我的 SageMaker 端点视为 Web 服务器。因此,您可以 return 任何有效的 HTTP 响应代码和响应消息。请参阅我找到的这个示例 inference.py 文件作为参考。
_return_error(
415, 'Unsupported content type "{}"'.format(context.request_content_type or "Unknown")
)
def _return_error(code, message):
raise ValueError("Error: {}, {}".format(str(code), message))
- 这与端点上方的 API 网关如何兼容?
有关使用 Amazon API 网关映射模板和 Amazon SageMaker 创建机器 learning-powered REST API 的详细信息,请参阅此 link。
我已经使用 Tensorflow 模型成功构建了一个 Sagemaker 端点。预处理和 post 处理在“inference.py”内部完成,它根据本教程调用处理函数:https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/using_tf.html#how-to-implement-the-pre-and-or-post-processing-handler-s
我的问题是:
- 哪种方法适合验证 inference.py 内的用户输入数据?
- 如果此类验证测试失败(例如,错误的数据类型或数据不在允许范围内等),如何才能return向用户提供带有状态代码的适当错误消息?
- 这与端点上方的 API 网关如何兼容?
这是 inference.py 的结构,其中包含所需的验证检查作为注释:
import json
import requests
def handler(data, context):
"""Handle request.
Args:
data (obj): the request data
context (Context): an object containing request and configuration details
Returns:
(bytes, string): data to return to client, (optional) response content type
"""
processed_input = _process_input(data, context)
response = requests.post(context.rest_uri, data=processed_input)
return _process_output(response, context)
def _process_input(data, context):
if context.request_content_type == 'application/json':
# pass through json (assumes it's correctly formed)
d = data.read().decode('utf-8')
data_dict = json.loads(data)
# -----> if data_dict['input_1'] > 25000:
# -----> return some error specific message with status code 123
return some_preprocessing_function(data_dict)
raise ValueError('{{"error": "unsupported content type {}"}}'.format(
context.request_content_type or "unknown"))
def _process_output(data, context):
if data.status_code != 200:
raise ValueError(data.content.decode('utf-8'))
response_content_type = context.accept_header
prediction = data.content
return prediction, response_content_type
我将在下面在线回答您的问题:
- 哪种方法适合验证 inference.py 内的用户输入数据?
看到你有一个handler
函数,input_handler
和output_handler
被忽略了。因此,在您的 handler
函数中(正如您所做的那样),您可以拥有验证逻辑。
- 如果此类验证测试失败(例如,错误的数据类型或数据不在允许范围内等),如何才能 return 向用户提供带有状态代码的适当错误消息?
我喜欢将我的 SageMaker 端点视为 Web 服务器。因此,您可以 return 任何有效的 HTTP 响应代码和响应消息。请参阅我找到的这个示例 inference.py 文件作为参考。
_return_error(
415, 'Unsupported content type "{}"'.format(context.request_content_type or "Unknown")
)
def _return_error(code, message):
raise ValueError("Error: {}, {}".format(str(code), message))
- 这与端点上方的 API 网关如何兼容?
有关使用 Amazon API 网关映射模板和 Amazon SageMaker 创建机器 learning-powered REST API 的详细信息,请参阅此 link。