Python模型部署怎么做_FastAPI封装模型为RESTful接口

酷晨同学_3084

酷晨同学_3084

2026-03-31

929人浏览

原创

应使用 lifespan 异步上下文管理器加载模型,配合 cpu 预加载、懒加载标记和首次请求时移至 gpu;输入用 pydantic 校验并转 float32 张量;输出必须调用 .tolist() 转为 json 可序列化类型。

python模型部署怎么做_fastapi封装模型为restful接口

FastAPI 启动后模型加载太慢,请求超时怎么办

模型在 startup 事件里加载是常见做法,但大模型(比如 1GB+ 的 PyTorch model.pth)直接在 app = FastAPI() 后同步加载,会导致 uvicorn 启动卡住、健康检查失败、K8s 探针反复重启 Pod。

  • 把模型加载逻辑放进 lifespan 异步上下文管理器,而非 @app.on_event("startup") —— 后者不支持 await,强行 await 会阻塞事件循环
  • 使用 torch.load(..., map_location="cpu") 避免 GPU 初始化抢占显存,等首次请求再移到 cuda(如果需要)
  • 加一层懒加载标记:用 global _model + if _model is None: 控制只加载一次,避免多 worker 下重复初始化
from contextlib import asynccontextmanager
import torch
<p>_model = None</p><p>@asynccontextmanager
async def lifespan(app: FastAPI):
global _model
_model = torch.load("model.pth", map_location="cpu")
yield
_model = None  # 可选:退出时清理</p>

POST /predict 接收 JSON 但模型要 tensor 输入,怎么安全转换

用户传 {"input": [0.1, 0.5, 0.9]} 很常见,但直接 torch.tensor(data["input"]) 有风险:类型不一致、维度错位、NaN 溢出,FastAPI 默认 500 错误不带具体原因。

python 查询技能
python 查询技能

查询客流数据,输出JSON格式,可直接导入Bitable等可视化工具

下载
  • 用 Pydantic BaseModel 显式声明输入结构,自动校验类型和长度,比手动 try/except 更可靠
  • torch.tensor(..., dtype=torch.float32) 必须指定 dtype,否则 NumPy 默认 float64 会让模型报 Expected float32
  • 加 .to(device) 前先检查 _model.device,别硬写 "cuda" —— 本地调试可能没 GPU
class PredictRequest(BaseModel):
    input: List[float]
<p>@app.post("/predict")
def predict(req: PredictRequest):
x = torch.tensor(req.input, dtype=torch.float32).unsqueeze(0)  # 补 batch 维度
x = x.to(_model.device)
y = _model(x).item()
return {"output": y}</p>

Uvicorn 多 worker 下模型被重复加载或共享失败

用 uvicorn app:app --workers 4 启动时,每个子进程都会执行一次 lifespan,模型白白加载 4 次;若用 multiprocessing 共享模型,又容易触发 RuntimeError: cannot pickle 'module' object。

  • 不要依赖 fork 共享模型 —— PyTorch 模型含不可序列化对象(如 CUDA 上下文),fork 后子进程调用会崩
  • 改用 --workers 1 --reload 开发,生产环境用 --workers N + 单进程内模型懒加载(见第一个副标题的 global _model 方案)
  • 更稳的做法:启动前预加载模型到内存,用 spawn 启动 worker(需额外封装),但多数场景没必要,1 个 worker + GIL 并发够用

模型输出要返回概率、置信度、类别名,但 FastAPI 默认只序列化 dict 和基本类型

直接 return {"probs": model_output.softmax(1)} 会报 TypeError: Object of type Tensor is not JSON serializable,这是最常卡住新手的地方。

  • 必须显式转成 Python 基本类型:.tolist() 是最安全的选择,.numpy().tolist() 多余且慢
  • 别用 json.dumps 手动序列化再 Response —— FastAPI 已内置 JSON 响应,手动做反而绕过校验和 content-type 设置
  • 如果要返回类别名,提前把 idx_to_class = {0: "cat", 1: "dog"} 定义为模块级变量,别每次请求都重建
y_probs = torch.nn.functional.softmax(_model(x), dim=1)[0]
return {
    "class_id": int(y_probs.argmax().item()),
    "confidence": float(y_probs.max().item()),
    "probabilities": y_probs.tolist()  # ← 关键:必须 .tolist()
}

模型热更新、跨进程通信、GPU 显存隔离这些事,得先确保单实例跑稳了再说。很多问题其实不是 FastAPI 不行,而是把模型当普通函数用了——它真不是。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1731

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4384

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25597

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3127

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3127

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2443

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程