我正在尝试在Sagemaker实例上的MXNet上制作转移学习方法。训练和服务在本地开始没有任何问题,我正在使用该python代码来预测:
def predict_mx(net,fname): …
您对从笔记本传递到预测环境(在docker中)的数据进行反序列化存在问题,但鉴于提供的代码,我无法重现此问题。使用MXNet估算器时(例如 from sagemaker.mxnet import MXNet ),你可以实现 transform_fn 在入口点脚本中反序列化数据并使用模型进行预测。使用 json.loads 在函数的开头,如下例所示;
from sagemaker.mxnet import MXNet
transform_fn
json.loads
def transform_fn(net, data, input_content_type, output_content_type): """ Transform a request using the Gluon model. Called once per request. :param net: The Gluon model. :param data: The request payload. :param input_content_type: The request content type. :param output_content_type: The (desired) response content type. :return: response payload and content type. """ # we can use content types to vary input/output handling, but # here we just assume json for both parsed = json.loads(data) nda = mx.nd.array(parsed) output = net(nda) prediction = mx.nd.argmax(output, axis=1) response_body = json.dumps(prediction.asnumpy().tolist()[0]) return response_body, output_content_type
你应该检查的价值 data 如果你还有问题 json.loads 命令,仔细查看与编码相关的问题(即以字符串开头的字符串) \ 这是无效的)。
data
\
注意:您在函数和堆栈跟踪中也有不同的代码,因此您可能需要确认自己正在运行您认为正在运行的内容。并且您提到您尚未部署(本地或实例),但这是预测所必需的。
打电话给 的 net.predict 强> 工作正常。
您似乎正在使用SageMaker Python SDK 的 predict_fn 强> 用于托管。之后 的 predict_fn 强> 如果调用,MXNet容器将尝试将您的预测序列化为JSON,然后再将其发送回客户端。您可以在此处看到执行此操作的代码: https://github.com/aws/sagemaker-mxnet-container/blob/master/src/mxnet_container/serve/transformer.py#L132
容器无法序列化,因为 的 net.predict 强> 不返回可序列化的对象。您可以通过返回列表来解决此问题:
return net.predict(data.asnumpy().tolist()).asnumpy().tolist()
另一种选择是使用a 的 transform_fn 强> 代替 的 prediction_fn 强> 所以你可以自己处理输出序列化。你可以看到一个例子 的 transform_fn 强> 这里 https://github.com/aws/sagemaker-python-sdk/blob/e93eff66626c0ab1f292048451c4c3ac7c39a121/examples/cli/host/script.py#L41