TensorFlow架構與設計 OP本質論

2021-08-19 12:54:16 字數 3845 閱讀 7780

**tensorflow架構與設計

tensorflow架構與設計:圖模組

tensorflow架構與設計:會話生命週期

tensorflow的系統結構以c api為界,將整個系統分為「前端」和「後端」兩個子系統。前端系統扮演了client的角色,完成計算圖的構造,通過**protobuf格式的graphdef給後端系統的master,並啟動計算圖的執行過程。

最終,master將圖進行**,通過registergraph介面,將graphdef的子段註冊到worker上。因此,graphdef是描述計算圖的知識模型,整個tensorflow的計算過程都是圍繞graphdef所展開的。

領域模型

tensorflow計算的單位是op,它表示了某種抽象計算。本章首先闡述nodedef, opdef的元資料模型,然後通過乙個簡單的例子,講述元資料的流動過程。

op表示某種抽象計算,它擁有0個或多個「輸入/輸出」,及其0個或多個「屬性」。其中,輸入/輸出以tensor的形式存在。

在系統實現中,op的元資料使用protobuf格式的opdef描述,實現前端與後端的資料交換,及其領域模型的統一。

opdef定義

opdef定義包括op的名字,輸入輸出列表,屬性列表,優化選項等。其中,屬性常常用於描述輸入/輸出的型別,大小,預設值,約束,及其op的其他特性。

opdef表示

op命名

op通過名字索引,因此必須保證op的名字全域性唯一。按照規範,op的名字採用「駝峰」的命名風格,而python前端則使用「小寫下劃線」的命名風格。後者也常常稱為「op構造器」,也是公開給使用者的程式設計介面(api)。

另外,以下劃線開頭的op被系統內部實現保留。例如,_send, _recv,它們用於裝置間通訊的op;_source, _sink標識計算圖的開始節點和結束節點。

輸入/輸出

op的輸入/輸出以tensor的形式存在,存在如下4種情況。

1個tensor

多個tensor

相對於op的屬性,op的輸入是動態的,其值每次迭代(step)時,都會發生變化。

屬性

op可以擁有「屬性集」,用於描述op輸入輸出的型別,大小,預設值,約束,及其其他op的特徵。其中,計算圖構造時,屬性值(attrvalue)被確定(由nodedef攜帶,通過graphdef傳遞給後端執行系統)。

也就是說,op的「屬性定義」與「屬性值設定」是兩個分離的過程。其中,屬性定義在op註冊時確定,通過attrdef描述;屬性值設定在計算圖構造時確定(op新增到計算圖時),由attrvalue描述。

相對於op的輸入,op的屬性則是靜態的。op屬性值在計算圖構造期間確定,包括輸入輸出的型別,大小,形狀等,在計算迭代過程之中不會發生變化。

nodedef表示

op索引

nodedef通過op從opregistry中索引opdef。

輸入列表

通過input指定節點的輸入列表,它也是構造計算圖最重要的知識所在。它存在2種情況,分別表示普通邊與控制依賴邊。

按照約定,為了解析方便,input列表前面儲存普通邊,隨後儲存控制依賴邊。

node

:src_output

表示此邊為普通邊,承載tensor的資料流。其中,node為前驅節點的名稱,src_output為前驅節點輸出邊的索引。特殊地,當src_output為0時,可以略去0。

^node

表示該邊為控制依賴邊。其中,node為前驅節點的名稱。

裝置規範

通過device可以支援使用者自定義裝置分配方案。例如,

屬性值列表

在計算圖的構造期,op屬性值得以確定,包括輸入/輸出的型別,shape等資訊。op的屬性值承載於opdef的attr屬性列表之中。

tensorflow的計算過程是乙個延遲計算,是一種典型的基於符號的程式設計正規化。從計算時間軸看,計算過程基本分為2個階段:

其中,在系統初始化時,系統實現對所有op進行掃瞄註冊,並儲存於opregistry之中。

註冊op

理論上,op的註冊發生在系統初始化階段。後端系統,可以使用register_op實用巨集註冊op。前端系統,也存在類似的op註冊機制。

使用register_op註冊op過程,實際上是乙個register_op描述到opdef表示的翻譯過程。opdefbuilder通過鏈式呼叫input, output, attr方法分別構造op的輸入、輸出列表,及其屬性列表。最後,通過呼叫finalize成員函式,經過解析字串表示,將其翻譯為opdef的內在表示,最後註冊到opregistry之中。

op構建過程

例如,register_op(「zeroslike」)向系統註冊了乙個zeros_like的op,在執行時實現了opdef的翻譯表達。

op註冊

構造op

在前端,使用者使用op構造器實現op的構造,並將op註冊到計算圖中。在計算圖構造期間,op的輸入/輸出的型別,shape得以確定,op屬性值也得以確定。

計算圖的構造過程,實際上就是graphdef定義過程。其中,op的屬性值承載於nodedef,計算圖構造期間,nodedef的屬性值得以確定。

在計算圖執行啟動時,通過呼叫session.run,將整個graphdef傳遞給後端,並啟動計算圖的執行。例如,存在如下的計算圖構造過程:

zeros = tf.zeros_like(tensor, name="n2")

zeroslike的上游節點為n1,其src_output=0輸出邊流入zeroslike。此時,zeroslike的屬性t的值自動推演為dt_int32,兩個節點構造了乙個簡單的計算圖。

op構造

執行op

在計算圖執行期間,輸入由上游op流入得以確定,根據特定裝置型別,輸入輸出型別,多型選擇合適的kernel實現,並啟動kernel的計算過程。

例如,如果zeros_like上游輸入為[1, 2, 3, 4],進過zeros_like的op運算,輸出為[0, 0, 0, 0]。

op執行

TensorFlow架構與設計

tensorflow基於資料流圖,用於大規模分布式數值計算的開源框架。節點表示某種抽象的計算,邊表示節點之間相互聯絡的張量。計算圖例項 tensorflow支援各種異構的平台,支援多cpu gpu,伺服器,移動裝置,具有良好的跨平台的特性 tensorflow架構靈活,能夠支援各種網路模型,具有良好...

架構與設計

怎麼樣去架構乙個專案?1 對專案必須有足夠的了解。從客戶角度來看,客戶想要乙個什麼樣的產品,有哪些需求,我們將這些需求進行評估。2 評估時候對需求模組進行逐一分解,需要哪些技術進行支撐,同時對這些技術進行統計總結,提供統一的元件 我們自己的解決方案 提高系統的靈活性,復用性,擴充套件性和可維護性,達...

設計模式與架構設計

論設計模式在架構設計中的運用 設計模式 在我們現實的軟體專案開發中,常常會遇到一次又一次的關於軟體設計上的問題,而設計模式就針對那些問題提供了一系列的解決方案。設計模式是一種較高層次程式結構的設計策略 是一種技巧,它著重於為軟體系統 子系統內部的各物件間提供乙個良好的通訊平台,協調各者之間的關係,使...