相关:

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. 服务器安装mysql

    数据库连接操作 修改root的hostupdate user set host='%' where user='root' and host ="127.0.0.1"flush p ...

  2. Angular 集成 StreamSaver

    应用场景: 实现目标: 在网页端实现大文件(文件大小 >= 2 G) 断点续传 实际方案: 发送多次请求, 每次请求一部分文件数据, 然后通过续写将文件数据全部写入. 难点: 无法实现文件续写, ...

  3. 增补博客 第二篇 python 谢宾斯基三角型字符分形图形输出

    SIZE = int(input())# 输入分割次数 SIZE = SIZE<<3 # 将分割次数转为次数 y = SIZE - 1 # 用来控制列数 while y>=0: fo ...

  4. Oracle常用命令收藏

    查看数据库名 SELECT t.NAME FROM V$DATABASE t; 查看实例名 SELECT t.INSTANCE_NAME FROM V$INSTANCE t; 查看SID select ...

  5. Netty(三)Netty模型

    1. Netty模型 Netty主要基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor. 简版图: 说明: BossGroup线程维护Selector ...

  6. 多个子节点收集日志-主节点上传到HDFS

    Master: ---------------------- #MasterAgentMasterAgent.channels = c1MasterAgent.sources = s1MasterAg ...

  7. 文件系统(九):一文看懂yaffs2文件系统原理

    liwen01 2024.07.07 前言 yaffs 是专为nand flash 设计的一款文件系统,与jffs 类似,都是属于日志结构文件系统.与jffs 不同的是,yaffs 文件系统利用了na ...

  8. Java-JDBC的对象DriverManager,Connection,ResultSet,PreparedStatement,工具类:JDBCUTILS,JDBC控制事务

    1. 概念 Java DataBase Connectivity Java 数据库连接 Java语言操作数据库 JDBC本质:其实是官方(sun)公司的一套操作所有关系型数据库的规则,即接口.各个数据 ...

  9. 第二部分:关键技术领域的开源实践【Linux服务器自动化运维】

    Linux运维可能会遇到多种问题,这些问题可能源于技术挑战.资源配置.安全性.管理复杂性等多个方面.以下是一些常见的Linux运维问题: 技能要求: Linux系统通常需要较高的技术水平和经验来进行有 ...

  10. 解决方案 | 一个VBA代码里面非常隐蔽的错误:运行时错误“5”:无效的过程调用或参数

    1 代码部分 代码功能:实现使用sumatra打开指定pdf指定页码 代码: Sub OpenPDFatPage() Dim PDFFile As String Dim PageNumber As L ...