0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TF动态图处理速度大幅提升!

DPVg_AI_era 来源:未知 作者:李倩 2018-07-20 10:07 次阅读

TensorFlow发布重大功能改进AutoGraph,能自动将Python代码转换为TensorFlow Graph,TF动态图处理速度大幅提升!

今天,TensorFlow团队发布新功能“AutoGraph”,能自动将Python代码(包括控制流,print () 和其他Python原生特征)转换为纯TensorFlow图代码(pure TensorFlow graph code)。

不使用Eager Execution编写TensorFlow代码需要进行一些元编程(metaprogramming) ——先编写一个创建图(Graph)的程序,稍后再执行这个Graph。这可能令人困惑,尤其是对开发者新手来说。一些特别棘手的情况涉及更复杂的模型,比如要使用 if 和 while 的模型,或者有 print () 等副作用或接受结构化输入的模型。

为什么我们需要Graph呢?Graph允许各种优化,例如删除常见的子表达式和融合内核(fusing kernel)。再者,Graph简化了分布式训练和部署到各种环境的过程,因为它们形成了独立于平台的模型计算过程。这对于模型在多个GPU或TPU上的分布式训练尤为重要,如果你通过TensorFlow Lite、移动端、物联网等其他平台分发模型,Graph也很重要。

下面是一个很简单的、你可能希望添加到Graph里的操作:

defhuber_loss(a):iftf.abs(a)<= delta:    loss = a * a / 2  else:    loss = delta * (tf.abs(a) - delta / 2)  return loss

通过Eager Execution,只是能做到这一点,但是由于Python解释器开销(interpreter overheads)或错过的程序优化机会,此类操作可能会很慢。

为了准备执行Graph,你需要重写这个以使用像 tf.cond () 这样的结构,但那样实现起来可能会耗时耗力而且很困难。AutoGraph可以为自动执行此类转换,将动态图编程的简易性保持很低的同时,获得基于Graph执行的性能优势。

在示例中,我们可以使用 autograph.convert () 来修饰函数,AutoGraph将自动生成 graph-ready 的代码。

使用AutoGraph,这段代码:

@autograph.convert()defhuber_loss(a):iftf.abs(a)<= delta:    loss = a * a / 2  else:    loss = delta * (tf.abs(a) - delta / 2)  return loss

在执行时将变成这种样子:

deftf__huber_loss(a):withtf.name_scope('huber_loss'):defif_true():withtf.name_scope('if_true'):loss=a*a/2returnloss,defif_false():withtf.name_scope('if_false'):loss=delta*(tf.abs(a)-delta/2)returnloss,loss=ag__.utils.run_cond(tf.less_equal(tf.abs(a),delta),if_true,if_false)returnloss

你可以直接调用代码,就像TensorFlow op一样:

withtf.Graph().as_default():x_tensor=tf.constant(9.0)#Theconvertedfunctionworkslikearegularop:tensorsin,tensorsout.huber_loss_tensor=huber_loss(x_tensor)withtf.Session()assess:print('TensorFlowresult:%2.2f '%sess.run(huber_loss_tensor))

综上,AutoGraph填补了Eager Execution和Graph之间的空白。AutoGraph 将你的 eager-style Python 代码自动转换为动态图生成(graph-generating)代码。

AutoGraph不仅仅是一组有用的宏指令(macro); 它涵盖Python语言的任何部分(利用源代码转换),包括控制流、函数应用程序和赋值、生成模板代码以及重构常用的Python让它易于转换为图形。

对于任何编译器,都会担心报错信息的可读性; 为此,AutoGraph创建了报错消息和堆栈跟踪,用来显示原始源代码中的错误源,而不仅仅是显示对生成的代码的参考。

可运行的例子

那么,AutoGraph可以为你做什么呢? 以下是一些代码示例,它可以直接转换为图形代码而无需任何更改。 如果你想查看完整的代码,我们有一个notebook,你可以在Colab或GitHub上查看。

在这里,我们使用循环和分支检测Collatz猜想。 注意,我们使用AutoGraph的.to_graph()函数将其转换为图形的原因,是为了多样性而不是为了装饰。

defcollatz(a):counter=0whilea!=1:ifa%2==0:a=a//2else:a=3*a+1counter=counter+1returncountergraph_mode_collatz=autograph.to_graph(collatz)#Thecodeishuman-readable,tooprint(autograph.to_code(collatz))collatz_tensor=graph_mode_collatz(tf.constant(n))

AutoGraph可以支持任意嵌套控制流,例如:

deff(n):ifn>=0:whilen< 5:      n += 1      print(n)  return n

AutoGraph允许你将元素追加到循环内的数组中。 为了达到这个要求,我们使用一些AutoGraph助手,例如set_element_type和stack。

deff(n):z=[]#Weaskyoutotellustheelementdtypeofthelistautograph.set_element_type(z,tf.int32)foriinrange(n):z.append(i)#whenyou'redonewiththelist,stackit#(thisisjustlikenp.stack)returnautograph.stack(z)

我们还支持像break,continue,甚至print和assert这样的结构。 转换后,该片段的Python将转换为图形(使用恰当的tf.Assert)。

deff(x):assertx!=0,'Donotpasszero!'returnx*x

能够轻松地添加循环,控制流程以及更多图表意味着可以轻松地将训练循环移动到图形中。 这个例子可以在这个notebook中找到,我们采用RNN训练循环并用一个sess.run()调用执行它。 在需要将整个训练循环传递给加速器而不是通过CPU控制器管理训练的情况下,这可能是很有用的。

AutoGraph开辟了构建和训练模型的新思路。我们期待根据开发者社区的建议为AutoGraph添加更多功能,所以请提出你的建议和问题吧!

