张量并行 (Tensor Parallelism, TP) 深度解析

张量并行 (Tensor Parallelism, TP) 深度解析

1. TP 只能用于 Transformer 吗?

答案是:不,但它在 Transformer 上用得最多,也最有效。

咱们从 CV 的角度来类比。TP 的核心思想是“拆分矩阵乘法”。任何包含巨大矩阵乘法 (Y=X⋅WY = X \cdot WY=XW) 的模型,理论上都可以用 TP。比如一个超大的全连接网络 (MLP),你完全可以把它那一层巨大的权重矩阵WWW拆开存到不同卡上。

为什么大家都在说 TP + Transformer?

这是因为 Transformer 的结构(Multi-Head Attention 和 FFN)简直是为 TP天造地设的。

Transformer 的每一层都包含两个主要的子模块:

  1. Multi-Head Attention (MHA)
  2. Feed-Forward Network (FFN)

这两个模块都有一个共同的神奇特性:可以把它们切成两半,让两张卡各自独立跑完大部分计算,只在最后一步进行一次通信就能得到正确结果。

这种特性极大地减少了通信频率,让 TP 变得实用。如果一个模型结构导致每做一步小计算都要通信一次,那通信开销会大到让并行失去意义。

所以,TP 是一种通用的技术,但 Transformer 的结构完美契合了 TP 的优势,成为了它的最佳拍档。


2. TP 的详细数据流是怎样的?

你问到了资料中没有展开的细节,这部分是理解 TP 的关键。资料里提到的“切分矩阵”、“算前16个头”、“立刻通信拼起来”,具体是怎么发生的呢?

我们以2 张显卡 (GPU 0, GPU 1)为例,分别看看 FFN 和 MHA 的数据流。

场景一:Feed-Forward Network (FFN) 的数据流

FFN 通常是一个两层的 MLP:先放大维度,再缩小回原维度。假设输入是XXX,两个权重矩阵是W1W_1W1W2W_2W2

第一步:列切分 (Column Parallelism) 处理W1W_1W1
  1. 复制输入:GPU 0 和 GPU 1 拿到完全一样的输入数据XXX
  2. 切分矩阵:巨大的W1W_1W1被竖着切成两半。
    • GPU 0 拿左半边W1,LW_{1,L}W1,L
    • GPU 1 拿右半边W1,RW_{1,R}W1,R
  3. 独立计算
    • GPU 0 算YL=ReLU(X⋅W1,L)Y_L = \text{ReLU}(X \cdot W_{1,L})YL=ReLU(XW1,L)
    • GPU 1 算YR=ReLU(X⋅W1,R)Y_R = \text{ReLU}(X \cdot W_{1,R})YR=ReLU(XW1,R)
    • 关键点:到这里,两张卡各自拿着输出向量的一半,不需要通信
第二步:行切分 (Row Parallelism) 处理W2W_2W2

为了让最后的结果能加起来,第二个矩阵W2W_2W2必须横着切。

  1. 输入:GPU 0 的输入是YLY_LYL,GPU 1 的输入是YRY_RYR
  2. 切分矩阵W2W_2W2被横着切成两半。
    • GPU 0 拿上半边W2,UpW_{2,Up}W2,Up
    • GPU 1 拿下半边W2,DownW_{2,Down}W2,Down
  3. 独立计算
    • GPU 0 算ZL=YL⋅W2,UpZ_L = Y_L \cdot W_{2,Up}ZL=YLW2,Up
    • GPU 1 算ZR=YR⋅W2,DownZ_R = Y_R \cdot W_{2,Down}ZR=YRW2,Down
  4. 关键通信 (All-Reduce):现在每张卡算出了最终结果的一部分。根据矩阵乘法规则,最终结果Z=ZL+ZRZ = Z_L + Z_RZ=ZL+ZR
    • 动作:两张卡进行一次All-Reduce (Sum)通信,把各自的ZLZ_LZLZRZ_RZR加起来。
    • 结果:通信结束后,GPU 0 和 GPU 1 都得到了完整的、正确的结果ZZZ

