官方:

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. linux系统下,redis如何设置密码

    1.命令方式 首先查看下密码是否存在,发现并未设置为空. -bash-4.2# cd /usr/local/redis-6.2.6/src -bash-4.2# ./redis-cli 127.0.0 ...

  2. winform遍历控件的Controls.OfType<>方法

    页面TextBox控件较多时,可以使用类似的名字,方便遍历时整体的修改,可以使用Controls.OfType<TextBox>()获取所有文本框: 需要引用命名空间System.Linq ...

  3. OAuth + Security - 7 - 异常翻译

    认证异常翻译 默认情况下,当我们在获取令牌时输入错误的用户名或密码,系统返回如下格式响应: { "error": "invalid_grant", " ...

  4. 网站_域名_DNS_端口_web访问过程

    网站基本概念 服务器:能够提供服务器的机器,取决于机器上所安装的服务软件 web服务器:提供web服务(网站访问),需要安装web服务软件,Apache,tomcat,iis等 域名 (Domain ...

  5. Linux 内核:GPIO子系统(1)软件框架

    Linux 内核:GPIO子系统(1)软件框架 背景 在很多驱动开发中,GPIO用得很多,因此学习一下:也会顺便看看pinctrl 子系统. 原文(有删改):http://www.wowotech.n ...

  6. IEC103设备数据 转 IEC61850项目案例

    目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关采集103设备数是 2 5 用IEC61850协议转发数据 4 6 网关使用多个逻辑设备和逻辑节点的方法 ...

  7. MSSQL慢查询查询与统计

    查询MSSQL慢查询: SELECT TOP 20 TEXT AS 'SQL Statement',last_execution_time AS 'Last Execution Time' ,(tot ...

  8. C语言gcc编译环境搭建

    第一步,根据以下链接下载gcc工具包: gcc工具包下载地址: 链接:https://pan.baidu.com/s/1JqEjakTcWLPv7p6zkah6sA提取码:k4d2 第二步,将下载好的 ...

  9. VulnHub_DC-1渗透流程

    DC-1 DC-1 是一个专门建造的易受攻击的实验室,目的是在渗透测试领域获得经验. 它旨在为初学者提供挑战,但它的难易程度取决于您的技能和知识,以及您的学习能力. 要成功完成此挑战,您将需要 Lin ...

  10. 洛谷P2864

    来一发在洛谷的第一篇题解 解析 首先从原点出发回到原点会形成一个环 要计算在环上的路程,首先我们要破环 利用建墙法破环 可以选取任意一个边缘上的树,往上或者往下或者往左往右建立一堵墙'|' 这样利用b ...