谷歌发布AutoGraph,自动将Python转化为TF图
项目地址:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/autograph
一般而言,在写 TensorFlow 代码时,我们需要构建整个算法的计算图,或者规划所有数据流的计算过程,然后再投入数据并快速执行整个或局部计算图。当然因为当前 PyTorch 和 Keras 等动态计算图的流行,TensorFlow 也发布了 Eager Execution,它可以帮助用户自动构建计算图。但一般的 TensorFlow 还是常使用静态计算图的方式,因为它的构建逻辑与部署都非常有优势。
然而对于入门开发者而言,理解静态计算图是比较困难的,因此很容易引起开发者的困惑。尤其是在一些涉及更复杂模型场景中,例如使用 if 和 while 等 Python 语句,或使用 print() 与接受结构化输入等,它们都会引起我们对计算图的困惑。
所以为什么 TensorFlow 需要使用计算图呢?计算图允许各种各样的优化,例如移除公共的子表达式和内核融合等。此外,计算图简化了分布式训练和部署时的环境配置,因此它们可被视为一种独立于平台的模型计算形式。这一特性对于在多 GPU 或 TPU 上的分布式训练极其重要,当然基于 TensorFlow Lite 在移动端和 IoT 上部署模型也非常重要。
以下是一个非常简单的操作示例:
def huber_loss(a): if tf.abs(a) <= delta: loss = a * a / 2 else: loss = delta * (tf.abs(a) - delta / 2) return loss
使用 Eager Execution,这只是「正确运行」而已,但是此类操作可能会比较慢,因为 Python 解释器众所周知在实现地比较慢,且需要的计算比较复杂,这会令它错过许多程序优化的机会。
为了给图执行做好准备,你需要重写代码,使用 tf.cond() 等语句,但是这很繁琐且难以实现。AutoGraph 可以自动完成该转换,保持 Eager 编程的简易性,同时还提升了计算图执行的性能。
在该示例中,我们可以使用 autograph.convert() 布置我们的函数,AutoGraph 将自动生成图可用的代码。
使用 AutoGraph,由于 decorator,下列代码:
@autograph.convert()def huber_loss(a): if tf.abs(a) <= delta: loss = a * a / 2 else: loss = delta * (tf.abs(a) - delta / 2) return loss
在执行时变成如下代码:
def tf__huber_loss(a): with tf.name_scope('huber_loss'): def if_true(): with tf.name_scope('if_true'): loss = a * a / 2 return loss, def if_false(): with tf.name_scope('if_false'): loss = delta * (tf.abs(a) - delta / 2) return loss, loss = ag__.utils.run_cond(tf.less_equal(tf.abs(a), delta), if_true, if_false) return loss
接下来,你可以调用你的代码,就像使用一般的 TensorFlow op 一样:
with tf.Graph().as_default(): x_tensor = tf.constant(9.0) # The converted function works like a regular op: tensors in, tensors out. huber_loss_tensor = huber_loss(x_tensor) with tf.Session() as sess: print('TensorFlow result: %2.2f\n' % sess.run(huber_loss_tensor))
如你所见,AutoGraph 连接起 Eager execution 和 Graph。AutoGraph 使用 Eager-style 的 Python 代码,然后将其转换成图生成代码。
AutoGraph 不只是有用宏命令的集合,它还可以使用源代码转换来覆写 Python 语言的任意部分,包括控制流、函数应用和分配,生成样板代码,重构惯用 Python,以使转换成图的过程变得简单。
使用任意编译器,都会对错误信息可读性产生担忧;为此,AutoGraph 可以创建错误信息,并堆叠揭示原始源代码中错误来源的多个轨迹,而不是仅仅显示生成代码的 reference。
可运行示例
那么,AutoGraph 可以为我们做什么呢?以下有一些示例代码,它们可以直接转换为图代码而不需要任何的改写。如果你想实际运行这些操作,谷歌在这个 GitHub 的 Colab 中提供了一个 notebook 可供使用。
GitHub:https://github.com/tensorflow/models/blob/master/samples/core/guide/autograph.ipynb
Colab:https://colab.research.google.com/github/tensorflow/models/blob/master/samples/core/guide/autograph.ipynb
以下我们使用循环和分支来测试「科拉兹猜想」。注意,考虑到多样性,我们将不使用 decorator,而使用 AutoGraph 的.to_graph() 函数将其转换为图。
def collatz(a): counter = 0 while a != 1: if a % 2 == 0: a = a // 2 else: a = 3 * a + 1 counter = counter + 1 return countergraph_mode_collatz = autograph.to_graph(collatz)# The code is human-readable, tooprint(autograph.to_code(collatz))collatz_tensor = graph_mode_collatz(tf.constant(n))
AutoGraph 可以支持任意的嵌套控制流,例如:
def f(n): if n >= 0: while n < 5: n += 1 print(n) return n
AutoGraph 允许你在循环中添加元素到数组中。为了让其工作,我们使用一些 AutoGraph 辅助工具,set_element_type 和 stack。
def f(n): z = [] # We ask you to tell us the element dtype of the list autograph.set_element_type(z, tf.int32) for i in range(n): z.append(i) # when you're done with the list, stack it # (this is just like np.stack) return autograph.stack(z)
我们还支持 break、continue,甚至 print 和 assert 等语句。当转换完成后,这个片段的 Python assert 使用合适的 tf.Assert 将其转换为 TensorFlow 计算图。
def f(x): assert x != 0, 'Do not pass zero!' return x * x
具备轻易地添加循环、控制流等到图上的能力意味着可以很容易将训练循环转移到图中。可以在这个 Colab 的 notebook 中找到一个示例,其中使用了一个 RNN 训练循环,并用一个 sess.run() 调用来执行它。当你需要传递一个完整的训练循环到加速器时,这很有用,比通过 CPU 控制器管理训练过程更好。
AutoGraph 打开了构建和训练模型的新思路。谷歌在未来将基于开发者社区建议尝试添加更多的功能到 AutoGraph 上,请提出你的建议吧!
提建议:https://github.com/tensorflow/tensorflow/issues
Graph Performance 对比 Eager Execution
Eager Execution 相当合用,但图更快。尽管对比基准较为复杂(由应用以及硬件配置决定),但在一些简单示例中我们可以看到,当从 Eager 转换到 AutoGraph 代码时有极大的加速,使用了大量 if 和 while 等语句。
最终,AutoGraph 让你可以在 GPU 和 Cloud TPU 这样的加速器硬件上使用动态和流控制极严模型,这对在大量数据上训练大型模型非常有帮助。
AutoGraph 和 Eager Execution
虽然使用 Eager Execution,你也能通过 tf.contrib.eager.defun 对部分代码根据计算图执行。但这需要你使用 tf.cond() 这样计算图类的 TensorFlow ops。未来,AutoGraph 将无缝与 defun 融合,让你用简单的 eager-style Python 编写图代码。当成为现实时,通过选择性的把 eager 代码转换到图分段,你就可以期待使用 AutoGraph 加速热点了。
结论
AutoGraph 能够让你轻松的建立在 TensorFlow 图中轻松运行的直观性、复杂模型。这是目前在 contrib 中运行的实验性工具,但我们期望能够尽快把它加入到 TensorFlow 核心。
原文链接:https://medium.com/tensorflow/autograph-converts-python-into-tensorflow-graphs-b2a871f87ec7
本文来源:深港财经责任编辑:佚名
本文仅代表作者个人观点,与本网站立场无关。云掌财经对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证,请读者仅作参考,并请自行核实相关内容。
-
【 景气度处于高位 机械板块估值修复可期 】 近期,工程机械板块跟随市场调整,走势一般,但行业景气度仍在高位运行。有分析人士认为,随着基础设施建设不断发力,产品更新换代需求及出口持续向好等,工程机械行业持续火热,行业整体盈利水平逐步上升。基于业绩确定性,工程机械板块仍是后市关注重点。(中国证券报)
2018-10-13 -
【聚焦“ABC” 互联网争霸进入下半场】日前,港股上市公司腾讯控股6年来首次宣布调整内部构架,新成立云与智慧产业事业群、平台与内容事业群,并压缩原有事业群。外界解读公司此举是为了将人工智能、大数据和云计算提升到更核心的战略位置。事实上,不仅腾讯,国内百度、小米、阿里巴巴,国外谷歌、亚马逊等互联网巨头近年均调整组织架构,意在适应“ABC”变革。分析人士称,“ABC”已成互联网巨头决胜下半场的关键。
2018-10-13 -
【证监会:受理首发及发行存托凭证企业271家 已过会32家未过会239家】证监会披露的数据显示,截至10月11日,中国证监会受理首发及发行存托凭证企业271家,其中已过会32家,未过会239家。未过会企业中正常待审企业217家,中止审查企业22家。
2018-10-13 -
【 聚焦“ABC” 互联网争霸进入下半场 】 日前,港股上市公司腾讯控股6年来首次宣布调整内部构架,新成立云与智慧产业事业群、平台与内容事业群,并压缩原有事业群。外界解读公司此举是为了将人工智能(AI)、大数据(BIG DATA)和云计算(CLOUD)提升到更核心的战略位置。事实上,不仅腾讯,国内百度、小米、阿里巴巴,国外谷歌、亚马逊等互联网巨头近年均调整组织架构,意在适应“ABC”变革。分析人士称,“ABC”已成互联网巨头决胜下半场的关键。(中国证券报)
2018-10-13 -
【 证监会:受理首发及发行存托凭证企业271家 已过会32家未过会239家 】 证监会披露的数据显示,截至10月11日,中国证监会受理首发及发行存托凭证企业271家,其中已过会32家,未过会239家。未过会企业中正常待审企业217家,中止审查企业22家。
2018-10-13 -
【逢低吸筹茅台格力等 北向资金昨日净流入10.73亿元】 北向资金节后开盘以来的浓厚避险情绪,终于在本周最后一个交易日有所缓解。伴随着A股的止跌反弹,截至12日收盘,借道沪股通、深股通的境外资金合计净流入10.73亿元,一举扭转了此前连续大幅净卖出的局面。曾遭北向资金大幅抛售的活跃标的个股,也悉数恢复了净流入态势。本周前4个交易日遭净卖出9208万元的格力电器,周五获净买入1.56亿元。洋河股份、泸州老窖和大华股份周五也获得小幅净流入。
2018-10-13 -
【中证报:悲观预期必将修正 优质资产终会引领风潮】突如其来的海外市场动荡,打乱了A股9月下旬发动的上行攻势。在“过山车”似的走势背后,当下A股市场对利空的敏感暴露无遗,本质上这是经济悲观预期作祟。国际经济金融形势更加错综复杂,然而经过今年以来的逐步调整,A股对潜在风险的反映已经比较充分。优质资产在超跌之后,终将迎来修复契机。
2018-10-13 -
【财政部表态减税力度将扩大 增值税税率调整随时出台】据悉,对于增值税改革的工作,目前相关部门也已启动,包括税率合并以及下调等事宜都在进行测算。“此前税务机关曾找第三方机构测算税率下调后的影响,因此年内有可能随时出台政策。”一位税务系统人士判断。(中国经营报)
2018-10-13 -
【墨西哥经济部长:将寻求获得加拿大钢铝产品保护性措施的豁免】墨西哥经济部长瓜哈尔多表示,将致电加拿大方面,寻求获得加拿大钢铝产品保护性措施的豁免;预计加拿大的钢铝产品贸易保护性措施将给墨西哥钢铝出口带来2亿美元影响。
2018-10-13 -
【9月房企融资成本达2017年下半年以来峰值】据不完全统计,2018年1-9月典型85家房企融资总额8287亿元,同比减少11%。43%的房企融资额同比有所减少。下半年以来TOP50之后有发债的房企只有5家,中小企业融资难问题更加显著。从单月来看,2018年春节以来房企的各月平均融资成本,除6月外,基本都较上年同期有所增加。9月整体融资成本反弹至6.91%,达到去年下半年以来的最高值,房企融资成本的增加预计将进一步限制融资规模的增长。(克而瑞地产研究)
2018-10-13