范叶亮写智能体、模型和数据系统时,习惯先把定义和边界钉死。把「利用 Flask 和 Google App Engine 部署模型服务」整理成可落地的中文笔记:问题在哪、默认做法会踩什么坑、该怎么选。原站导航和广告已去掉。
模型部署和服务调用
对于做算法的同学,大家或多或少的更关心模型的性能指标多些,对于一些工程性问题考虑的较少。模型的部署是这些工程性问题中重要的一个,它直接关系到模型在生产系统的使用。一些成熟的机器学习框架会提供自己的解决方案,例如 Tensorflow 提供的 Serving 服务等。但很多情况下我们构建的工程可能不只使用了一种框架,因此一个框架自身的部署工具可能就很难满足我们的需求了。
针对此类情况,本文介绍一个 简单 的 准生产 模型部署方案。简单是指除了模型相关代码之外的工程性代码量不大,这得益于将要使用的 Flask 框架。准生产是指这种部署方案应对一般的生产环境问题不大,对于高并发的场景可以通过横向扩容并进行负载均衡解决,但对于单次调用时效性要求较高的场景则需要另寻其他解决方案。
Flask 服务和 AJAX 调用
为了将模型代码和 Flask 服务进行整合,首先假设你已经对模型部分代码做了完美的封装 😎,整个工程先叫做 model-serving-demo 吧。整理一下代码的目录结构,给一个我中意的 Python 目录结构风格:
model-serving-demo/ # 工程根目录 ├── bin/ # 可执行命令目录 | ├─ start.sh # 启动脚本 | ├─ stop.sh # 停止脚本 | └─ … ├── conf/ # 配置文件目录 | ├─ logging.conf # 日志配置文件 | ├─ xxx_model.conf # XXX Model 配置文件 | └─ … ├── data/ # 数据文件目录 ├── docs/ # 文档目录 ├── model_serving/ # 模块根目录 | ├─ models/ # 模型代码目录 | | ├─ __init__.py | | ├─ xxx_model.py # XXX Model 代码 | | └─ … | ├─ resources/ # Flask RESTful Resources 代码目录 | | ├─ __init__.py | | ├─ xxx_model_resource.py # XXX Model Flask RESTful
Flask 服务封装
Flask==1.0.2 Flask-RESTful==0.3.6 Flask-Cors==3.0.6 jsonschema==2.6.0 docopt==0.6.2 # 本地部署时需保留,GAE 部署时请删除 # gunicorn==19.9.0 其中:
from ..utils.log_utils import XXXModel_LOGGER LOGGER = XXXModel_LOGGER class XXXModel (): def __init__ ( self ): LOGGER . info ( 'Initializing XXX Model …' ) LOGGER . info ( 'XXX Model Initialized.' ) def hello ( self , name : str ) -> str : return 'Hello, {name} !' . format ( name = name ) 其中 hello() 为服务使用的方法,其接受一个类型为 str 的参数 name ,并返回一个类型为 str 的结果。
RESTful API 设计
XXX Model 的 Flask RESTful Resource 代码 xxx_model_resource.py 如下:
from flask_restful import Resource , request from ..models.xxx_model import XXXModel from ..utils.validation_utils import validate_json xxx_model_instance = XXXModel () xxx_model_schema = { 'type' : 'object' , 'properties' : { 'name' : { 'type' : 'string' } }, 'required' : [ 'name' ] } class XXXModelResource ( Resource ): @validate_json ( xxx_model_schema ) def post ( self ): json = request . json return { 'result' : xxx_model_instance . hello ( json [ 'na
AJAX 调用
post() 方法用于处理整个模型的服务请求, xxx_model_instance 模型实例在类 XXXModelResource 外部进行实例化,避免每次处理请求时都进行初始化。 post() 的返回结果无需处理成 JSON 格式的字符串,仅需返回词典数据即可,Flask RESTful 会自动对其进行转换。
为了方便对请求数据的 JSON 格式进行校验,我们将对 JSON 格式的校验封装成一个修饰器。使用时如上文代码中所示,在 post() 方法上方添加 @validate_json(xxx_model_schema) 即可,其中 xxx_model_schema 为一个符合 jsonschema 要求的 JSON Schema。示例代码中要求传入的 JSON 数据 必须 包含一个名为 name 类型为 string 的字段。
Google App Engine 部署
from functools import wraps from jsonschema import validate , ValidationError from flask_restful import request def validate_json ( schema , force = False ): def decorator ( f ): @wraps ( f ) def wrapper ( * args , ** kwargs ): json_body = request . get_json ( force = force ) if json_body is None : return { 'message' : 'No JSON object' }, 400 try : validate ( json_body , schema ) except ValidationError as e : return { 'message' : e . message }, 400 return
构建完 XXX Model 的 Flask RESTful Resource 后,我们就可以构建 Flask 的主服务了,主程序代码 main.py 如下:
值得单独记下的点
- 利用 Gunicorn 提供的高性能 Python WSGI HTTP UNIX Server,方便在服务端运行 Flask 应用。
- 客户端和服务端之间采用 RESTful API 调用方式,尽管在性能上可能不及其他一些方案 (例如:基于 RPC 的解决方案等),但其较好地解决了跨语言交互的问题,不同语言之间交互仅需使用 HTTP 协议和 JSON 数据格式即可。
- Flask-RESTful 用于构建 Flask RESTful API。
- Flask-Cors 用于解决 AJAX 调用时的 跨域问题 。
- jsonschema 用于对请求数据的 JSON 格式进行校验。
- docopt 用于从代码文档自动生成命令行参数解析器。
- gunicorn 用于提供的高性能 Python WSGI HTTP UNIX Server。
- 构建 Flask 主程序, app = Flask(__name__) 。
落地时建议先做的 5 件事
- 先写清任务能不能被自动验证:能验证的交给系统和评测,不能验证的留给人审。
- 本地部署先算显存、延迟和失败回滚,不要只看能跑通一次。
- 多智能体只在单智能体触到上下文或专业边界时再拆。
- Token、微调和压缩都要有对照数字,避免口号式优化。
- 结论写成可检查清单:接口、超时、评测集、回滚版本。
和智能体产品怎么接
龙虾PRO做 OpenClaw 落地时,最该拿走的是「单智能体先做好工具和提示,再谈编排」。数字员工、技能市场和网关应共用同一套评测与权限,而不是各写一套角色人设。
本文侧重全链路风控方法论。落地时请用自身业务单据做回放验证,不要把示例阈值直接当生产策略。 相关:风控体检 · 方案资源
常见问题 FAQ
什么是AI智能系统?
「AI智能系统」可概括为:对于做算法的同学,大家或多或少的更关心模型的性能指标多些,对于一些工程性问题考虑的较少。模型的部署是这些工程性问题中重要的一个,它直接关系到模型在生产系统的使用。一些成熟的机器学习框架会提供自己的解决方案,例如 Tensorflow 提供的 Serving 服务等。但很多情况下我们构建的工程可能不只使用了一种框架,因此一个框架自身的部署工具可能就很难满足我们 本文从定义、方法与实践要点展开说明。
为什么要关注AI智能系统?
关注AI智能系统,是因为它直接影响效率、风险与可复制性。文中指出:对于做算法的同学,大家或多或少的更关心模型的性能指标多些,对于一些工程性问题考虑的较少。模型的部署是这些工程性问题中重要的一个,它直接关系到模型在生产系统的使用。一些成熟的机器学习框架会提供自己的解决方案,例如 Tensorflow 提供的 Serving 服务等。但很多情况下我们构建的工程可能不只使用了一种框架,因此一个框架自身的部署工具可能就很难满足我们的需求了。
如何落地AI智能系统?有哪些关键步骤?
建议按以下路径推进AI智能系统:1) 利用 Gunicorn 提供的高性能 Python WSGI HTTP UNIX Server,方便在服务端运行 Flask 应用。;2) 客户端和服务端之间采用 RESTful API 调用方式,尽管在性能上可能不及其他一些方案 (例如:基于 RPC 的解决方案等),但其较好地解决了跨语言交互的…;3) Flask-RESTful 用于构建 Flask RESTful API。;4) Flask-Cors 用于解决 AJAX 调用时的 跨域问题 。;5) jsonschema 用于对请求数据的 JSON 格式进行校验。。细节见正文对应章节。
AI智能系统适合哪些人或团队?
AI智能系统更适合:产品/技术负责人、运营与增长团队、需要落地智能体或自动化的中小团队、关注「AI智能系统」方向的读者。若你只需要单次聊天式问答,可先读概念;若要上生产,请重点看步骤、权限与风控相关段落。
关于「模型部署和服务调用」,本文给出了什么结论?
在「模型部署和服务调用」部分,要点是:部署工具可能就很难满足我们的需求了。 针对此类情况,本文介绍一个 简单 的 准生产 模型部署方案。简单是指除了模型相关代码之外的工程性代码量不大,这得益于将要使用的 Flask 框架。准生产是指这种部署方案应对一般的生产环境问题不大,对于高并发的场景可以通过横向扩容并进行负载均衡解决,但对于单次调用时效性要求较高的场景则需要另寻其他解决方案。 Flask 服务和 AJAX 调用 为了将模型代码和 Flask 服务进行整合,首先假设你已经
关于「Flask 服务和 AJAX 调用」,本文给出了什么结论?
在「Flask 服务和 AJAX 调用」部分,要点是:): def __init__ ( self ): LOGGER . info ( 'Initializing XXX Model …' ) LOGGER . info ( 'XXX Model Initialized.' ) def hello ( self , name : str ) -> str : return 'Hello, {name} !' . format ( name = name ) 其中 hello() 为服