Context并行

2024-08-25 05:36
文章标签 context 并行

本文主要是介绍Context并行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最初是Sequence并行+Tensor并行;

但是,Tensor并行加多GPU parition数目后,每个GPU上的计算量减小,无法和通信overlap,变慢;

CP can better address the issues. With CP, each GPU only computes on a part of the sequence, which reduces both computation and communication by CP times. Therefore, there are no concerns about the overlapping between them. The activation memory footprint per GPU is also CP times smaller, hence no OOM issue any more.

Context并行的动图:

[并行训练]Context Parallelism的原理与代码浅析 - 知乎 (zhihu.com)

3个要点:

1. 使用了RingAttention;(Overlap: Q和当前K、V计算时,下一份K、V在通信过来的路上了)

2. 因为有casual mask,每个token只和前面token的K、V进行计算,不计算后面的;因此为了更好的load-balance,用了将sequqnce划分为2N份的技巧;

3. 复用了最新的OSS和cuDNN FlashAttention

1. RingAttention

即每张卡做1/N的sequence tokens,先计算好自己这些tokens的Q、K、V,然后每次用自己的Q,计算1/N的K和V,GPU之间达成环形来每次传输1/N的K和V;每个GPU和所有K、V计算完毕后,将N个结果向量加和起来,就得到了自己这1/N tokens的attention计算结果;

 2. casual mask引发的Load balance优化

N张卡参与CP,将sequence划分为2N份,GPU-0: 0+5, GPU-1:1+4, GPU-2: 2+3,这样每卡之间的计算量就均匀了;

Context并行,天然就是接上Sequence并行,一起用的;

TP+CP+SP:

[GPU0, GPU1]拿到sequence的前半部分tokens,

[GPU2, GPU3]拿到sequence的后半部分tokens;

GPU0和GPU1将模型做了Tensor并行划分;

GPU2和GPU3将模型做了Tensor并行划分;

Dropout、LN(LayerNorm),[GPU0, GPU1]只用Sequence并行;([GPU2, GPU3]同理)

FC1、GeLU、FC2,[GPU0, GPU1]只用Tensor并行;([GPU2, GPU3]同理)

计算attention那里,特殊,因为每个token的Q要和前面的所有tokens的K、V做计算,但是它卡上只有自己这1/N部分的K、V;因此,采用Context并行来解决,轮转通信K、V,每个GPU计算N次,加和得到结果;即,[GPU0, GPU2]彼此成环,[GPU1, GPU3]彼此成环;

上例中,CP在外层,TP在内层;

Context parallelism overview - NVIDIA Docs

优势:

适合long context的训练;

比较好的overlap了计算和通信;

节约显存,正向时得到的K、V的activation(用于反向计算梯度),按token划分,缓存在各个GPU上;

这篇关于Context并行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104683

相关文章

context:component-scan使用说明!

<!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 --> <context:component-scan base-package="com.yuanls"/> 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controll

React的context学习总结

context是干什么的?为什么会存在这么一个东西? context字面意思是上下文,在react中存在是为了解决深层次组件传值困难的问题 这里涉及到组件的传值问题,大体商说分三总:兄弟间传值(通过父组件),父往子传值(通过props),子往父传(props函数回调),这是基础的传值问题,但是如果组件嵌套的太深,那么传值就变的非常麻烦,为了解决这样的问题才产生了context  这是cont

处理List采用并行流处理时,通过ForkJoinPool来控制并行度失控的问题

在使用parallelStream进行处理list时,如不指定线程池,默认的并行度采用cpu核数进行并行,这里采用ForJoinPool来控制,但循环中使用了redis获取key时,出现失控。具体上代码。 @RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)@Slf4jpublic class Fo

兔子--The method setLatestEventInfo(Context, CharSequence, CharSequence, PendingIntent) from the type

notification.setLatestEventInfo(context, title, message, pendingIntent);     不建议使用 低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。  Intent  intent = new Intent(

并行编程实战——TBB的安装

一、安装前的准备 在并行编程中,intel TBB还是一个比较强大的框架。可能对大多数数的开发者来说它还是比较陌生的,因为一般很少有公司会直接用到并行框架的水平。比之于OpenMP之类的比较容易直接使用的相关并行库,intel TBB还是一个相对来说比较难的框架。这不光在于开发过程,也因为它的安装过程。 早期的intel TBB安装还是比较复杂的,但随着技术的升级和系统版本的迭代,到现在基本已经

windows C++ 并行编程-使用 加速器 对象(下)

并发运行时支持各种编程模型。 这些模型可能会与其他库的模型重叠或对其进行补充。 本部分中的文档将 OpenMP 与并发运行时进行比较,并提供有关如何迁移现有 OpenMP 代码以使用并发运行时的示例。 OpenMP 编程模型由开放标准定义,具有与 Fortran 和 C/C++ 编程语言定义完善的绑定。 OpenMP 2.0 版和 2.5 版(由 Microsoft C++ 编译器支持)都很适合

大语言模型的上下文窗口(Context Windows):对人工智能应用的影响

大语言模型(LLMs)极大地提升了人工智能在理解和生成类人文本方面的能力。其中一个影响其效用的基本方面是它们的 “上下文窗口”—— 这个概念直接影响着这些模型接收和生成语言的有效性。我将深入探讨上下文窗口是什么、它们对人工智能应用的影响以及组织在利用大语言模型时的一些考量。 澳鹏在提升大语言模型开发方面处于领先地位,提供一系列对超越当前性能基准至关重要的服务。我们专注于大语言模型创建的复杂细节,

前端面试:对BFC规范(块级格式化上下文:block formatting context)的理解

块级格式化上下文(BFC)是一个独立的渲染区域,具有特定的布局规则。理解BFC对于前端开发非常重要,因为它影响元素的布局和定位。以下是对BFC的一些关键理解: 定义:BFC是一个HTML文档中的部分区域,内部的元素在该区域内独立于外部元素进行布局。BFC的创建可以通过特定的CSS属性,如overflow(非visible)、display: flow-root、position: absolut

windows C++ 并行编程-使用 加速器 对象(上)

可以使用 accelerator 和 accelerator_view 类指定要运行 C++ AMP 代码的设备或仿真器。 系统可能有多个设备或仿真器,它们在内存量、共享内存支持、调试支持或双精度支持方面有所不同。 C++ Accelerated Massive Parallelism (C++ AMP) 提供可用于检查可用加速器、将一个加速器设置为默认加速器、为多个 parallel_for_e

Android全局获取Context的技巧

Android全局获取Context的技巧 回想这么久以来我们所学的内容,你会发现有很多地方都需要用到Context,弹出Toast的时候需要,启动活动的时候需要,发送广播的时候需要,操作数据库的时候需要,使用通知的时候需要,等等等等。 或许目前你还没有为得不到Context而发愁过,因为我们很多的操作都是在活动中进行的,而活动本身就是一个Context对象。但是,当应用程序的架构逐渐开始复杂