AutoGraph和Eager Execution

在使用eager execution时,你仍然可以通过tf.contrib.eager.defun对代码的某些部分使用图执行。这要求你使用TensorFlow图形操作,如tf.cond()。 将来,AutoGraph将与defun无缝集成,以允许在简单的eager 风格的Python中创作图形代码。 当该实现可用时,你可以通过选择性地将eager代码转换为graph fragments来使用AutoGraph加速热点。

结论

AutoGraph是一款工具,可让你轻松构建直观,复杂的模型,在TensorFlow图中轻松运行。 这是一个现在在contrib中的实验工具,但我们希望尽快将其转移到核心TensorFlow中。

告诉我们您使用AutoGraph的经历! 如果你有反馈,建议或想法,请提交问题并向TensorFlow开发人员小组发送消息。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4536

    浏览量

    66496
  • Graph
    +关注

    关注

    0

    文章

    35

    浏览量

    8798
  • python
    +关注

    关注

    51

    文章

    4657

    浏览量

    83379

原文标题:【TensorFlow重大升级】自动将Python代码转为TF Graph,大幅简化动态图处理!

文章出处:【微信号:AI_era,微信公众号:新智元】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在网上看到泰克,rigol,安泰信测试1M的信号的动态图,大....

    我在网上看到了一张动态图,里边有泰克,rigol,安泰信的测试动态图。然后我就测试了一下我手头上的青岛汉泰的台式示波器DSO5202B,不会制作动态图,只能是截图让大家看看了,求告诉测试方法是否正确??稍后上图
    发表于 01-15 11:00

    lab如何加入动态图,。。。。。。。

    lab如何加入动态图,。。。。。。。lab如何加入动态图,。。。。。。。lab如何加入动态图,。。。。。。。
    发表于 10-30 10:33

    matlab用plot画动态图

    matlab用plot画动态图时,总是一闪一闪的,图形还不连续,大家有什么办法让它连续画出动态图
    发表于 08-23 11:26

    令人惊艳的机械原理动态图,美翻了!(多,流量party谨慎)

    过程中保持方向不变7.阿基米得氏曲线驱动机8.锥面摩擦变速器9.日内瓦结构内部10.将中断旋转变为连续旋转  另外还有热心金粉为我们提供的机械动态图,简直太美了!球齿机机构冲击夹持机构滚珠丝杠传动机构齿轮传动
    发表于 08-24 10:54

    用LEON3开源软核处理器怎么才可以设计一个动态图像边缘检测

      本文介绍了基于LEON3开源软核处理器的动态图像边缘检测SoC设计。  实验结果表明该SoC系统工作正常,可以实现每秒22~25帧,最佳分辨率为400×240和640×480的动态图像边缘检测
    发表于 02-22 07:50

    请问为什么动态图对滑动手势没有反应?

    因此,假设我们设置了一个包含以下内容的滑动容器:普通容器包含例如一个盒子动态图当我们运行时,首先会显示普通容器。轻扫后,它将转到动态图。但是当我们滑动动态图的时候,它不会去到正常的容器。为什么这样?如果我将
    发表于 12-30 07:30

    使用动态图时X轴的值增加了怎么解决?

    嗨,我的问题是,当我使用动态图时,当它在X轴上结束时,不幸的是X值增加了如何解决这个问题并从头开始重新启动X轴?
    发表于 01-05 06:13

    使用STM32F469I-Disco板动态图显示数据没有响应怎么办?

    我使用 STM32F469I-Disco 和 TouchGFX 对我的项目进行了很好的设置。一切都运作良好。但是,我想使用动态图显示数据。如果我选择不同于滚动模式的模式,一切都会更新得很好。但是当
    发表于 01-05 06:40

    基于门限方案的动态图软件水印算法

    针对动态图水印鲁棒性和恢复率较低的问题,提出基于门限方案的动态图水印算法——AB算法。在软件水印中引入密钥共享思想,实验结果证明,该算法能有效弥补CT算法的缺陷,阻
    发表于 04-03 08:36 15次下载

    C#教程之动态图标显示

    C#教程之动态图标显示,很好的C#资料,快来学习吧。
    发表于 04-20 14:30 28次下载

    机械原理动态图大全介绍

    本文档内容介绍了基于机械原理动态图大全介绍。
    发表于 09-19 15:27 92次下载

    智能型动态图像的追踪自控车

    智能型动态图像的追踪自控车
    发表于 10-31 09:44 10次下载
    智能型<b class='flag-5'>动态图</b>像的追踪自控车

    周期性动态图像的傅里叶表达

    为了生成新颖的艺术效果,提出了周期性动态图像模型,其每个像素都是一个时域周期函数。首先,提出了周期性动态图像的傅里叶表达,具体是将图像中每个像素对应的周期函数以一系列傅里叶系数来表达,并在实时
    发表于 01-05 10:19 1次下载
    周期性<b class='flag-5'>动态图</b>像的傅里叶表达

    电气控制原理动态图分享

    本文主要分享了几种电气控制原理动态图,具体的跟随小编一起来了解一下。
    的头像 发表于 09-24 11:52 1w次阅读
    电气控制原理<b class='flag-5'>动态图</b>分享

    新唐Arm9微处理器降低CPU负担同时大幅提升加解密速度的秘密

    新唐Arm9微处理器降低CPU负担同时大幅提升加解密速度的秘密
    的头像 发表于 08-10 11:29 487次阅读
    新唐Arm9微<b class='flag-5'>处理</b>器降低CPU负担同时<b class='flag-5'>大幅</b><b class='flag-5'>提升</b>加解密<b class='flag-5'>速度</b>的秘密