相关:

Jax框架的jit编译是否可以使用循环结构,如果使用循环结构需要注意什么


Jax的static和Traced都是指jit编译的函数内的对象的属性的,jit装饰的函数其输入参数和输出参数都是Traced类型的(除了使用@partial装饰符提前指定为static的),而jit装饰的函数内的所有jax的array都是Traced的,即使不依赖输入的参数也是为Traced的,如:

import jax.numpy as jnp
from jax import jit @jit
def f(x):
# return x.reshape(jnp.array(x.shape).prod())
print(x)
y = jnp.ones((3,3))
print(y) x = jnp.ones((2, 3))
f(x)

但是,jit装饰的函数内的所有python类型的array都是static的,如:

也就是说,jit在编译时会把python的代码直接进行编译,硬编码到后端的代码中,这样所有在jit内的python代码都为static类型。

所有的jit包装下的函数中的循环和判断语句都不能依赖于Traced对象,也就是说jit包装的函数在编译时需要将判断语句取出固定的分支,对循环语句进行展开,可以把jit下的循环和判断语句视作static。


static类型,是指在jit编译时就把具体的数值编译到代码中,把循环和判断语句全部转为顺序结构的语句。

Traced类型,是指在jit编译时将变量的shape和type固定,jit编译后的代码可以通过Tracd对象的不同值来得出不同的运算结果,但是不同的运行次中Traced对象的shape和type都是不能变的,如果调用过程中Traced对象的shape或type改变那么jax的jit会对代码进行重新编译并缓存。


在jit的包装中,jax的对象(因为是jax的类型对象必然是Traced类型)的一些操作,要求操作的参数必须是static类型,也就是说jit编译时有些jax的一些操作的参数要求在编译时是需要确定的,如jnp.array对象的reshape操作。

因为Traced对象的shape和type在jit编译时需要固定的,也就是说Traced对象的shape和type是static类型的,因此对jnp.array的static类型的shape进行reshape操作也需要操作参数为static的,即jnp.array的reshape参数和该jnp.array的shape参数都需要在jit编译时指定。

官方给出的一个例子:

由于jnp.array(x.shape).prod()操作得到的变量依旧为jnp.array类型,即jax类型,那么也就为Traced类型,但是jnp.array的reshape操作要求参数为static类型,即在jit编译时硬编码到代码中,因此报错。

关于这一点,我们要注意,对于jax的一些对象的操作,会要求操作参数或操作对象为static或Traced的要进行区分。

对于jit下的一些static类型变量通过numpy或python操作后获得的新变量依旧为static类型。而不论是对static对象还是Traced对象进行jax操作那么就会得到Traced类型对象。

对static类型对象进行numpy或python操作,依旧获得python或numpy类型的static对象:

对Traced对象进行操作,得到的依旧为Traced类型:


对于前面最早给出的报错的例子,下面给出修改后的代码:

from jax import jit
import jax.numpy as jnp
import numpy as np @jit
def f(x):
return x.reshape((np.prod(x.shape),)) f(x)

Jax框架的static与Traced Operations —— Static vs Traced Operations的更多相关文章

  1. C++中的static数据成员与static成员函数

    本文要点: 1.static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联! aka:每个static数据成 ...

  2. (转) C++ static、const和static const 以及它们的初始化

    const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...

  3. static public和 public static 区别

    static:加static 的是静态成员,不能实例化在你运行的时候他自己在内存中开辟了块空间,不用在new, 有点像全局变量,如果不用你必须去 实例化(new)才能用 static是静态的意思,pu ...

  4. C++ static、const和static const 以及它们的初始化

    转自C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. s ...

  5. java——多线程——单例模式的static方法和非static方法是否是线程安全的?

    单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...

  6. static方法与非static方法是否可以互相调用

    情况一.static方法调用非static方法 非静态方法只有实例对象才可调用,而静态方法随着类的加载而加载,类的加载在实例对象产生之前,所以静态方法不能调用非静态方法 情况二.非atic方法调用st ...

  7. synchronized 修饰在 static方法和非static方法的区别

    Java中synchronized用在静态方法和非静态方法上面的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法.也可以synchroniz ...

  8. C++ static成员变量与static成员函数

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分.  一 静态数据成员:  类 ...

  9. synchronized修饰static方法与非static方法的区别

    1. 当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例),作用范围是整个静态方法,作用的对象是这个类的所有对象. 2. 当synchron ...

  10. java中static特殊性和final(static成员直接被访问,this不能用在static方法中,static不可访问非static)

    java的static关键字 java中,static修饰的成员变量和成员方法叫静态变量和静态方法,不依赖类特定的实例,被类的所有实例共享. 静态变量或类变量 和 实例变量,区别是: 静态变量在内存中 ...

随机推荐

  1. ABC326

    上次说我的写法low的人的AT号在这里!!( 我又来提供 low 算法了. 从 D 开始. T4 我们把 \(\text{A}\) 看成 \(1\),把 \(\text{B}\) 看成 \(2\),把 ...

  2. 打开TLS 1.1和1.2而不影响其他协议

    打开TLS 1.1和1.2而不影响其他协议 System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 ...

  3. scrcpy 安卓投屏

    下载地址:https://github.com/Genymobile/scrcpy 电脑是WINDOWS的,下载WINDOWS版scrcpy:scrcpy-win64-v1.14.zip,解压到:D: ...

  4. C#.NET AES CBC 加密

    重点: 1. KEY 和 IV 转 byte[] 时的编码. 2.要加密的字符串转 byte[] 时的编码. 3.AES 的PADDING,MODE. 4.加密后的byte[] 转字符串时的编码. 先 ...

  5. PasteSpider的集群组件PasteCluster(让你的项目快速支持集群模式)的思路及实现(含源码)

    PasteSpider是什么? 一款使用.net编写的开源的Linux容器部署助手,支持一键发布,平滑升级,自动伸缩, Key-Value配置,项目网关,环境隔离,运行报表,差量升级,私有仓库,集群部 ...

  6. 妙用OSGraph:发掘GitHub知识图谱上的开源故事

    1. 何为OSGraph? OSGraph (Open Source Graph) 是一个开源图谱关系洞察工具,基于GitHub开源数据全域图谱,实现开发者行为.项目社区生态的分析洞察.可以为开发者. ...

  7. ChatGPT应用与实践初探

    近期,长江商学院EMBA38期&甄知科技开展了题为"ChatGPT应用与实践初探"的线下沙龙活动,由上海甄知科技创始合伙人兼CTO张礼军主讲,主要给大家解密最近很火的Cha ...

  8. 接口加密传输设计及AES加解密代码DEMO

    接口加密传输设计及AES加解密代码DEMO 接口加密的方案设计:可以将请求的json字符串aes加密,通过params字段传输,接口服务端接收到参数,先解密,然后转换成对象.继续业务逻辑的处理.(另外 ...

  9. Oracle 数据库 命令行安装

    Oracle 数据库 命令行安装 1. 准备工作 关闭 防火墙,关闭 SElinux 2. 安装相关依赖包 yum -y install binutils compat-libcap1 compat- ...

  10. 解决Vue中使用history路由模式出现404的问题

    背景 vue中默认的路由模式是hash,会出现烦人的符号#,如http://127.0.0.1/#/. 改为history模式可以解决这个问题,但是有一个坑是:强刷新.回退等操作会出现404. Vue ...