TensorFlow發(fā)布重大功能改進AutoGraph,能自動將Python代碼轉(zhuǎn)換為TensorFlow Graph,TF動態(tài)圖處理速度大幅提升!
今天,TensorFlow團隊發(fā)布新功能“AutoGraph”,能自動將Python代碼(包括控制流,print () 和其他Python原生特征)轉(zhuǎn)換為純TensorFlow圖代碼(pure TensorFlow graph code)。
不使用Eager Execution編寫TensorFlow代碼需要進行一些元編程(metaprogramming) ——先編寫一個創(chuàng)建圖(Graph)的程序,稍后再執(zhí)行這個Graph。這可能令人困惑,尤其是對開發(fā)者新手來說。一些特別棘手的情況涉及更復雜的模型,比如要使用 if 和 while 的模型,或者有 print () 等副作用或接受結(jié)構化輸入的模型。
為什么我們需要Graph呢?Graph允許各種優(yōu)化,例如刪除常見的子表達式和融合內(nèi)核(fusing kernel)。再者,Graph簡化了分布式訓練和部署到各種環(huán)境的過程,因為它們形成了獨立于平臺的模型計算過程。這對于模型在多個GPU或TPU上的分布式訓練尤為重要,如果你通過TensorFlow Lite、移動端、物聯(lián)網(wǎng)等其他平臺分發(fā)模型,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)或錯過的程序優(yōu)化機會,此類操作可能會很慢。
為了準備執(zhí)行Graph,你需要重寫這個以使用像 tf.cond () 這樣的結(jié)構,但那樣實現(xiàn)起來可能會耗時耗力而且很困難。AutoGraph可以為自動執(zhí)行此類轉(zhuǎn)換,將動態(tài)圖編程的簡易性保持很低的同時,獲得基于Graph執(zhí)行的性能優(yōu)勢。
在示例中,我們可以使用 autograph.convert () 來修飾函數(shù),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
在執(zhí)行時將變成這種樣子:
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
你可以直接調(diào)用代碼,就像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 代碼自動轉(zhuǎn)換為動態(tài)圖生成(graph-generating)代碼。
AutoGraph不僅僅是一組有用的宏指令(macro); 它涵蓋Python語言的任何部分(利用源代碼轉(zhuǎn)換),包括控制流、函數(shù)應用程序和賦值、生成模板代碼以及重構常用的Python讓它易于轉(zhuǎn)換為圖形。
對于任何編譯器,都會擔心報錯信息的可讀性; 為此,AutoGraph創(chuàng)建了報錯消息和堆棧跟蹤,用來顯示原始源代碼中的錯誤源,而不僅僅是顯示對生成的代碼的參考。
可運行的例子
那么,AutoGraph可以為你做什么呢? 以下是一些代碼示例,它可以直接轉(zhuǎn)換為圖形代碼而無需任何更改。 如果你想查看完整的代碼,我們有一個notebook,你可以在Colab或GitHub上查看。
在這里,我們使用循環(huán)和分支檢測Collatz猜想。 注意,我們使用AutoGraph的.to_graph()函數(shù)將其轉(zhuǎn)換為圖形的原因,是為了多樣性而不是為了裝飾。
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:whilen5:??????n?+=?1??????print(n)??return?n
AutoGraph允許你將元素追加到循環(huán)內(nèi)的數(shù)組中。 為了達到這個要求,我們使用一些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這樣的結(jié)構。 轉(zhuǎn)換后,該片段的Python將轉(zhuǎn)換為圖形(使用恰當?shù)膖f.Assert)。
deff(x):assertx!=0,'Donotpasszero!'returnx*x
能夠輕松地添加循環(huán),控制流程以及更多圖表意味著可以輕松地將訓練循環(huán)移動到圖形中。 這個例子可以在這個notebook中找到,我們采用RNN訓練循環(huán)并用一個sess.run()調(diào)用執(zhí)行它。 在需要將整個訓練循環(huán)傳遞給加速器而不是通過CPU控制器管理訓練的情況下,這可能是很有用的。
AutoGraph開辟了構建和訓練模型的新思路。我們期待根據(jù)開發(fā)者社區(qū)的建議為AutoGraph添加更多功能,所以請?zhí)岢瞿愕慕ㄗh和問題吧!
AutoGraph和Eager Execution
在使用eager execution時,你仍然可以通過tf.contrib.eager.defun對代碼的某些部分使用圖執(zhí)行。這要求你使用TensorFlow圖形操作,如tf.cond()。 將來,AutoGraph將與defun無縫集成,以允許在簡單的eager 風格的Python中創(chuàng)作圖形代碼。 當該實現(xiàn)可用時,你可以通過選擇性地將eager代碼轉(zhuǎn)換為graph fragments來使用AutoGraph加速熱點。
結(jié)論
AutoGraph是一款工具,可讓你輕松構建直觀,復雜的模型,在TensorFlow圖中輕松運行。 這是一個現(xiàn)在在contrib中的實驗工具,但我們希望盡快將其轉(zhuǎn)移到核心TensorFlow中。
告訴我們您使用AutoGraph的經(jīng)歷! 如果你有反饋,建議或想法,請?zhí)峤粏栴}并向TensorFlow開發(fā)人員小組發(fā)送消息。
-
代碼
+關注
關注
30文章
4899瀏覽量
70658 -
Graph
+關注
關注
0文章
36瀏覽量
9423 -
python
+關注
關注
56文章
4827瀏覽量
86667
原文標題:【TensorFlow重大升級】自動將Python代碼轉(zhuǎn)為TF Graph,大幅簡化動態(tài)圖處理!
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
在網(wǎng)上看到泰克,rigol,安泰信測試1M的信號的動態(tài)圖,大....
lab如何加入動態(tài)圖,。。。。。。。
matlab用plot畫動態(tài)圖
用LEON3開源軟核處理器怎么才可以設計一個動態(tài)圖像邊緣檢測
請問為什么動態(tài)圖對滑動手勢沒有反應?
使用動態(tài)圖時X軸的值增加了怎么解決?
使用STM32F469I-Disco板動態(tài)圖顯示數(shù)據(jù)沒有響應怎么辦?
基于門限方案的動態(tài)圖軟件水印算法
動態(tài)圖和線程關系的混合軟件水印算法分析

基于快照的大規(guī)模動態(tài)圖相似節(jié)點查詢算法

評論