Amazon SageMaker自定义推理接口支持多请求格式的最佳实践咨询
最佳实践方案
推荐直接在现有/invocations接口下扩展内容类型判断分支即可,不需要新建独立接口,这是SageMaker自定义推理容器的标准实现规范,理由如下:
- SageMaker托管端点默认会将所有推理请求统一路由到
/invocations路径,自定义新接口无法直接复用SageMaker原生的调用鉴权、流量控制、监控告警、自动扩缩容等能力,额外适配成本很高 - 基于内容类型做分支判断完全符合HTTP接口的设计规范,逻辑清晰易维护
具体实现方式
你可以直接在原有text/csv的判断后新增对应内容类型的处理分支即可,常见请求格式对应的处理逻辑示例如下:
if flask.request.content_type == "text/csv": # 原有CSV格式处理逻辑,无需修改 data = flask.request.data.decode("utf-8") # 原有后续解析、推理逻辑 # 新增纯文本字符串请求支持 elif flask.request.content_type == "text/plain": # 读取POST传入的字符串内容 input_str = flask.request.data.decode("utf-8").strip() # 转换为模型接收的输入格式即可 model_input = [input_str] # 新增表单格式单个参数请求支持 elif flask.request.content_type == "application/x-www-form-urlencoded": # 按参数名读取传入的单个参数 input_param = flask.request.form.get("your_param_key") # 转换为模型接收的输入格式即可 model_input = [input_param] # 可按需继续新增其他格式支持,比如JSON等 # elif flask.request.content_type == "application/json": # input_json = flask.request.get_json() # ... else: # 不支持的格式返回415错误,符合HTTP规范 return flask.Response( response=f"Unsupported content type: {flask.request.content_type}", status=415, mimetype="text/plain" )
优化建议
如果后续需要支持的请求格式比较多,可以把不同格式的解析逻辑抽成独立的函数,避免单接口代码过于臃肿,后续迭代维护更方便。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

