Oneflow概要

2024-01-11 09:32
文章标签 概要 oneflow

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

原文

  • 厚Compile阶段;薄Runtime阶段;
  • 去中心化调度:以Op(叫做Actor)为核心,每个Actor有输入buffer和输出buffer;输入buffer有可用的且输出buffer有空闲的,来驱动Actor执行
  • 天然支持pipeline并行:各个Actor并行执行;(同一台机器上,Actor之间的数据buffer,通过指针传递)

        “整个数据流的执行像一个网络,数据在网络中的流动就完成了计算,如何避免生产者生产太快,消费者消费不及,以及如何避免生产者生产太慢,消费者感到饥饿的问题,这涉及到对计算、内存、传输带宽的规划,尽可能使系统的瓶颈之处最宽,需要解决流控(flow control)的问题以及资源分配问题(如每个Actor的Register到底分配几个内存块配额),这是非常关键的问题,也是OneFlow系统已解决的。”

  • 数据搬运作为一等公民:一切皆Actor(运算是Actor, 数据搬运也是Actor), Compile期全局规划;
  • 尽可能并行:

      “考虑到分布式训练模型梯度同步时,显存到内存的传输带宽高于机器之间的网络传输带宽,OneFlow会做两级的scatter和gather操作(本机的和各个机器之间的),用于增加locality,提高整体性能;又比如在异步启动深度学习训练时,python端用户的控制逻辑跟OneFlow运行时的执行图是并行执行的,同时OneFlow有一套互斥临界区的设计保证执行的高效性和正确性;数据加载部分无论是从磁盘读数据还是从python端喂数据,OneFlow都能保证尽可能并行,使得计算设备不会因为要等数据而导致性能下降。已有框架如果想要尽可能重叠数据搬运和计算,一般借助多层回调(callback)函数,当嵌套层次过多时,会遇到所谓的callback hell麻烦,正确性和可读性都可能下降。但在OneFlow中,以上的这些并行并发特性,都是在这一套简洁的Actor机制下实现的,解决了令人头秃的callback hell问题。此外,在多机的网络通信部分,OneFlow底层的网络通信库原生支持RDMA的高性能通信,也有一套基于epoll的高效通信设计。而目前最流行的Pytorch,多机还需要通过RPC来做数据同步。”

  • Placement+SBP(Split, Broadcast, PartialSum): 其实就是每个Actor的输入和输出,对应一个逻辑View和一个物理View;这个逻辑View和这个物理View的关系,可以是Split关系(Gather<-->Scatter关系), Broadcast关系,PartialSum关系(Reduce关系);每个Actor可以预先定义几组映射关系,Compile阶段通过剪枝搜索来计算每组关系映射到物理View上后的总开销,取近似最优解;

 

原文

“由于分布式环境下每个机器上是一个进程,所以每个TaskNode都会设置Machine id和Thread id。线程id分配的方式:CPU上是平均分配各个thread id;GPU上,同一个GPU的所有计算Task在同一个计算线程中;所有集合通信的Task在同一个NCCL线程中。这样分配线程id的方式是因为经过实验验证,计算Task在相同线程中速度最快(最小切换开销)。”

 

GPU底层优化:

目标:打满计算资源和显存带宽资源

1. 减少Global memory访问

    1.1 Element-wise操作的多个op融合,多个kernel变成1个kernel,中间数据都放在寄存器里,减少了读写Global memory次数;

    1.2 借助Shared memory (例子没看懂)

    1.3 减少访存的大小:把Relu前向结果缓存在bit数组里(而不是bool byte数组),供反向传播时使用;

2. 确保全局内存访问合并

    全局内存访问挨着,就可以减少访存transaction数量;

    尽量对齐,否则可能导致额外多1次transaction;

    例子:Relu写bit数组:使用warp级同步原语(__ballot_sync),warp里每个thread会往同一个int32里写入bit;进一步优化:写完多个int32再多个thread一次写入Global Memory;

3. 减少Kernel计算量

    3.1 有些op(例如transpose这样纯搬运数据的),可以将对byte的操作合成对int64的操作,从而减少指令执行数量;

    3.2 减少除法:有的op的input tensor某些维度是1时,可以删去除法;

    3.3 int32做下标,比int64做下标,计算快;(当Tensor的维度还没大到超过int32时,可以这么做)

    3.4 除法和取余,用除法和乘法减法代替;

