用 torchrun 启动 GPT-2 多进程推理:分布式推理基础与 CPU/GPU 混合部署实战

部署运行你感兴趣的模型镜像

本文介绍如何基于 PyTorch 的 torchrun 工具,搭建一个支持多进程并行的 GPT-2 推理脚本,结合 CPU/GPU 混合使用策略,实现轻量、高效的本地推理并发执行。适合对分布式推理初学者快速上手。


📦 项目结构

本项目位于 dist_infer_demo/ 目录下:

dist_infer_demo/
├── dist_infer_demo.py       # ✅ 本文主程序
├── launch.sh                # 多进程启动脚本
├── gpt2_student_v2/         # 本地训练后的小模型

🚀 分布式推理为什么有用?

在模型部署中,推理通常是瓶颈:

  • 单进程推理速度快但利用率低
  • 多请求并发时常会阻塞
  • 利用多核 CPU / 多卡 GPU 可以提升吞吐

因此,我们使用 PyTorch 内建的 分布式框架(DistributedDataParallel)来实现多进程独立推理。


1️⃣ 多进程启动方式:torchrun

torchrun --nproc_per_node=4 dist_infer_demo.py

参数说明:

参数含义
--nproc_per_node启动多少个进程(本地核/逻辑线程数)
dist_infer_demo.py每个进程运行的 Python 脚本

这比 mp.spawn() 更易管理,推荐部署时使用


2️⃣ 核心脚本解读:dist_infer_demo.py

import torch.distributed as dist
import torch.multiprocessing as mp
from transformers import GPT2LMHeadModel, GPT2Tokenizer

def run(rank, world_size):
    dist.init_process_group("gloo", rank=rank, world_size=world_size)

    # 模型加载
    model = GPT2LMHeadModel.from_pretrained("gpt2_student_v2").eval()
    tokenizer = GPT2Tokenizer.from_pretrained("gpt2_student_v2")

    # 推理输入
    prompt = "你好,今天是"
    inputs = tokenizer(prompt, return_tensors="pt")

    # GPU rank 0 使用 GPU,其他用 CPU
    device = torch.device("cuda" if rank == 0 and torch.cuda.is_available() else "cpu")
    model.to(device)
    inputs = {k: v.to(device) for k, v in inputs.items()}

    with torch.no_grad():
        logits = model(**inputs).logits
        token_id = int(logits[0, -1].argmax())
        token = tokenizer.decode([token_id])

    print(f"[Rank {rank}] 输出: {token}")

3️⃣ 启动脚本 launch.sh

#!/bin/bash
torchrun --nproc_per_node=4 dist_infer_demo.py
  • 启动 4 个独立进程(模拟 4 并发推理线程)
  • 每个进程会自动分配 rank 值(0~3)
  • 可根据 CPU 核心数灵活调整

4️⃣ 输出示例

[Rank 0] 输出: 很
[Rank 1] 输出: 很
[Rank 2] 输出: 很
[Rank 3] 输出: 很

说明每个进程成功运行模型推理,并输出预测结果。


5️⃣ CPU + GPU 混合部署策略亮点

device = torch.device("cuda" if rank == 0 and torch.cuda.is_available() else "cpu")
  • rank 0 使用 GPU(通常部署优先)
  • 其余进程使用 CPU(合理利用计算资源)
  • 适用于“1 卡 GPU + 多核 CPU”的轻量推理场景

✅ 小结回顾

项目要素技术点说明
启动方式使用 torchrun 启动多进程
rank 识别与分配自动注入 rankworld_size 环境变量
推理并行策略不依赖梯度计算,每个进程独立执行
多设备调度rank 0 用 GPU,其余进程用 CPU

📌 总结

  • 本文介绍了如何使用 torchrun + PyTorch DDP 构建分布式推理服务
  • dist_infer_demo.py 实现了多进程独立推理、GPU优先调度
  • 启动脚本 launch.sh 简洁灵活,适合本地或服务器部署

🧭 本系列为 GPT-2 分布式推理项目第1篇(共三篇)


📌 YoanAILab 技术导航页

💡 项目源码 × 实战部署 × 转型经验,一页总览
👉 点击查看完整导航页

📚 包含内容:

  • 🧠 GPT-2 项目源码(GitHub)
  • ✍️ 优快云 技术专栏合集
  • 💼 知乎转型日志
  • 📖 公众号 YoanAILab 全文合集

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

调整了启动DB-GPT任务的GPU卡号,输出如下: WARNING 08-05 06:43:39 multiproc_worker_utils.py:298] Reducing Torch parallelism from 64 threads to 1 to avoid unnecessary CPU contention. Set OMP_NUM_THREADS in the external environment to tune this value as needed. INFO 08-05 06:43:39 custom_cache_manager.py:17] Setting Triton cache manager to: vllm.triton_utils.custom_cache_manager:CustomCacheManager (VllmWorkerProcess pid=31196) INFO 08-05 06:43:39 multiproc_worker_utils.py:227] Worker ready; awaiting tasks INFO 08-05 06:43:39 cuda.py:225] Using Flash Attention backend. (VllmWorkerProcess pid=31196) INFO 08-05 06:43:39 cuda.py:225] Using Flash Attention backend. (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] Exception in worker VllmWorkerProcess while processing method init_device. (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] Traceback (most recent call last): (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] File "//opt/.uv.venv/lib/python3.11/site-packages/vllm/executor/multiproc_worker_utils.py", line 234, in _run_worker_process (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] output = run_method(worker, method, args, kwargs) (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] File "//opt/.uv.venv/lib/python3.11/site-packages/vllm/utils.py", line 2208, in run_method (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] return func(*args, **kwargs) (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] ^^^^^^^^^^^^^^^^^^^^^ (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] File "//opt/.uv.venv/lib/python3.11/site-packages/vllm/worker/worker.py", line 154, in init_device (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] torch.cuda.set_device(self.device) (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] File "//opt/.uv.venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 478, in set_device (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] torch._C._cuda_setDevice(device) (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] File "//opt/.uv.venv/lib/python3.11/site-packages/torch/cuda/__init__.py", line 305, in _lazy_init (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] raise RuntimeError( (VllmWorkerProcess pid=31196) ERROR 08-05 06:43:40 multiproc_worker_utils.py:240] RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method
08-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoanAILab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值