首页 > 其他分享 >Google的jax框架在TPU上的循环控制 —— 向量计算设备的循环结构控制

Google的jax框架在TPU上的循环控制 —— 向量计算设备的循环结构控制

时间:2024-01-18 17:46:39浏览次数:34  
标签:Google jax 流程 循环 计算 fun operation 向量

相关:

https://jax.readthedocs.io/en/latest/pallas/tpu.html



向量计算设备,如:GPU、TPU等,都是通过向量计算来进行加速的,因此在这类设备中进行向量计算的计算单元是成百上千的,但是进行结构控制的电路单元比较少,可以基本认为在向量设备中进行流程控制是标量的,而不是向量的,也就是说在一个计算周期里面并不能对多个计算单元进行流程控制,而只能是对单个或几个(若干个)计算单元进行流程控制,因为设备中并不能为每一个计算单元配备一个流程控制单元,因为流程控制在整个计算过程的占比太小。但是,在设备的kernel函数中我们往往是无可避免的使用到流程控制语句,因此在编程时就会采用几种方法:

  1. 直接使用标量性质的流程控制语句,在流程控制语句执行时极大的降低设备的运算效率;

  2. 使用循环展开方式,也就是把循环结构改写成顺序执行结构,这也是jax框架中所使用的方法;

  3. 使用向量规约方法来实现原有的循环和判断流程,如jax的cond、fori_loop、for_loop操作。但是该种情况并不通用,很多标量的循环和判断结构无法转换为向量归约,但无法进行向量规约时该种方法不可用。



在jax框架中,进行循环、判断展开操作是自动的,是由编译器自动进行的,不同于CUDA这种底层原语操作,不需要手动编写展开代码,但是也正因为是编译器自动展开的,因此我们需要避免把多个计算操作写在训练结构下,而是应该把多个循环结构下的计算操作写在一起并做成跳转调用操作。

比如:


for i in range(3):
    operation_1(i)
    operation_2(i)
    operation_3(i)

展开后为:
    operation_1(0)
    operation_2(0)
    operation_3(0)
    operation_1(1)
    operation_2(1)
    operation_3(1)
    operation_1(2)
    operation_2(2)
    operation_3(2)


如果我们把展开编译前的代码写为:
def fun(i):
    operation_1(i)
    operation_2(i)
    operation_3(i)
for i in range(3):
    fun(i)

那么展开后代码为:
def fun(i):
    operation_1(i)
    operation_2(i)
    operation_3(i)
fun(0)
fun(1)
fun(2)

资料:

image

标签:Google,jax,流程,循环,计算,fun,operation,向量
From: https://www.cnblogs.com/devilmaycry812839668/p/17973020

相关文章

  • Spring 如何解决循环依赖
    目录前言什么是循环依赖?Spring创建Bean主要流程实例化Bean填充Bean属性调用Bean初始化方法BeanPostProcessor接口拓展点Spring解决循环依赖的方法三级缓存流程Spring如何解决循环依赖为什么必须是单例为什么无法支持原型对象呢?为什么不能全是构造器注入为什么循环依赖......
  • 每个Go程序员必犯之错之切片循环错误
    每个Go程序员必犯之错原创 晁岳攀(鸟窝) 鸟窝聊技术 2023-12-1808:48 发表于北京 听全文说起每个程序员必犯的错误,那还得是"循环变量"这个错误了,就连Go的开发者都犯过这个错误,这个错误在Go的FAQ中也有提到Whathappenswithclosuresrunningasgoroutines?[......
  • jax框架的 Pallas 方式的GPU扩展不可用
    说下深度学习框架的GPU扩展功能的部分,也就是使用个人定制化的GPU代码编写方式来为深度学习框架做扩展。深度学习框架本身就是一种对GPU功能的一种封装和调用,但是由于太high-level,因此就会摒弃掉一些原有的GPU底层的编程功能,为此可以使用GPU原始功能的代码来为深度学习编写扩展函......
  • 海外视频直播APP/多语言语聊APP提交Google Play,Easy Done详细步骤
    当APP开发完成后,最重要的一个环节是需要将APP提交到GooglePlay,山东布谷科技的技术人员根据以往操作经验,来基础介绍下提交流程。首先是GooglePlay的上架前准备:  创建开发者账号:首先,您需要拥有一个Google开发者账号。如果没有账号,您需要前往GooglePlay开发者控制台,注册并购......
  • 多模块之间的循环依赖:java: Annotation processing is not supported for module cycl
    问题描述java:Annotationprocessingisnotsupportedformodulecycles.Pleaseensurethatallmodulesfromcycle[BDCloud-business,BDCloud-admin]areexcludedfromannotationprocessing  本质:BDCloud-admin模块为主启动模块,其包含了BDCloud-business模块;但在......
  • NLP 之二:循环神经网络
    我们已经预训练了词向量,接下来考虑设计神经网络解决更具体的问题。自然语言不同于图像信息,例如子结构并不具有连续性等等。诸多困难使得CNN难以沿用,一个代替的方法是RNN。循环神经网络(RNN)一个单隐藏层的MLP形如:$$\bmH=\phi(\bm{XW}+\bm{b})$$即输入\(\bm{X}\),经过全连接的线......
  • python循环语句
    while循环与其他语言不同的是python中的while循环没有dowhile语句,要么直接使用while循环,或者使用whileelse语句,其基本格式如下:while<expr>:<statement(s)>else:<additional_statement(s)>for循环遍历循环格式如下(将序列中的元素依次赋值给变量,再通过循环体处......
  • ArkTS之循环渲染案例
      /***ArkTS之循环渲染*/@ComponentstructMyChild{label:stringbuild(){Text(this.label).fontSize(30)}}@Entry@ComponentstructMyParent{@Statemy_array:Array<string>=['one','two','three......
  • Python第四小节随笔(循环)
    ##foriinrange(5):#外层循环可以进行5次i默认从0开始#forjinrange(1,11):#ifj%2==0:#continue#print(j,end='\t')#print()#'''#要求输出1到50之间所有5的倍数#'''##法一#foriinrange(1,51......
  • Google自研芯片首次交给台厂生产 | 百能云芯
    Google半导体战略有了新的走向,首次将其自家设计的手机系统单晶片(SoC)"Tensor"的测试订单委托给了台湾的京元电。这一举动打破了以往三星包揽晶圆代工与封测的模式,同时也为未来Google可能释出更多自家设计的人工智能(AI)芯片测试订单留下伏笔,象征着台湾在全球AI芯片供应链中的地位不断......