加载和提供机器学习模型
启动时加载 joblib/keras 模型、线程安全的推理,以及批量预测端点。
加载和提供机器学习模型 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
加载问题
从磁盘加载模型很慢。如果每个请求都重新加载模型,延迟会急剧上升。解决方法是:在启动时只加载一次模型,并让所有请求重复使用它。
启动事件
@app.on_event("startup") 钩子会在服务器启动时运行一次,非常适合在任何请求到达前加载模型。
from fastapi import FastAPI
import joblib
app = FastAPI()
@app.on_event("startup")
def load_model():
app.state.model = joblib.load("model.joblib")使用 app.state 进行线程安全存储
app.state 是存放模型等共享对象的推荐位置。对象在启动时存储一次,并且只在请求期间读取,从而避免可变模块级全局变量带来的问题。
from fastapi import Request
@app.post("/predict")
def predict(req: PredictRequest, request: Request):
model = request.app.state.model
return {"prediction": model.predict([req.features])[0]}为什么不使用全局变量?
直接使用模块级全局变量虽然可行,但会将加载操作与导入时机耦合起来,也更难测试或替换。app.state 将对象的生命周期与应用绑定起来,更清晰,也是 FastAPI 推荐的模式。
现代 lifespan 方法
新版 FastAPI 使用 lifespan 上下文管理器取代 on_event,在同一个位置处理启动和关闭。
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app):
app.state.model = joblib.load("model.joblib") # startup
yield
app.state.model = None # shutdown
app = FastAPI(lifespan=lifespan)模型预热
第一次预测通常较慢,因为框架会在首次调用时延迟初始化。请在启动时使用一次虚拟预测来预热模型,这样第一个真实用户请求就能快速完成。
@app.on_event("startup")
def load_and_warm():
app.state.model = joblib.load("model.joblib")
app.state.model.predict([[0.0, 0.0, 0.0, 0.0]]) # warm-up为什么预热很重要
没有预热时,部署后的第一个请求可能会慢许多倍,损害尾部延迟,甚至导致健康检查失败。在启动时执行一次虚拟推理,就能将这项开销移出关键路径。
批量预测端点
一次调用预测多行数据,比多次单独调用高效得多,因为模型可以对批次进行向量化处理。请接收特征向量列表,并返回预测结果列表。
class BatchRequest(BaseModel):
items: list[list[float]]
@app.post("/predict/batch")
def predict_batch(req: BatchRequest, request: Request):
model = request.app.state.model
preds = model.predict(req.items)
return {"predictions": preds.tolist()}单条与批量
- 单条:每次调用只处理一个输入,单次延迟最低,客户端也更简单。
- 批量:一次处理多个输入,吞吐量高得多,适合离线评分。
同时提供两种方式,就能覆盖实时和批量处理场景。
在端点中读取状态
每个端点都通过 request.app.state.model 读取共享模型,绝不重复加载,因此所有请求共享同一个内存实例。
整合起来
生产就绪的设置方式是:在 lifespan/启动阶段加载并预热模型,将其存储在 app.state 中,并提供从状态中读取模型的单条和批量预测端点。这样可以最大限度降低延迟并提高吞吐量。
快速检查
请检验您对模型服务的掌握情况。
回顾
您已经通过 启动阶段/lifespan 只加载一次模型,将其存储在 app.state 中以便线程安全地重复使用,添加了一个预热虚拟预测,并提供了用于提高吞吐量的批量端点。下一步:将 API 容器化。
常见问题解答
「加载和提供机器学习模型」课时是免费的吗?
是的 — 「加载和提供机器学习模型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「加载和提供机器学习模型」这节课中我会学到什么?
启动时加载 joblib/keras 模型、线程安全的推理,以及批量预测端点。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「加载和提供机器学习模型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。