FFN 总结:输入复制 -> 第一层列切分 -> 第二层行切分 ->最后做一次 All-Reduce


场景二:Multi-Head Attention (MHA) 的数据流

这个更直观,就是资料里说的“CV人的类比…撕成两半”。假设有 32 个头。

  1. “头”的分配

    • GPU 0 负责计算第 1-16 个头。
    • GPU 1 负责计算第 17-32 个头。
  2. 切分 Q, K, V 投影层 (列切分)

    • 计算 Attention 需要把输入XXX投影成 Query, Key, Value。对应的权重WQ,WK,WVW_Q, W_K, W_VWQ,WK,WV也是巨大的矩阵。
    • 我们像 FFN 第一层一样,把它们按列切分。GPU 0 只拿属于前 16 个头的权重,GPU 1 拿后 16 个头的。
    • 两张卡各自算出自己那 16 个头的Q,K,VQ, K, VQ,K,V
  3. 独立计算 Attention

    • GPU 0 用自己的Q,K,VQ, K, VQ,K,V算它那 16 个头的注意力结果。
    • GPU 1 同理算它那 16 个头的结果。
    • 关键点:这一步完全独立,不需要通信
  4. 切分输出投影层WOW_OWO(行切分)

    • Attention 的最后一步是把所有头的结果拼接起来,乘一个输出矩阵WOW_OWO
    • 为了配合前面的切分,这个WOW_OWO必须按行切分
    • GPU 0 用它那 16 个头的结果乘以WOW_OWO的上半部分。
    • GPU 1 用它那 16 个头的结果乘以WOW_OWO的下半部分。
  5. 关键通信 (All-Reduce)

    • 和 FFN 一样,最后需要把两部分结果加起来。
    • 动作:进行一次All-Reduce (Sum)通信。
    • 结果:两张卡都得到了完整的 MHA 输出。

MHA 总结:按“头”把 Q/K/V 权重列切分 -> 独立算 Attention -> 把输出权重WOW_OWO行切分 ->最后做一次 All-Reduce


导师总结 (数据流)

现在回看资料里的那句话:“每一层计算结束,必须立刻通信,将两部分结果拼起来(或相加)”,是不是清晰多了?

  • 在 Transformer 的每一层里,包含一个 MHA 块和一个 FFN 块。
  • TP 的魔法流程是
    1. 进入 MHA 块,大家分头干活,最后通信一次 (All-Reduce)得到完整结果。
    2. 拿着这个结果进入 FFN 块,再分头干活,最后再通信一次 (All-Reduce)得到完整结果。
    3. 这一层就算跑完了,带着完整的结果进入下一层。

这就是为什么 TP 的通信量巨大,因为它在一个 Transformer 层内部就要进行两次高频的 All-Reduce 通信。这也是为什么资料强调 TP “通常仅限于同一台机器内部(通过 NVLink 连接)使用” 的原因。


3. 模型是放在哪张卡上边的呢?

这是一个非常关键的问题!理解了这一点,你就真正掌握了张量并行(TP)的精髓。

在张量并行(TP)的模式下,完整的模型并不存在于任何单一的显卡上

模型的权重参数是被“撕碎”了,分散存储在参与 TP 的所有显卡上的。

为了让你彻底明白,我们还是用你熟悉的 CV 领域和之前讲过的并行方式做对比:

3.1 对比三种方式的模型位置

  • 数据并行 (DP)

    • 模型位置:每张卡上都有一份完整的模型复制。
    • CV 类比:就像你和你的同学(不同的 GPU)每人都有一本一模一样的《新华字典》(完整的 ResNet 模型),你们各自查不同的字(处理不同的数据)。
  • 流水线并行 (PP)

    • 模型位置:每张卡上存储模型的一部分层 (Layers)
    • CV 类比:就像工厂流水线,你负责装轮胎(前几层),他负责装发动机(中间层),最后一个人负责喷漆(最后几层)。大家手里都只有自己负责的那部分图纸。
  • 张量并行 (TP)(你现在问的这个):

    • 模型位置每一层的权重矩阵都被切分,分散在不同卡上。没有任何一张卡拥有某一层完整的权重。
    • CV 类比:资料里那个比喻非常精准——“把一个巨大的卷积核撕成了两半,两张卡各拿一半去算”。
    • 具体来说:假设一个线性层的权重矩阵WWW大小是4096×40964096 \times 40964096×4096。如果你用 2 张卡做 TP:
      • GPU 0可能只存了这个矩阵的左半边(4096×20484096 \times 20484096×2048)。
      • GPU 1存了右半边(4096×20484096 \times 20484096×2048)。

