python - 如何正确编写返回 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 ...
解决方案
这似乎有效:
return json.dumps({"inputs": df.tolist() }).
推荐阅读
- python - 使用 BeautifulSoup 从 python 导出到 .csv
- android - @InstallIn 只能用于 @Module 或 @EntryPoint 类
- python - Pygame 让立方体从屏幕的顶部缓慢移动到底部
- java - POST API 从改造返回空值,但在邮递员中工作
- python - 我不小心弄乱了我的 python 情节并且现在无法修复它,但是它在 30 分钟前工作了
- reactjs - 使用 React 无法在移动设备上播放视频
- java - 即使代码看起来不错,Spring 验证也不起作用
- r - 找到理想的集群
- c++ - 如何遍历数组以查找 C 风格的字符串
- javascript - 在模态、警报或仅具有关闭 x 的弹出框中显示来自 html 搜索框的 mysql 查询结果