tensor_parallel

GitHub
655 44 简单 1 次阅读 2天前MIT开发框架语言模型
AI 解读 由 AI 自动生成,仅供参考

tensor_parallel 是一款专为 PyTorch 设计的开源工具,旨在帮助开发者轻松地将大型模型拆分到多张 GPU 上进行训练或推理。它主要解决了显存受限导致无法运行大参数模型(如几十亿参数的 LLM)的难题,让用户仅需一行代码即可实现模型的自动并行化,无需手动修改复杂的网络结构。

这款工具非常适合 AI 研究人员、算法工程师以及需要处理大规模深度学习模型的开发者使用。其核心亮点在于“无感”集成:只需在模型加载后包裹一层 tp.tensor_parallel,原有的训练和推理代码几乎无需变动即可在多卡环境下运行。此外,它默认集成了类似 ZeRO-3 的参数分片技术,能自动避免参数冗余,显著提升显存利用率;同时支持将并行化后的模型无缝保存为标准格式,便于后续部署。无论是微调大型语言模型还是进行高负载推理,tensor_parallel 都能以极简的方式释放多显卡集群的算力潜能。

使用场景

某 AI 初创团队需要在单台配备双显卡的服务器上,对参数量达 130 亿的 OPT 大语言模型进行微调训练,以适配垂直领域的客服对话数据。

没有 tensor_parallel 时

  • 显存直接溢出:单个 GPU 无法容纳完整的 13B 模型权重,尝试加载即报 OOM(显存不足)错误,被迫放弃本地调试。
  • 改造代码极其繁琐:若强行使用多卡,需手动重写模型的前向传播逻辑,将矩阵乘法拆解并处理复杂的跨卡通信,开发周期长达数周。
  • 训练效率低下:即使通过复杂的数据并行勉强运行,由于无法利用张量并行技术,单步计算耗时极长,难以快速验证算法效果。
  • 保存模型困难:训练完成后,分散在多卡上的权重难以合并为标准格式,导致模型无法部署或迁移到其他环境。

使用 tensor_parallel 后

  • 一行代码自动切分:仅需调用 tp.tensor_parallel(model, ["cuda:0", "cuda:1"]),即可自动将模型权重均匀拆分到两张显卡上,瞬间解决显存瓶颈。
  • 零侵入式开发:无需修改任何模型内部结构或训练循环代码,原有的 PyTorch 训练脚本可直接复用,当天即可启动实验。
  • 线性加速推理与训练:自动优化了跨卡通信策略,在双卡环境下实现了接近线性的速度提升,大幅缩短了迭代周期。
  • 无缝保存与部署:利用 save_tensor_parallel 上下文管理器,可自动将分布式权重聚合并保存为单一标准文件,方便后续直接部署。

tensor_parallel 让开发者无需成为分布式系统专家,也能在消费级多卡设备上轻松驾驭超大参数模型的训练与推理。

运行环境要求

操作系统
  • 未说明
GPU

必需多张 NVIDIA GPU(单卡无法发挥并行优势),具体型号和显存取决于模型大小,需支持 CUDA 和 NCCL

内存

未说明(建议足够容纳未分割前的完整模型权重或分片加载)

依赖
notes该工具旨在通过一行代码将大型 PyTorch 模型拆分到多张 GPU 上进行训练或推理。默认启用 ZeRO-3 算法以避免参数重复。若遇到 NCCL 错误或挂起,可设置环境变量 TENSOR_PARALLEL_USE_NATIVE=1 进行调试。在内存受限场景下,支持结合 accelerate 进行无权重初始化及分片状态字典加载。
python未说明
torch
transformers
accelerate
tensor_parallel hero image

快速开始

tensor_parallel

PyPI version Black CI status

🚀  在 Kaggle 上试用全新的 40B 参数 LLM 演示

只需一行代码,即可在多块 GPU 上运行大型 PyTorch 模型,并有望实现线性加速。

import transformers
import tensor_parallel as tp
tokenizer = transformers.AutoTokenizer.from_pretrained("facebook/opt-13b")
model = transformers.AutoModelForCausalLM.from_pretrained("facebook/opt-13b")  # 使用 opt-125m 进行测试

model = tp.tensor_parallel(model, ["cuda:0", "cuda:1"])  # <- 每块 GPU 只持有模型参数的一半

inputs = tokenizer("A cat sat", return_tensors="pt")["input_ids"].to("cuda:0")
outputs = model.generate(inputs, num_beams=5)
print(tokenizer.decode(outputs[0])) # A cat sat on my lap for a few minutes ...

model(input_ids=inputs, labels=inputs).loss.backward()  # 训练过程与平常无异

安装

最新稳定版(推荐):

pip install tensor_parallel

开发版:

pip install https://github.com/BlackSamorez/tensor_parallel/archive/main.zip

使用方法

只需将你的 PyTorch 模型包裹在 tp.tensor_parallel 中,即可像往常一样使用。为获得最佳内存效率,请在模型仍位于 CPU 上时调用 tp.tensor_parallel

以下是一些使用场景:

tensor_parallel 的高级参数:

  • device_ids: List[device] - 指定使用的设备;默认为所有可用的 GPU
  • output_device: device - 模型输出将位于该设备上
  • tensor_parallel_config: tp.Config - 使用自定义并行策略,详见 slicing_configs.py
  • distributed: bool - 如果为 True,则使用 torch.distributed 后端而非多线程(需要 torchrun
  • sharded: bool - 如果为 True,将查找所有未被 Tensor Parallelism 划分的可训练参数,并使用 ZeRO-3 算法 进行划分。
    • 权重将在各 GPU 之间分割,并在每次前向传播前重新组合
    • 简而言之:训练时使用此选项可避免参数重复(默认启用!)
    • sharded_param_names: List[str] - 需要以这种方式划分的参数名称,默认为自动检测

保存模型

若要保存一个可在非 tensor_parallel 环境中使用的模型,应使用 save_tensor_parallel 上下文包装器。

import torch
import transformers
import tensor_parallel as tp

model = tp.tensor_parallel(
    transformers.AutoModelForCausalLM.from_pretrained("facebook/opt-13b"), 
)

# 大量训练...

with tp.save_tensor_parallel(model):
    torch.save(model.state_dict(), "/tmp/")
    # 或者
    model.save_pretrained("/tmp/")

这段代码会将模型保存为未经过分割的状态。其原理是在创建 state_dict 时收集模型各部分的数据。

内存高效的调度

通常情况下,要正常创建和调度一个 tensor_parallel 模型,需要将整个模型加载到内存中。这可能会带来一些麻烦,但其实还有另一种方法。

可以使用辅助函数 convert_state_dict 将基础模型的 state_dict 转换为对应的 tensor_parallel state_dict,然后将其调度并加载到模型中:

import accelerate
import transformers

import tensor_parallel as tp

# 从 MyModel 初始化一个无权重的 tensor_parallel 模型
with accelerate.init_empty_weights():
    model = tp.TensorParallel(
        MyModel(),
        device_ids=[0, 1] # 并准备将其放置在 GPU 0 和 1 上
    )

# 加载 MyModel 的部分 state_dict
state_dict = torch.load("my_model_part_1_of_5.bin")

# 将其转换为 tensor_parallel 的 state_dict
tensor_parallel_state_dict = tp.convert_state_dict(
    state_dict,
    tensor_parallel_config=model.tensor_parallel_config,
    world_size=len(model.devices),
)

# 调度部分 state_dict(由于 meta 不支持 load_state_dict,这里使用 accelerate)
device_map = tp.infer_sharded_device_map(model)
for param_name, param in state_dict.items():
    module_name = param_name
    while len(module_name) > 0 and module_name not in device_map:
        module_name = ".".join(module_name.split(".")[:-1])
    param_device = device_map[module_name]
    accelerate.utils.set_module_tensor_to_device(model, param_name, param_device, value=param)

通过这种方法,每次只需将模型的一部分加载到内存中即可。

常见问题解答

  • 问: 我没有多GPU服务器,可以在Google Colab中使用tensor_parallel吗?

  • 答: Colab只有一块GPU,因此使用张量并行没有意义。不过,Kaggle为所有通过手机验证的账户免费提供两块T4显卡

  • 问: 什么是张量并行?

  • 答: 将每一层的权重分成若干部分,在不同的GPU上分别进行矩阵乘法运算,最后再将结果汇总。更多内容请参阅这里

  • 问: 我应该使用TensorParallel还是DataParallel

  • 答: 对于大型模型使用TensorParallel,对于较小的模型则使用DataParallel

  • 问: 它与FullyShardedDataParallel和ZeRO相比如何?

  • 答: 如果能容纳较大的批次,ZeRO更好;而对于小批次,TensorParallel更优。

为什么使用tensor_parallel……

  • DeepSpeedFairScale相比:
    • DeepSpeed提供了多种并行化策略,但需要仔细配置。
    • tensor_parallel只需一行代码即可实现一种有效的并行化策略。
    • tensor_parallel可以直接在Jupyter Notebook中运行。
  • MegatronLM相比:
    • MegatronLM针对特定模型架构提供了非常优秀的张量并行支持。
    • tensor_parallel则适用于任何架构,并且安装更加简单。
  • parallelformers相比:
    • parallelformers仅支持推理,而tensor_parallel支持训练。
  • alpa相比:
    • alpa是用于JAX框架下自动分布式训练和推理的强大工具。
    • tensor_parallel则基于PyTorch。
  • Model.parallelize()相比:
    • 两者都易于使用,都能处理大型模型。
    • parallelize中,每次只有一个GPU工作。
    • 而在tensor_parallel中,多个GPU可以并行工作。

简而言之,如果只是在单机上快速原型设计,建议使用tensor_parallel。如果是大规模、耗资巨大的训练任务,则应选择DeepSpeed+Megatron或alpa。

故障排除

如果您遇到NCCL错误或程序随机挂起的情况,可能是代码中存在未被正确显示的错误。 为了调试这些问题,我们建议您通过设置export TENSOR_PARALLEL_USE_NATIVE=1来重启,或者直接在单个设备上运行。

如果您发现了bug或遇到了问题,请将其报告至我们的问题追踪器。 我们将尽最大努力帮助您解决问题,但可能需要一些时间才能处理。请仅在您的问题与tensor_parallel相关时才创建新问题。 例如,如果您需要帮助安装transformers库或优化代码,请尝试在其他地方寻求支持。

代码风格

我们对所有拉取请求均采用blackisort格式化工具。 在提交代码之前,只需运行black . && isort .,即可确保代码符合规范。


版本历史

v2.0.02023/08/06
v1.3.22023/07/27
v1.3.12023/07/26
v1.3.02023/07/22
v1.2.92023/07/21
v1.2.82023/06/23
v1.2.72023/06/20
v1.2.62023/06/19
v1.2.52023/06/14
v1.2.42023/05/14
v1.2.32023/05/14
v1.2.22023/04/17
v1.2.12023/04/10
v1.2.02023/04/03
v1.1.42023/03/27
v1.1.32023/03/23
v1.1.12023/03/15
v1.1.02023/03/06
v1.0.252023/02/21
v1.0.242023/01/12

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

159.3k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|1周前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架