4. 掩盖延迟

    4.1 指令延迟(主要取决于读register的延迟);访存延迟;解决:增大并发warp数,即增大occupancy;(Little's law)

    4.2 int8-->double128,减少访存次数,达到访存延迟被隐藏的效果;

5. 其他技巧

    5.1 使用常量做数组下标(使用变量做下标,数组会被放到很慢的local memory;使用常量做下标,数组如果足够小,会被放到registers里)(问答链接)

    5.2 一个数据被读了2次,中间如果有写其他数据的指令,则编译器目前无法判断会不会第2次读的是不是第1次的结果,因此会傻瓜读2次;

    5.3 减少分支;尤其是分支里有访存操作的;

 

 

介绍GPU thread hide letency的好文章:

https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-143.pdf

同1个warp,当前后指令没有dependency时,可以连续发射多个指令,不管之前发射的指令执行完了没有;

1个SM上有可同时执行多个warp的cores,1个cycle里可以发射1~2个指令;所以,1个SM的throughtput=N指令/cycle;

因为所有threads就在片上的registers里,所以压根就没有context切换这个过程,也就切换得超快!

 

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


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

相关文章

【阅读文献】一个使用大语言模型的端到端语音概要

摘要 ssum框架(Speech Summarization)为了 从说话人的语音提出对应的文本二题出。 ssum面临的挑战: 控制长语音的输入捕捉 the intricate cross-mdoel mapping 在长语音输入和短文本之间。 ssum端到端模型框架 使用 Q-Former 作为 语音和文本的中介连接 ,并且使用LLMs去从语音特征正确地产生文本。 采取 multi-st

20151207 spring概要

AOP 多个类中出现相同的方法 业务逻辑中出现的重复性代码 抽取融合 --- 基本概念: 连接点 具有边界性质,相当于锚的位置 切点 相当于一些已经被抽取的重复性代码的位置,和锚做连接 增强 抽取出来的重复性代码和逻辑 目标对象 目标类 引介 织入 代理 切面 --- 实现重复逻辑的复用: 1 在目标对象中设置连接点。 2 编写增强代码,

IOS事件处理编程指南(一)——概要

在IOS设备中,我们能够处理多种事件。IOS将事件分为了如下三种:MultiTouch events,Motion events,和Remote control events。 被UIKit简化的事件处理 不用多说,UIKit框架为我们封装并实现了一些常用事件,同时,我们也可以通过重写touch系列响应函数,或为View添加系统定义好的或我们自定义的Gesture Recongize来处

OpenResty 概要及原理科普

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"高效Java"领取《Effective Java第三版》 欢迎跳转到本文的原文链接:https://honeypps.com/architect/introduction-of-openresty/ OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依

FPGA之JESD204B接口——总体概要 实例 中

1、AD9174配置 本设计采用AD9174,其是一款高性能、双通道、16位数模转换器(DAC),支持高达12.6 GSPS的DAC采样速率。该器件具有8通道、15.4 Gbps JESD204B数据输入端口、高性能片内DAC时钟倍频器和数字信号处理功能,适合单频段和多频段直接至射频(RF)无线应用,本设计要求 (1)200M用户数据,通道内插x6,主路径内插x8,总共48倍内插,实现fs=9.6

FPGA之JESD204B接口——总体概要 首片

1. 简介 JESD204是一种连接数据转换器(ADC和DAC)和逻辑器件的高速串行接口,该标准的 B 修订版支持高达 12.5 Gbps串行数据速率(目前C修订版已经发布,即JESD204C),并可确保 JESD204 链路具有可重复的确定性延迟。随着高速ADC跨入GSPS范围,与FPGA(定制ASIC)进行数据传输的首选接口协议是JESD204B。 在上一篇有关SerDes的博客《SerD

FPGA之JESD204B接口——总体概要 前奏

在开始了解高速接口的时候,必然会涉及到SerDes,本篇博客主要是在阅读大量文献之后形成的转述和总结。serdes的知识点实际上非常多,并且很多文章论述的侧重点不一样,有的测重整体,有的着眼细节,我则综合提取,以帮助跟我一样的初学者能够初步建立对SerDes清晰的认识。 1. 简介 SerDes是Serializer/Deserializer的缩写,即串行器和解串器,顾名思义是一种将并行数

软工文档-机房收费系统:概要设计说明书

概要设计说明书             1引言 1.1编写目的         本阶段的主要任务是在用户的需求分析阶段的基础上,对机房收费系统做概要设计,为在需求分析阶段得到的目标系统的物理模型确定一个合理的软件系统的体系结构。包括合理地划分组成系统的模块、模块间的调用关系及模块间的接口,并且为软件系统提供所用的数据结构或者数据库结构。同时为下一阶段的详细设计做参考。 本文档的读

软件工程:(四)概要设计

一.定义          概要设计是一个设计师根据用户交互过程和用户需求来形成交互框架和视觉框架的过程,其结果往往以反映交互控件布置、界面元素分组以及界面整体板式的页面框架图的形式来呈现。这是一个在用户研究和设计之间架起桥梁,使用户研究和设计无缝结合,将对用户目标与需求转换成具体界面设计解决方案的重要阶段。     二.主要内容:   (1)将软件划分成若干独立成分的依据;

day31-测试之性能测试工具JMeter的功能概要、元件作用域和执行顺序

目录 一、JMeter的功能概要         1.1.文件目录介绍                 1).bin目录                 2).docs目录                 3).printable_docs目录                 4).lib目录         1.2.基本配置                 1).汉化