Jax计算框架的JIT编译的static特性
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特性的更多相关文章
- 你的java 代码对JIT编译友好吗?
JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...
- 你的Java代码对JIT编译友好么?(转)
JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...
- 【Java】实战Java虚拟机之五“开启JIT编译”
今天开始实战Java虚拟机之五“开启JIT编译” 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Ja ...
- Storm实时计算框架的编程模式
storm分布式流式计算框架. nimbus:主进程服务(职责就是任务的分配的,程序的分发) supervisor:工作进程服务(职责就是启动线程池,接受任务,运行任务,报告任务的运行状态) 注意容错 ...
- 开源图计算框架GraphLab介绍
GraphLab介绍 GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架.框架使用C++语言开发实现. 该框架是面向机器学习( ...
- Storm 流式计算框架
1. 简介 是一个分布式, 高容错的 实时计算框架 Storm进程常驻内存, 永久运行 Storm数据不经过磁盘, 在内存中流转, 通过网络直接发送给下游 流式处理(streaming) 与 批处理( ...
- 90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(1)- JIT编译优化
麻烦大家帮我投一票哈,谢谢 经常听到 Java 性能不如 C/C++ 的言论,也经常听说 Java 程序需要预热,那么其中主要原因是啥呢? 面试的时候谈到 JVM,也有很多面试官喜欢问,为啥 Java ...
- 实时计算框架:Flink集群搭建与运行机制
一.Flink概述 1.基础简介 Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算.Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算.主要特性包 ...
- javac 编译与 JIT 编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- Storm分布式实时流计算框架相关技术总结
Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...
随机推荐
- The solution of P5339
problem 容斥好题,结果题解里面一堆 \(\text{NTT}\). 如果我们去掉有多少个人喜欢什么东西的条件,那么这个题就直接枚举有 \(i\) 组同学会一起讨论蔡徐坤.这一个问题十分容易. ...
- 【INFINI Workshop 深圳站】8 月 31 日一起动手实验玩转 Easysearch
8 月 31 日下午 和 INFINI Labs 的技术专家面对面,第一时间了解极限实验室的发布最新产品和功能特性,通过动手实战,快速掌握最前沿的搜索技术,并用于实际项目中.欢迎大家免费报名参加. 活 ...
- fontawesome-webfont.woff:1 Failed to load resource: the server responded with a status of 404 ()
fontawesome-webfont.woff2:1 Failed to load resource: the server responded with a status of 404 ()fon ...
- 增补博客 第三篇 python 英文统计
编写程序实现对特定英文文章(文本文件)的单词数和有效行数的统计,其中要求空行不计数: def count_words_and_lines(file_path): word_count = 0 line ...
- java堆和栈有哪些区别
java堆和栈有哪些区别 Java堆和栈是Java虚拟机(JVM)中的两个重要概念,它们在内存管理.存储对象和执行线程等方面有明显的区别. 1.内存分配和管理Java堆是动态分配的内存区域,主要用来存 ...
- 浅拷贝、深拷贝与序列化【初级Java必需理解的概念】
浅拷贝 首先创建两个类,方便理解浅拷贝 @Data class Student implements Cloneable{ //年龄和名字是基本属性 private int age; private ...
- uniapp windows 上架 apple store
香蕉云 蒲公英 ios上架助手iOS Development 开发!先用上架助手在certificates里面生成一个p12文件在profiles里面生成mobileprovision文件就欧克了 需 ...
- Nginx配置文件nginx.conf中location的匹配原则
一.空格:默认匹配.普通匹配 location / { root /home; } 二.= :精确匹配(表示匹配到 /home/resources/img/face.png 这张图片) locati ...
- 高通 LK阶段配置使用I2C-8
以MSM8953为例. 原文(有删改):https://blog.csdn.net/qq_29890089/article/details/108294710 项目场景 因为项目需要,需要在高通MSM ...
- 使用getevent在Android中调试输入子系统
# Android getevent用法详解 背景 在调试安卓设备按键,想使用hexdump,但是发现没有找到,反而找到了这个更好用的工具. 以下是我的调试片段 # getevent -l /dev/ ...