官方:

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. 前端使用 Konva 实现可视化设计器(15)- 自定义连接点、连接优化

    前面,本示例实现了折线连接线,简述了实现的思路和原理,也已知了一些缺陷.本章将处理一些缺陷的同时,实现支持连接点的自定义,一个节点可以定义多个连接点,最终可以满足类似图元接线的效果. 请大家动动小手, ...

  2. 开箱即用的Live2d

    安装 npm i @tomiaa/live2d 代码 <template> <div ref="live2dContentRef" id="live2d ...

  3. requests的使用

    准备工作 安装request库 pip install request 实例引入 get方法实现GET请求,返回一个Response对象,存放在变量r中,分别输出响应的类型.状态码.响应体的类型.内容 ...

  4. 在Linux驱动中使用proc子系统

    在Linux驱动中使用proc子系统 背景 proc文件系统是个简单有用的东东:驱动创建一个proc虚拟文件,应用层通过读写该文件,即可实现与内核的交互. 本文适用于3.10以后的内核,v3.10以前 ...

  5. Gmsh 和 FiPy 求解稳态圆柱绕流

    本项目的源码保存在 github 仓库 https://github.com/cjyyx/CFD_Learning/tree/main/CFD软件学习/FiPy/cylinder.如果下载整个目录,可 ...

  6. 【冷启动#2】实用的springboot tutorial入门demo

    跟着官方文档熟悉一遍创建spring工程的步骤 https://spring.io/guides/gs/spring-boot https://juejin.cn/post/7077958723829 ...

  7. Linux开机启动自定义脚本

    方式一:chkconfig命令 首先编写好自启的脚本 /etc/init.d/test.sh #!/bin/sh # chkconfig: 2345 10 90 # 创建个文件 touch /opt/ ...

  8. 你真的了解Java内存模型JMM吗?

    哈喽,大家好,我是世杰. 本文我为大家介绍面试官经常考察的「Java内存模型JMM相关内容」 面试连环call 什么是Java内存模型(JMM)? 为什么需要JMM? Java线程的工作内存和主内存各 ...

  9. Dubbo广播机制源码解读

    总结/朱季谦 先前在测试环境遇到过一个问题,即Dubbo广播机制,在对各个提供者节点进行广播操作过程中,存在最前面的两个节点出现异常的情况,但后边的其他节点仍能正常同步的情况.我以前就知道Dubbo的 ...

  10. 解决方案 | AutoCAD二次开发的ProgID一览表(AutoCAD2004 ~ AutoCAD2024)

    1 图片版本 2 文字版本 AutoCAD产品名 版本号 ProgID AutoCAD 2004 R16 AutoCAD.Application.16 AutoCAD 2005 R16.1 AutoC ...