XLA(Accelerated Linear Algebra),线性代数领域专用编译器(demain-specific compiler),优化TensorFlow计算。即时(just-in-time,JIT)编译或提前(ahead-of-time,AOT)编译实现XLA,有助于硬件加速。XLA还在试验阶段。https://www.tensorflow.org/versions/master/experimental/xla/ 。

XLA优势。线性代数领域专用编译器,优化TensorFlow计算的执行速度(编译子图减少生命周期较短操作执行时间,融合管道化操作减少内存占用)、内存使用(分析、规划内存使用需求,消除许多中间结果缓存)、自定义操作依赖(提高自动化融合底层操作low-level op性能,达到手动融合自定义操作custom op效果)、移动端内存占用(提前AOT编译子图减少TensorFlow执行时间,共享头文件对被其他程序直接链接)、可移植性方面(为新硬件开发新后端,TensorFlow不需要更改很多代码用在新硬件设备上)。

XLA工作原理。LLVM编译器框架系统,C++编写,优化任意编程语言缩写程序编译时间(compile time)、链接时间(link time)、运行时间(run time)、空闲时间(idle time)。前端解析、验证、论断输入代码错误,解析代码转换LLVM中间表示(intermdediate representation,IR)。IR分析、优化改进代码,发送到代码生成器,产生本地机器代码。三相设计LLVM实现。最重要,LLVM IR。编译器IR表示代码。C->Clang C/C++/ObjC前端、Fortran->llvm-gcc前端、Haskell->GHC前端 LLVM IR-> LLVM 优化器 ->LLVM IR LLVM X86后端->X86、LLVM PowerPC后端->PowerPC、LLVM ARM后端->ARM。http://www.aosabook.org/en/llvm.html 。
XLA输入语言HLO IR,XLA HLO定义图形,编译成各种体系结构机器指令。编译过程。XLA HLO->目标无关优化分析->XLA HLO->XLA后端->目标相关优化分析->目标特定代码生成。XLA首先进行目标无关优化分析(公共子表达式消除common subexpression elimination CSE,目标无关操作融合,运行时内存缓冲区分析)。XLA将HLO计算发送到后端。后端执行进一步HLO级目标不相关优化分析。XLA GPU后端执行对GPU编程模型有益操作融合,确定计算划分成流。生成目标特定代码。XLA CPU、GPU后端用LLVM中间表示、优化、代码生成。后端用LLVM IR表示XLA HLO计算。XLA 支持x86-64、NVIDIA GPU JIT编译,x86-64、ARM AOT编译。AOT更适合移动、嵌入式深度学习应用。

JIT编译方式。XLA编译、运行TensorFlow计算图一部分。XLA 将多个操作(内核)融合到少量编译内核,融合操作符减少存储器带宽提高性能。XLA 运行TensorFlow计算方法。一,打开CPU、GPU设备JIT编译。二,操作符放在XLA_CPU、XLA_GPU设备。
打开JIT编译。在会话打开。把所有可能操作符编程成XLA计算。

config = tf.ConfigProto()
config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1
sess = tf.Session(config=config)
为一个或多个操作符手动打开JIT编译。属性_XlaCompile = true标记编译操作符。

jit_scope = tf.contrib.compiler.jit.experimental_jit_scope
x = tf.placeholder(np.float32)
with jit_scope():
y = tf.add(x, x)
操作符放在XLA设备。有效设备XLA_CPU、XLA_GPU:

with tf.device("/job:localhost/replica:0/task:0/device:XLA_GPU:0"):
output = tf.add(input1, input2)

JIT编译MNIST实现。https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax_xla.py 。
不使用XLA运行。

python mnist_softmax_xla.py --xla=false
运行完成生成时间线文件timeline.ctf.json,用Chrome跟踪事件分析器 chrome://tracing,打开时间线文件,呈现时间线。左侧列出GPU,可以看操作符时间消耗情况。
用XLA训练模型。

