相关:

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. js jquery input radio点击事件

    HTML: <input type="radio" name="myname" value="1" />1 <input ...

  2. C# .NET Framework EXCEL NPOI EOF in header

    实例化时异常: EOF in header 错误代码: try { workBook = new HSSFWorkbook(file); } catch { try { workBook = new ...

  3. C#.NET BC BouncyCastle 国密 SM2 解密遇到 Invalid point encoding 77

    C#.NET BC BouncyCastle 国密 SM2 解密遇到 Invalid point encoding 77 参考:https://blog.csdn.net/seeyouagen/art ...

  4. thinkpad-内置电池关闭方法

    -- -- 进入BIOS- Power- Disable Built-in Battery - 选择yes是关闭 (No打开内置电池)

  5. 在js、vue中使用方法调用a标签

    <el-button type="primary" style="width:130px" @click="shout"> &l ...

  6. 网络世界的脊柱——OSI七层模型

    简介 OSI代表开放系统互联(Open Systems Interconnection),这是国际标准化组织(ISO)提出的一个概念模型,用于描述网络通信的功能划分.简单来说,OSI模型把复杂的网络通 ...

  7. mysql8新版本安装注意事项及解决本地系统账户Strart the server和SQLyog客户端连接报 plugin caching_sha2_password could not be loaded

    mysql 安装包一路next安装, 到Apply Configuration,卡住在Start the server,原因是mysql8新版本的登录身份不对,需要进入服务,找到mysql80,然后属 ...

  8. 【长文】带你搞明白Redis

    本文使用第一人称来介绍Redis 一.概述 Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化 ...

  9. ecnuoj 5042 龟速飞行棋

    5042. 龟速飞行棋 题目链接:5042. 龟速飞行棋 赛中没过,赛后补题时由于题解有些抽象,自己写个题解. 可以发现每次转移的结果只跟后面两个点的胜负状态有关. 不妨设 \(f_{u,a,b}\) ...

  10. Python加密操作 对称加密/非对称加密

    安装包: pycryptodome https://pycryptodome.readthedocs.io/en/latest/src/installation.html#compiling-in-l ...