Python后端怎么用FastAPI部署PyTorch分类服务_并发推断与多进程请求批处理

夏磊小哥_9707

夏磊小哥_9707

2026-04-20

277人浏览

原创

应使用单 worker 启动:uvicorn main:app --workers 1 --loop uvloop --http httptools,并配合异步批处理与 cuda_visible_devices 绑定,避免 fork 导致的 cuda 上下文崩溃和显存虚高。

python后端怎么用fastapi部署pytorch分类服务_并发推断与多进程请求批处理

FastAPI 启动时如何避免 PyTorch 多进程加载模型崩溃

直接在 main.py 顶层 import 模型或调用 torch.load(),会导致每个 uvicorn worker 进程重复加载模型、抢占显存,甚至触发 OSError: [Errno 12] Cannot allocate memory。根本原因是 PyTorch 的 CUDA 上下文不支持 fork —— 而 uvicorn 默认用 fork 方式启动多进程(--workers N)。

正确做法是:延迟加载模型,且确保只在主进程初始化后、worker 进程首次请求时加载一次。推荐用单例 + threading.Lock 控制初始化时机:

from threading import Lock
_model = None
_model_lock = Lock()
<p>def get_model():
global _model
if _model is None:
with _model_lock:
if _model is None:
_model = torch.jit.load("model.pt").eval()
_model.to("cuda" if torch.cuda.is_available() else "cpu")
return _model
</p>

注意:torch.jit.load 比 torch.load 更适合部署,它跳过 Python 解释器依赖,序列化后更稳定;若必须用 torch.load,请确保保存时用了 torch.save(model, ..., _use_new_zipfile_serialization=True) 并禁用 pickle。

怎么让多个并发请求自动聚合成 batch 推理(而不是逐条 infer)

FastAPI 默认每请求一个协程,PyTorch 单次 forward 处理单样本效率极低。你不能靠 client 端拼 batch —— 实际业务中请求来源不可控。得在服务端做「请求缓冲」+「异步批处理」。

核心思路:用 asyncio.Queue 缓冲短时间内的请求,由后台 task 统一拉取、pad/stack、推理、分发结果。关键参数要调好:

  • max_wait_ms=50:最长等 50ms,避免小流量下无限等待
  • max_batch_size=32:GPU 显存能扛住的最大 batch,超了立刻触发推理
  • 所有请求必须带 id 字段,用于结果回填,否则无法区分响应归属

示例结构(省略完整队列管理代码):

async def batch_processor():
    while True:
        batch = []
        start = time.time()
        while len(batch) <h3>uvicorn 启动时该用 --workers 还是 --loop uvloop --http httptools</h3><p>结论:别用 <code>--workers</code> 启 PyTorch 服务。它强制 fork,CUDA 初始化失败率高;即使加 <code>--preload</code>,各 worker 的 CUDA context 仍相互隔离,<code>torch.cuda.memory_allocated()</code> 会虚高,OOM 风险翻倍。</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill7657" title="python 查询技能"><img
														src="https://img.php.cn/upload/skill/000/000/081/179161384046229.jpg" alt="python 查询技能" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/skill7657" title="python 查询技能" class="overflowclass">python 查询技能</a>
													<p class="overflowclass">查询客流数据,输出JSON格式,可直接导入Bitable等可视化工具</p>
												</div>
												<a rel="nofollow" href="/xiazai/skill7657" title="python 查询技能" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div><p>正确姿势是:单 worker + 异步批处理 + GPU 绑定:</p>
  • 启动命令用:uvicorn main:app --host 0.0.0.0 --port 8000 --loop uvloop --http httptools --workers 1
  • 确保 CUDA_VISIBLE_DEVICES=0 提前设置,避免多卡干扰
  • 如果 CPU 密集(如图像 decode),可额外开 1–2 个 concurrent.futures.ProcessPoolExecutor 做预处理,但 inference 必须留在主线程/GPU 线程

实测:在 A10G 上,单 worker + 批处理比 4 workers + 单样本快 3.2 倍,显存占用降 60%。

客户端并发压测时出现 ConnectionResetError 或 timeout 怎么定位

这不是 FastAPI 或 PyTorch 的错,大概率是中间层(nginx / ALB / client SDK)默认超时太短,或未配置 keepalive。典型现象:ConnectionResetError: [Errno 104] Connection reset by peer 出现在 client,但 server 日志无报错。

排查顺序:

  • 先关掉所有代理,curl -v http://localhost:8000/predict 直连验证基础通路
  • 检查 uvicorn 日志里是否有 connection closed 或 client disconnected —— 有则说明 client 主动断了
  • 确认 client 是否复用 session:Python requests 要显式用 Session(),HTTP/1.1 默认不 keepalive
  • 若走 nginx,必须加:proxy_http_version 1.1; proxy_set_header Connection '';,否则它会把长连接转成短连接

批处理服务的响应时间波动大(比如 10ms~500ms),对 timeout 敏感。建议 client 设置 timeout=(3.0, 30.0)(connect + read),而非固定 5s。

真正难调的是 batch 边界和 GPU 利用率之间的平衡——等太久,延迟高;等太急,GPU 利用率低。这个阈值没有银弹,得按你的 QPS 和显卡型号实测。

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

相关文章

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

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

下载

相关标签:

python pytorch

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

相关专题

更多
python是前端还是后端
python是前端还是后端

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

2023.08.11

2403

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6230

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5606

10

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

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

2023.07.20

1711

4

python能做什么
python能做什么

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

2023.07.25

4324

7

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

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

2023.07.31

1689

3

python教程
python教程

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

2023.08.03

25177

23

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

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

2023.08.04

3067

5

python eval
python eval

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

2023.08.04

3087

5

热门下载

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

精品课程

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