3.2 导师总结 (模型位置)

所以,回答你的问题:“模型是放在哪张卡上边的呢?”

答案是:模型被打散了,每个人手里都只有碎片。

  • GPU 0:持有第 1 层矩阵的碎片 A,第 2 层矩阵的碎片 C,第 3 层矩阵的碎片 E…
  • GPU 1:持有第 1 层矩阵的碎片 B,第 2 层矩阵的碎片 D,第 3 层矩阵的碎片 F…

这就是为什么资料的总结表里提到 TP 的显存节省是“极高 (单层参数被拆解)”。因为每张卡只需要存储原模型1/N1/N1/N的参数量(NNN是 TP 的并行度)。

但也正因为大家手里都只有碎片,所以每次计算完,必须立刻通信,“将两部分结果拼起来”,才能凑出完整的结果往下传。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1014864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

‌面试技巧:拿下测试岗位的秘诀

软件测试行业正经历着自动化、AI驱动的深刻变革,测试岗位的面试要求也随之升级。对于软件测试从业者而言,仅掌握基础测试知识已不足以在竞争中脱颖而出。‌一、面试前的充分准备:奠定成功基础‌面试前的准备是决定成败的第一步。测试岗位的面…

Linux修改网络配置和IP地址

网络模型:早期网络模型为OSI 7层模型:应用层定义了各种应用协议(SSH,FTP,VNC/QQ等)表示层在一个系统定义的文件,可以在另一个系统中通过同样的方式识别和理解会话层控制会话窗口传输层控制端到端…

三步走截取长图

如果觉得好,请点赞、收藏转发和关注,感谢您!测试环境:windows10使用场景:无法保存的内容声明:禁止用于非法目的,否则后果自负!上图!

网络安全异想天开(不定期更新)

1.使用AI大数据技术处理安全问题。2.有福同享有难同当:你发什么,我返回你发的,你拒绝我也拒绝。3.没有隐私可言:软件协议,隐私条款和设置,早就泄露了。4.高考屏蔽信号也是一种安全手段。5.手机验证码的安全…

JavaWeb企业级开发---JavaScript

