讲师中心 微信公众号
AI工具推荐 视频效率加速

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

夏磊小哥_9707

夏磊小哥_9707

发布时间:2026-04-20 21:04:12

|

277人浏览过

|

来源于php中文网

原创

应使用单 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

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

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

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

立即学习“Python免费学习笔记(深入)”;

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

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

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

temporal-python-testing
temporal-python-testing

使用 pytest、时间跳转和模拟策略测试 Temporal 工作流。涵盖单元测试、集成测试、回放测试以及本地开发服务器。

下载
async def batch_processor():
    while True:
        batch = []
        start = time.time()
        while len(batch) < MAX_BATCH_SIZE and (time.time() - start) < 0.05:
            try:
                req = await request_queue.get()
                batch.append(req)
            except asyncio.QueueEmpty:
                break
        if batch:
            tensors = torch.stack([prep(x.image) for x in batch]).to(device)
            with torch.no_grad():
                outs = model(tensors)
            for req, out in zip(batch, outs.cpu().tolist()):
                await req.response_channel.send({"id": req.id, "score": out})

uvicorn 启动时该用 --workers 还是 --loop uvloop --http httptools

结论:别用 --workers 启 PyTorch 服务。它强制 fork,CUDA 初始化失败率高;即使加 --preload,各 worker 的 CUDA context 仍相互隔离,torch.cuda.memory_allocated() 会虚高,OOM 风险翻倍。

正确姿势是:单 worker + 异步批处理 + GPU 绑定:

  • 启动命令用: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 和显卡型号实测。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

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

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

2403

2023.08.11

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

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

6250

2024.03.19

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

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

5606

2024.03.19

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

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

1711

2023.07.20

python能做什么
python能做什么

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

4324

2023.07.25

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

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

1689

2023.07.31

python教程
python教程

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

25237

2023.08.03

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

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

3067

2023.08.04

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

40

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn