相关:

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. UDP端口探活的那些细节

    一 背景 商业客户反馈用categraf的net_response插件配置了udp探测, 遇到报错了,如图  udp是无连接的,无法用建立连接的形式判断端口. 插件最初的设计是需要配置udp的发送字符 ...

  2. Mysql主机环境导入导出数据

    mysql数据库,在主机环境下导出数据为csv文件. 命令:select * into outfile '/mysql/11.csv' from 表; 可能会报错:ERROR 1290 (HY000) ...

  3. Css var 的基础使用

    Css var 语法 var(custom-property-name, value) - custom-property-name 必须 变量必须以 --开头 后面可以是英文.数字连接符,区分大小写 ...

  4. java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $

    java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $ pack ...

  5. 从Purge机制说起,详解GaussDB(for MySQL)的优化策略

    本文分享自华为云社区<[华为云MySQL技术专栏]GaussDB(for MySQL) Purge优化>,作者:GaussDB 数据库. 在MySQL中,尤其是在使用InnoDB引擎时,P ...

  6. 【UnityTips】如何自定义脚本模版

    [UnityTips]如何自定义脚本模版 通常我们创建新脚本时大家看到的是这个样子: using System.Collections; using System.Collections.Generi ...

  7. Yapi部署到kubernetes(k8s)--Azure AKS

    背景 找来找去都没找到简单方便的部署yapi到k8s的教程,就自己写了个: 本教程部署的版本是: 1.10.2 部署步骤 克隆仓库: git clone https://github.com/gebi ...

  8. 图最短路径之Floyd

    Floyd Warshall Algorithm 算法参考地址:Floyd Warshall Algorithm | DP-16 - GeeksforGeeks 算法的简介 Floyd 用于求解所有对 ...

  9. QT学习:03 信号与槽

    --- title: framework-cpp-qt-03-信号与槽 EntryName: framework-cpp-qt-03-signal-slot date: 2020-04-09 13:5 ...

  10. 用hive或mr清洗app数据

    1.项目背景 从大量源数据中清洗出有效数据供后续程序使用. 源数据参照log.txt文件 2.项目源数据说明 9841EF7BDBDF0AC9AF42AEBB4E4F8D4F Id 12 状态1 22 ...