fastapi应用启动时应通过lifespan事件一次性加载模型并挂载到app.state,避免每次请求重载;pydantic v2中用field和@field_validator处理字段校验与预处理。

FastAPI启动服务时模型加载太慢,怎么避免每次请求都重载?
模型加载耗时不能摊到每个请求上,必须在应用启动时完成。FastAPI的on_event("startup")已弃用,改用Lifespan或lifespan参数(v0.100+)。推荐用async def lifespan(app: FastAPI)上下文管理方式,在yield前加载模型。
- 把模型对象(如
model、tokenizer)挂到app.state上,后续路由函数通过request.app.state.model访问 - 别在
Depends里加载模型——它会在每次依赖注入时执行,不是单例 - CPU加载大模型(如BERT-base)通常要2–5秒,放
lifespan里只执行一次,否则首请求可能超时 - 如果用
torch.load(..., map_location="cpu")但实际部署在GPU环境,记得改成map_location="cuda"并检查torch.cuda.is_available()
Pydantic v2中定义输入Schema,怎么处理可选字段和默认预处理逻辑?
别用Optional[str]配= None这种v1写法,v2统一用Field(default=None)或Field(default_factory=list)。对NLP任务常见需求:文本字段需去空格、限制长度、禁止纯空白;数值字段要设范围。
inference.sh 的 Python SDK:运行 AI 应用、构建智能体,并集成 150 多个模型。包名:inferencesh (pip install inferencesh)。支持同步/异步……
- 用
str.strip()逻辑不能写在Field里,得靠@field_validator装饰器,例如:@field_validator("text") def clean_text(cls, v): return v.strip() if isinstance(v, str) else v - 限制最大长度用
min_length/max_length参数,但注意:它们只校验字符串长度,不等价于截断;真要截断得在validator里手动v[:512] - 数值类字段(如
top_k: int = Field(ge=1, le=10))比if not 1 更可靠,错误信息也更规范 - 避免在Schema里做重计算(比如调用
tokenizer.encode()),校验层只负责“合不合理”,编码留到路由函数里
POST接口返回JSON时,Tensor/ndarray无法直接序列化,怎么安全转成list?
Pydantic v2默认不支持torch.Tensor或np.ndarray,直接return {"logits": model_output}会报TypeError: Object of type Tensor is not JSON serializable。
- 最简方案:在路由函数里用
.tolist()(PyTorch)或.numpy().tolist()(TensorFlow/Keras),但注意高维张量转list可能极慢且内存暴涨 - 更稳做法:用
jsonable_encoder(FastAPI内置),它能自动处理np.float32、np.int64等,但对torch.Tensor仍需先.detach().cpu().numpy() - 别用
json.dumps(..., default=str)兜底——它会把tensor变成"tensor([0.123...])"这种字符串,前端没法解析 - 如果返回结构复杂(如带嵌套dict+array),定义一个Pydantic
BaseModel响应Schema,用response_model参数声明,FastAPI会自动调用.model_dump()并处理类型转换
部署后发现CPU占用100%或OOM,是不是没关梯度和设eval模式?
训练完的模型若直接model(input)推理,PyTorch默认开启梯度追踪,不仅慢,还累积计算图导致显存/内存泄漏。
- 必须加
model.eval(),否则BatchNorm/Dropout行为异常,预测结果不稳定 - 必须包在
with torch.no_grad():块里,这是硬性要求,不是可选项 - 如果用Hugging Face
pipeline,它内部已封装了这些,但自定义model.forward()时极易遗漏 - Linux下用
ps aux --sort=-%cpu | head -5确认是否是Python进程占满CPU;用nvidia-smi看GPU显存是否持续增长——那是梯度没关的典型迹象
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