TF_XLA_FLAGS=--xla_generate_hlo_graph=.* python mnist_softmax_xla.py
XLA框架处于试验阶段,AOT主要应用场景内存较小嵌入式设备、手机、树莓派。

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import argparse
import sys
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from tensorflow.python.client import timeline
FLAGS = None
def main(_):
# Import data
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)
# Create the model
x = tf.placeholder(tf.float32, [None, 784])
w = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.matmul(x, w) + b
# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])
# The raw formulation of cross-entropy,
#
# tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.nn.softmax(y)),
# reduction_indices=[1]))
#
# can be numerically unstable.
#
# So here we use tf.nn.softmax_cross_entropy_with_logits on the raw
# outputs of 'y', and then average across the batch.
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
config = tf.ConfigProto()
jit_level = 0
if FLAGS.xla:
# Turns on XLA JIT compilation.
# 开启XLA JIT编译
jit_level = tf.OptimizerOptions.ON_1
config.graph_options.optimizer_options.global_jit_level = jit_level
run_metadata = tf.RunMetadata()
sess = tf.Session(config=config)
tf.global_variables_initializer().run(session=sess)
# Train
# 训练
train_loops = 1000
for i in range(train_loops):
batch_xs, batch_ys = mnist.train.next_batch(100)
# Create a timeline for the last loop and export to json to view with
# chrome://tracing/.
# 在最后一次循环创建时间线文件,用chrome://tracing/打开分析
if i == train_loops - 1:
sess.run(train_step,
feed_dict={x: batch_xs,
y_: batch_ys},
options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE),
run_metadata=run_metadata)
trace = timeline.Timeline(step_stats=run_metadata.step_stats)
with open('timeline.ctf.json', 'w') as trace_file:
trace_file.write(trace.generate_chrome_trace_format())
else:
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
# Test trained model
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy,
feed_dict={x: mnist.test.images,
y_: mnist.test.labels}))
sess.close()
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'--data_dir',
type=str,
default='/tmp/tensorflow/mnist/input_data',
help='Directory for storing input data')
parser.add_argument(
'--xla', type=bool, default=True, help='Turn xla via JIT on')
FLAGS, unparsed = parser.parse_known_args()
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

参考资料:
《TensorFlow技术解析与实战》

欢迎推荐上海机器学习工作机会,我的微信:qingxingfengzi

学习笔记TF062:TensorFlow线性代数编译框架XLA的更多相关文章

  1. tensorflow学习笔记——使用TensorFlow操作MNIST数据(2)

    tensorflow学习笔记——使用TensorFlow操作MNIST数据(1) 一:神经网络知识点整理 1.1,多层:使用多层权重,例如多层全连接方式 以下定义了三个隐藏层的全连接方式的神经网络样例 ...

  2. X-Cart 学习笔记(二)X-Cart框架1

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 四.X- ...

  3. X-Cart 学习笔记(三)X-Cart框架2

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 3.了解 ...

  4. go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量

    go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量 下载安装:go get github.com/astaxie/beego 首页 - beego: 简约 & 强大并存 ...

  5. .NET MVC 学习笔记(二)— Bootstrap框架

    二..NET MVC 学习笔记(一)—— Bootstrap框架 在实际开发过程中,页面的样式问题是让人很头疼的问题,良好的用户界面可以大大提高用户体检,而在你没有前端开发人员的火力支援情况下,并不是 ...

  6. tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)

    续集请点击我:tensorflow学习笔记——使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...

  7. 大数据学习笔记——Java篇之集合框架(ArrayList)

    Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...

  8. 【转】Ant学习笔记——自己构建Ant编译环境

    自从年初开始用NetBeans6.0,才接触到Ant. 这是今年6月份的一篇Ant学习笔记.安装 1.下载并构建环境.   去官网下载src包和bin包.解压缩它们到同一目录,运行build.bat, ...

  9. linux 驱动学习笔记01--Linux 内核的编译

    由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...

随机推荐

  1. pip 在win10下安装

    http://blog.csdn.net/yupu56/article/details/50470970C:\Users\sunof\AppData\Local\Programs\Python\Pyt ...

  2. leetcode python 033 旋转数组查找

    ## 假设升序,import random def find(y):    l,m=len(y),0    while l>1:        n=int(l/2)        if y[0] ...

  3. 数据库更新记录时,记录不存在则创建的sql语句

    INSERT INTO 表名 (字段1(主键),字段2,字段3) values (#{value1},#{value2},#{value3}) ON DUPLICATE KEY UPDATE 字段2= ...

  4. Selenium 工作原理

    Selenium是ThoughtWorks公司研发的一个强大的基于浏览器的开源自动化测试工具,它通常用来编写web应用的自动化测试.早期也即Selenium1.x时期主要使用Selenium RC(S ...

  5. 验证GridControl Gridview 单元格。

    一般的验证方法,使用单元格值改变事件.现在记录另一个事件实现验证. 场景:控制当某个单元格的值的长度不能超过10 直接看代码: private void gridViewFileContent_Val ...

  6. 【转】git - 简易指南

    原文链接:http://www.bootcss.com/p/git-guide/ 作者:罗杰·杜德勒 感谢:@tfnico, @fhd and Namics 其他语言 english, deutsch ...

  7. 泊爷带你学go -- 加锁的问题

    package main import ( "fmt" "sync" ) var l sync.Mutex var a string func f() { a ...

  8. border-radius,box-shadow兼容性解决办法

    css3 border-radius不支持IE8/IE7的四种解决方法 标签: cssborder-radius兼容性   时间:2016-07-18 css3 border-radius用于设置HT ...

  9. IPhone微信H5用Video标签播放不了视频

    H5用Video标签播放视频 视频在安卓上可以正常播放,在苹果上却不能播放. 因为用了文件服务站点,而且不支持断点下载 把文件服务改成支持断点下载即可 断点下载参考(C#)

  10. linux之时间设置

    date 显示与设置系统时间 %Y      year %m moth 月 %d day 日期 %H hour 小时 %M      minute   分钟 %S      sec  秒 +%F    ...