Sagemaker PyTorch端点传入输入数据报utf-8解码错误如何解决
问题根因
你遇到的解码错误来自Sagemaker推理工具包的默认输入处理逻辑:当你指定ContentType为application/json时,服务端会默认尝试将传入的原始字节按UTF-8解码为字符串后再解析JSON。如果你直接传入未做编码转换的图片二进制字节,或者JSON字符串编码后又做了额外的二进制处理,就会出现字节不符合UTF-8编码规则的报错。
方案1:直接传输图片二进制(推荐)
这种方式不需要额外编解码,性能更好。
客户端调用代码示例
# 读取本地图片二进制 with open("test.jpg", "rb") as f: payload = f.read() # 调用时指定Content-Type为对应图片格式 response = predictor.predict( payload, initial_args={'ContentType': 'image/jpeg'} )
服务端适配(predict_sku110k.py)
你需要在入口文件中自定义input_fn方法处理图片输入:
def input_fn(request_body, request_content_type): if request_content_type == 'image/jpeg': # request_body就是图片二进制,直接处理为模型需要的输入格式即可 # 示例:用PIL读取图片 from PIL import Image import io img = Image.open(io.BytesIO(request_body)) # 后续做Resize、转Tensor等预处理 return processed_img # 其他content type的处理逻辑 raise ValueError(f"不支持的Content Type: {request_content_type}")
方案2:图片转Base64后通过JSON传输
如果你需要同时传图片和其他附加参数,可以用这种方式。
客户端调用代码示例
import json import base64 # 读取图片转base64字符串 with open("test.jpg", "rb") as f: img_b64 = base64.b64encode(f.read()).decode("utf-8") # 构造JSON payload payload = json.dumps({ "image": img_b64, # 可以加其他自定义参数 "threshold": 0.5 }) # 调用时用application/json response = predictor.predict( payload, initial_args={'ContentType': 'application/json'} )
服务端适配(predict_sku110k.py)
自定义input_fn处理JSON中的base64图片:
import json import base64 import io from PIL import Image def input_fn(request_body, request_content_type): if request_content_type == 'application/json': input_data = json.loads(request_body) # 解码base64图片 img_bytes = base64.b64decode(input_data["image"]) img = Image.open(io.BytesIO(img_bytes)) # 后续预处理 return processed_img raise ValueError(f"不支持的Content Type: {request_content_type}")
额外注意点
- 不要对已经是字符串类型的JSON payload再调用
encode('utf-8'),Sagemaker的Python SDK会自动完成字符串到字节的编码转换,重复编码会导致服务端接收到的字节流不符合预期。 - 如果没有自定义
input_fn,服务端会走默认的输入处理逻辑,无法直接适配图片输入,必须显式实现该方法。
内容的提问来源于stack exchange,提问作者Fraccalo
相关产品推荐
相关产品推荐

