官方:

https://jax.readthedocs.io/en/latest/notebooks/thinking_in_jax.html#jit-mechanics-tracing-and-static-variables


jax的单步操作是具有编译和缓存特性的,但是单步操作之间是需要切换为python操作的,因而会影响代码运行效率,为了提高运行效率jax可以通过jit函数对多个jax的单步操作合并成一个编译和缓存操作。这些单步操作被合并到单个函数中后被jit函数包装后不需要在中间步骤切换为Python代码,因此运行效率更高。

代码:

from jax import jit
import jax.numpy as jnp import numpy as np @jit
def f(x, y):
print("Running f():")
print(f" x = {x}")
print(f" y = {y}")
result = jnp.dot(x + 1, y + 1)
print(f" result = {result}")
return result x = np.random.randn(3, 4)
y = np.random.randn(4)
f(x, y)

运行结果:

再次调用:

x2 = np.random.randn(3, 4)
y2 = np.random.randn(4)
f(x2, y2)

运行结果:

可以看到,第一次运行时jax框架把jit函数内的操作进行了编译,然后再一次调用f函数时则不执行python代码,而是直接执行编译后的jax的后端代码。

但是要注意的是,jit编译的代码需要是静态static的,也就是jit编译的函数,其输入的参数必须是static的,即shape和type是静态的,这里的静态是指输入的参数在jit的编译的函数内其参数变量的shape和type是不能改变的(由于jax的array变量其内部值也是不能更改的,因此这点是基本的保证),并且依赖输入参数变量的其他变量的shape和type也是静态的,即只能依赖于输入变量的shape和type而不能随意变动。

换句话说,在jax的jit编译的函数内参数的shape和type如果变化也只能是依赖输入参数的type和shape的,而且与输入参数参数相关的代码结构只能是固定的或者说是依赖于输入参数的type和shape的,而像if判断这样需要依赖数值大小的语句是不能够依赖于输入参数的value的,否则在进行jit编译时是会报错的。

给出Demo:

这个例子中,jit包裹的函数内的判断语句依赖于输入参数的具体值的,因此无法进行jit编译,为此,我们可以把jit内的if判断语句依赖的数值设置为静态static的,以此进行jit编译。

修改后代码:

from functools import partial

@partial(jit, static_argnums=(1,))
def f(x, neg):
print("x:", x)
print("neg:", neg)
return -x if neg else x f(111, False)

给出第一次运行和第二次运行结果:

可以看到,在第一次运算时进行了jit编译,因此会执行jit内部的python操作,打印出x和neg的数值,第二次运行时是直接调用已经编译好的jax后端代码。

之所以这里没有报错,是因为已经在编译时把neg变量设置为非jax的Traced变量,而是python的False变量,也就是说这时候编译的jax代码中neg变量是直接使用False值的,而不是已变量形式存在的。

当然由于该种方法时把neg变量变为固定值后进行编译的,因此如果neg的值不为False或者输入的x变量的shape或type变化,也会因为没有缓存对应的代码而重新执行编译,例如:

改变x的shape,引起jit的重新编译:

改变neg的值为True,引起jit的重新编译:

Jax计算框架的JIT编译的static特性的更多相关文章

  1. 你的java 代码对JIT编译友好吗?

    JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...

  2. 你的Java代码对JIT编译友好么?(转)

    JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...

  3. 【Java】实战Java虚拟机之五“开启JIT编译”

    今天开始实战Java虚拟机之五“开启JIT编译” 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Ja ...

  4. Storm实时计算框架的编程模式

    storm分布式流式计算框架. nimbus:主进程服务(职责就是任务的分配的,程序的分发) supervisor:工作进程服务(职责就是启动线程池,接受任务,运行任务,报告任务的运行状态) 注意容错 ...

  5. 开源图计算框架GraphLab介绍

    GraphLab介绍 GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架.框架使用C++语言开发实现. 该框架是面向机器学习( ...

  6. Storm 流式计算框架

    1. 简介 是一个分布式, 高容错的 实时计算框架 Storm进程常驻内存, 永久运行 Storm数据不经过磁盘, 在内存中流转, 通过网络直接发送给下游 流式处理(streaming) 与 批处理( ...

  7. 90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(1)- JIT编译优化

    麻烦大家帮我投一票哈,谢谢 经常听到 Java 性能不如 C/C++ 的言论,也经常听说 Java 程序需要预热,那么其中主要原因是啥呢? 面试的时候谈到 JVM,也有很多面试官喜欢问,为啥 Java ...

  8. 实时计算框架:Flink集群搭建与运行机制

    一.Flink概述 1.基础简介 Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算.Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算.主要特性包 ...

  9. javac 编译与 JIT 编译

    编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...

  10. Storm分布式实时流计算框架相关技术总结

    Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...

随机推荐

  1. Oracle使用序列和触发器设置自增字段

    一.创建一张工作表 例: create table tv(ID NUMBER primary key,TVNAME VARCHAR(16),ISPASS NUMBER);   二.先创建一个序列 cr ...

  2. SpringBoot启动报错:Parameter 0 of method hmset in com.qcby.rbac.util.RedisUtils required a bean of type

    SpringBoot启动报错,报错信息如下: 报错是由于A类中定义了含参数的构造函数,Spring自动构造和注入时未为该Bean传入参数,引起报错. 查了很多资料,最后发现,我是因为注释的时候没有把@ ...

  3. 阿里也出手了!Spring CloudAlibaba AI问世了

    写在前面 在之前的文章中我们有介绍过SpringAI这个项目.SpringAI 是Spring 官方社区项目,旨在简化 Java AI 应用程序开发, 让 Java 开发者想使用 Spring 开发普 ...

  4. 海量数据处理利器 Roaring BitMap 原理介绍

    作者:来自 vivo 互联网服务器团队- Zheng Rui 本文结合个人理解梳理了BitMap及Roaring BitMap的原理及使用,分别主要介绍了Roaring BitMap的存储方式及三种c ...

  5. 《Javscript实用教程》目录

    图书购买地址: 京东:<Javscript实用教程> 当当:<Javscript实用教程> 天猫:<Javscript实用教程> 注:本书提供源码和ppt课件,下载 ...

  6. springboot使用mail提示没有该类型的bean

    @Autowired private JavaMailSenderImpl javaMailSender; 自动注入时提示没有该类型的Bean. 原因 没有配置邮件发送相关的配置信息. spring: ...

  7. Android 通过odex优化提高首次开机速度

    背景 客户反馈说开机时间过长,需要优化. 原文:https://blog.csdn.net/croop520/article/details/73930184 介绍 现在很多Android都需要预装很 ...

  8. Spark3学习【基于Java】1. Spark-Sql入门程序

    spark-sql是用来处理结构化数据的模块,是入门spark的首要模块. 技术的学习无非就是去了解它的API,但是Spark有点难,因为它的例子和网上能搜到的基本都是Scala写的.我们这里使用Ja ...

  9. 韦东山freeRTOS系列教程之【第九章】任务通知(Task Notifications)

    目录 系列教程总目录 概述 9.1 任务通知的特性 9.1.1 优势及限制 9.1.2 通知状态和通知值 9.2 任务通知的使用 9.2.1 两类函数 9.2.2 xTaskNotifyGive/ul ...

  10. 韦东山freeRTOS系列教程之【第五章】队列(queue)

    目录 系列教程总目录 概述 5.1 队列的特性 5.1.1 常规操作 5.1.2 传输数据的两种方法 5.1.3 队列的阻塞访问 5.2 队列函数 5.2.1 创建 5.2.2 复位 5.2.3 删除 ...