应使用 lifespan 异步上下文管理器加载模型配合 CPU 预加载、懒加载标记和首次请求时移至 GPU输入用 Pydantic 校验并转 float32 张量输出必须调用 .tolist() 转为 JSON 可序列化类型。FastAPI 启动后模型加载太慢请求超时怎么办模型在 startup 事件里加载是常见做法但大模型比如 1GB 的 PyTorch model.pth直接在 app FastAPI() 后同步加载会导致 uvicorn 启动卡住、健康检查失败、K8s 探针反复重启 Pod。把模型加载逻辑放进 lifespan 异步上下文管理器而非 app.on_event(startup) —— 后者不支持 await强行 await 会阻塞事件循环使用 torch.load(..., map_locationcpu) 避免 GPU 初始化抢占显存等首次请求再移到 cuda如果需要加一层懒加载标记用 global _model if _model is None: 控制只加载一次避免多 worker 下重复初始化from contextlib import asynccontextmanagerimport torchp_model None/ppasynccontextmanagerasync def lifespan(app: FastAPI):global _model_model torch.load(model.pth, map_locationcpu)yield_model None # 可选退出时清理POST /predict 接收 JSON 但模型要 tensor 输入怎么安全转换用户传 {input: [0.1, 0.5, 0.9]} 很常见但直接 torch.tensor(data[input]) 有风险类型不一致、维度错位、NaN 溢出FastAPI 默认 500 错误不带具体原因。用 Pydantic BaseModel 显式声明输入结构自动校验类型和长度比手动 try/except 更可靠torch.tensor(..., dtypetorch.float32) 必须指定 dtype否则 NumPy 默认 float64 会让模型报 Expected float32加 .to(device) 前先检查 _model.device别硬写 cuda —— 本地调试可能没 GPUclass PredictRequest(BaseModel): input: List[float]papp.post(/predict)def predict(req: PredictRequest):x torch.tensor(req.input, dtypetorch.float32).unsqueeze(0) # 补 batch 维度x x.to(_model.device)y _model(x).item()return {output: y}Uvicorn 多 worker 下模型被重复加载或共享失败用 uvicorn app:app --workers 4 启动时每个子进程都会执行一次 lifespan模型白白加载 4 次若用 multiprocessing 共享模型又容易触发 RuntimeError: cannot pickle module object。 Trenz AI驱动的社交电商营销平台专为TikTok Shop设计