记录在听黑马课的时候的笔记以及课堂上练习的代码,文章图源于我在听课的时候所截的屏,所以有些不清晰,请见谅。下面是课程链接,可点击自行跳转。 【黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(…

串口通讯的android 封装开箱即用!提供源代码!

功能概述 本文档总结了在Android应用中使用serialportlibrary实现串口通讯功能的完整过程。通过本次开发,成功添加了以下核心功能: 串口设备的打开与关闭 数据的发送与接收 用户友好的操作界面 实现细节 1. UI界面修改 在activity_main.xml中添加…

测试左移:构建软件质量的早期防线

在快速迭代的现代软件开发周期中,缺陷发现的时机直接影响项目成本、发布节奏与最终用户体验。传统软件测试模式中,测试活动往往集中于开发后期,导致缺陷修复成本高昂、返工风险加剧。测试左移作为一种前瞻性质量保障策略,通过将测…

力扣1264-页面推荐

朋友关系列表: Friendship------------------------ | Column Name | Type | ------------------------ | user1_id | int | | user2_id | int | ------------------------ (user1_id, user2_id) 是这张表具有唯一值的列的组合。 这张表的每…

Springboot连锁火锅店餐饮管理系统h2dg0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能:用户,商家,菜品分类,菜品信息,在线留言,公告信息开题报告内容基于SpringBoot的连锁火锅店餐饮管理系统开题报告一、研究背景与意义随着餐饮行业数字化转型加速,连锁火锅店作为高频消费场景,面临管理效率低、顾客体验…

[SWPUCTF 2018]SimplePHP

1.打开是一个上传页面有一个上传文件功能和查看文件功能分别打开看一下upload_file.phpfile.php感觉这个查看文件这个页面可以进行任意文件读取&#xff0c;使用bp抓包看一下发现可以读取2.查看文件代码upload_file.php<?php include function.php; upload_file(); ?&g…

Flutter 多端落地实战:Web 与桌面应用的性能优化、SEO 与用户体验全攻略

引言&#xff1a;Flutter 的“全平台”承诺&#xff0c;真的能兑现吗&#xff1f; 自 Flutter 2.0 正式支持 Web 和桌面端以来&#xff0c;“一套代码跑六端”&#xff08;iOS、Android、Web、Windows、macOS、Linux&#xff09;成为无数团队的梦想。然而&#xff0c;现实往往…

系统启动和DNS

总结Linux系统&#xff08;包括不限于RockyLinux、Ubuntu&#xff09;的启动流程 当系统出现故障 1误删内核 右键虚拟机—电源 —打开固件 总结内核设计流派及特点。 单内核&#xff08;Monolithic Kernel&#xff09;特性表 对比维度核心特点核心设计目标高性能优先&#x…

Springboot连锁家政保洁管理系统03zmn(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;分店管理员,用户,保洁员,通知信息,独立服务,团队服务,独立服务信息,团队服务信息,独立服务订单,团队服务订单,团队派单,完成订单,独立服务取消,团队服务取消开题报告内容基于SpringBoot的连锁家政保洁管理系统开题报告一、研究背景与意义研…

Flutter 测试全栈指南:从单元测试到黄金路径验证的工程化实践

引言&#xff1a;为什么你的 Flutter 项目不敢重构&#xff1f;在敏捷开发时代&#xff0c;没有测试覆盖的代码就是技术债务。然而&#xff0c;许多 Flutter 团队仍停留在“手动点测”阶段&#xff0c;导致&#xff1a;修复一个 Bug 引入三个新 Bug&#xff1b;重构时如履薄冰&…

本凡码农引领杭州小程序开发解决方案赋能企业创新与发展

本凡码农的杭州小程序开发解决方案为企业提供了一种高效的数字化转型工具。我们的目标是帮助品牌快速适应市场变化&#xff0c;提升用户体验。通过定制化的小程序&#xff0c;企业能够实现从线上到线下的无缝连接&#xff0c;简化业务流程&#xff0c;从而更好地满足用户需求。…

FlutterOpenHarmony商城App标签选择组件开发

前言 标签选择是商城应用中常见的交互组件&#xff0c;用于商品规格选择、筛选条件选择、兴趣标签选择等场景。一个设计良好的标签选择组件需要支持单选和多选模式&#xff0c;并提供清晰的选中状态反馈。本文将详细介绍如何在Flutter和OpenHarmony平台上开发标签选择组件。 标…

Springboot连锁药店进销存业务系统98i85(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;员工,供应商,药品信息,药品采购,进货出库,药品销售,退货入库,药品报损,药品销毁开题报告内容基于SpringBoot的连锁药店进销存业务系统开题报告一、选题背景与意义1.1 行业现状与痛点随着医疗行业的快速发展和人们对健康需求的日益增加&…

前端与数据库交互

1. 前端角色&#xff1a;发起请求和处理响应前端主要负责&#xff1a;收集用户输入数据通过HTTP请求调用后端API处理响应并更新UI2. 基础前端代码示例&#xff08;使用Fetch API&#xff09;// API服务模块 class ApiService {constructor(baseURL) {this.baseURL baseURL;}//…

《CAPL脚本实现CANOE工具 Bus-Off自动恢复(含重试机制)》

目录 1.创建CAPL文件 3.编辑CAPL文件 4.CAPL文件功能描述 4.执行CAPL文件结果 1.创建CAPL文件 选择"Insert Network Node" 点击编辑按钮 ->输入CAPL文件的名称->点击打开 ->自动生成一个空的CAPL文件 3.编辑CAPL文件 这边的CANOE软件版本为16 /*!En…