首页 > 解决方案 > 如何正确编写返回 numpy 数组的 sagemaker tensorflow input_handler()?

问题描述

我正在尝试在 inference.py 中为 sagemaker 推理容器实现 input_handler()。

图像/阵列非常大(3D)。所以我想传入一个 S3 URI,然后 input_handler() 函数应该从 s3 加载图像/数组并返回模型的实际 numpy 数组(它需要一个张量):

def input_handler(data, context):

    d = data.read().decode('utf-8')

    body = json.loads(d)
    s3path = body['s3_path']

    s3 = S3FileSystem()
    df = np.load(s3.open(s3path))

    return df

返回 numpy 数组适用于 Sagemaker python api 版本 < 1.0 和 input_fn(),但不适用于 sagemaker python api > 2.0 使用的需要 input_handler() 的新容器。

实际的容器镜像是“763104351884.dkr.ecr.eu-central-1.amazonaws.com/tensorflow-inference:1.15-gpu”。

在推理期间,我在容器引发的 CloudWatch 中收到以下错误:

ERROR:python_service:exception handling request: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(

Traceback (most recent call last):
  File "/sagemaker/python_service.py", line 289, in _handle_invocation_post
    res.body, res.content_type = self._handlers(data, context)
  File "/sagemaker/python_service.py", line 322, in handler
    response = requests.post(context.rest_uri, data=processed_input)
  File "/usr/local/lib/python3.6/dist-packages/requests/api.py", line 116, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/requests/sessions.py", line 512, in request
    data=data or 
{}
,

什么是正确的返回类型?我发现的所有示例都是针对 json 和 text ...

标签: pythonamazon-web-servicestensorflowamazon-sagemaker

解决方案


这似乎有效:

return json.dumps({"inputs": df.tolist() }).


推荐阅读