tensorflow基於資料流圖,用於大規模分布式數值計算的開源框架。節點表示某種抽象的計算,邊表示節點之間相互聯絡的張量。
計算圖例項
tensorflow支援各種異構的平台,支援多cpu/gpu,伺服器,移動裝置,具有良好的跨平台的特性;tensorflow架構靈活,能夠支援各種網路模型,具有良好的通用性;此外,tensorflow架構具有良好的可擴充套件性,對op的擴充套件支援,kernel特化方面表現出眾。
tensorflow最初由google大腦的研究員和工程師開發出來,用於機器學習和神經網路方面的研究,於2015.10宣布開源,在眾多深度學習框架中脫穎而出,在github上獲得了最多的star量。
本文將闡述tensorflow的系統架構,幫助讀者加深理解tensorflow的工作機理。
本文假設讀者已經了解tensorflow的基本程式設計模型,包括計算圖, op, tensor, session等基本概念。tensorflow的系統結構以c api為界,將整個系統分為「前端」和「後端」兩個子系統:
tensorflow系統架構
如上圖所示,重點關注系統中如下4個基本元件,它們是系統分布式執行機制的核心。
client
client是前端系統的主要組成部分,它是乙個支援多語言的程式設計環境。它提供基於計算圖的程式設計模型,方便使用者構造各種複雜的計算圖,實現各種形式的模型設計。
client通過session為橋梁,連線tensorflow後端的「執行時」,並啟動計算圖的執行過程。
distributed master
在分布式的執行時環境中,distributed master根據session.run的fetching引數,從計算圖中反向遍歷,找到所依賴的「最小子圖」。
然後,distributed master負責將該「子圖」再次**為多個「子段」,以便在不同的程序和裝置上執行這些「子段」。
最後,distributed master將這些「子段」派發給work service;隨後work service啟動「子段」的執行過程。
worker service
對於每以個任務,tensorflow都將啟動乙個worker service。worker service將按照計算圖中節點之間的依賴關係,根據當前的可用的硬體環境(gpu/cpu),呼叫op的kernel實現完成op的運算(一種典型的多型實現技術)。
另外,worker service還要負責將op運算的結果傳送到其他的work service;或者接受來自其他worker service傳送給它的op運算的結果。
kernel implements
kernel是op在某種硬體裝置的特定實現,它負責執行op的運算。
元件互動
如上圖所示,假設存在兩個任務:
接下來,我們將進一步抽絲剝繭,逐漸挖掘出tensorflow計算圖的執行機制。
client基於tensorflow的程式設計介面,構造計算圖。目前,tensorflow主流支援python和c++的程式設計介面,並對其他程式語言介面的支援日益完善。
此時,tensorflow並未執行任何計算。直至建立session會話,並以session為橋梁,建立client與後端執行時的通道,將protobuf格式的graphdef傳送至distributed master。
也就是說,當client對op結果進行求值時,將觸發distributed master的計算圖的執行過程。
如下圖所示,client構建了乙個簡單計算圖。它首先將w與x進行矩陣相乘,再與截距b按位相加,最後更新至s。
構造計算圖
在分布式的執行時環境中,distributed master根據session.run的fetching引數,從計算圖中反向遍歷,找到所依賴的最小子圖。
然後distributed master負責將該子圖再次**為多個「子段」,以便在不同的程序和裝置上執行這些「子段」。
最後,distributed master將這些段派發給work service。隨後work service啟動「本地子圖」的執行過程。
distributed master將會快取「子段」,以便後續執行過程重複使用這些「子段」,避免重複計算。
執行圖計算
如上圖所示,distributed master開始執行計算子圖。在執行之前,distributed master會實施一系列優化技術,例如「公共表示式消除」,「常量摺疊」等。隨後,distributed master負責任務集的協同,執行優化後的計算子圖。
子段如上圖所示,存在一種合理的「子段」劃分演算法。distributed master將模型引數相關的op進行分組,並放置在ps任務上。其他op則劃分為另外一組,放置在worker任務上執行。
插入send/recv節點
如上圖所示,如果計算圖的邊被任務節點分割,distributed master將負責將該邊進行**,在兩個分布式任務之間插入send和recv節點,實現資料的傳遞。
隨後,distributed master將「子段」派發給相應的任務中執行,在worker service成為「本地子圖」,它負責執行該子圖的上的op。
對於每個任務,都將存在相應的worker service,它主要負責如下3個方面的職責:
執行本地子圖
worker service派發op到本地裝置,執行kernel的特定。它將盡最大可能地利用多cpu/gpu的處理能力,併發地執行kernel實現。
另外,tensorflow根據裝置型別,對於裝置間的send/recv節點進行特化實現:
對於任務之間的資料傳遞,tensorflow支援多協議,主要包括:
tensorflow的執行時包含200多個標準的op,包括數值計算,多維陣列操作,控制流,狀態管理等。每乙個op根據裝置型別都會存在乙個優化了的kernel實現。在執行時,執行時根據本地裝置的型別,為op選擇特定的kernel實現,完成該op的計算。
其中,大多數kernel基於eigen::tensor實現。eigen::tensor是乙個使用c++模板技術,為多核cpu/gpu生成高效的併發**。但是,tensorflow也可以靈活地直接使用cudnn實現更高效的kernel。
此外,tensorflow實現了向量化技術,使得在移動裝置,及其滿足高吞吐量,以資料為中心的應用需求,實現更高效的推理。
如果對於復合op的子計算過程很難表示,或執行效率低下,tensorflow甚至支援更高效的kernle實現的註冊,其擴充套件性表現相當優越。
最後,按照tensorflow的軟體層次,通過一張**羅列tensorflow的技術棧,以便更清晰地對上述內容做乙個簡單回顧。
tensorflow技術棧
TensorFlow架構與設計 OP本質論
tensorflow架構與設計 tensorflow架構與設計 圖模組 tensorflow架構與設計 會話生命週期 tensorflow的系統結構以c api為界,將整個系統分為 前端 和 後端 兩個子系統。前端系統扮演了client的角色,完成計算圖的構造,通過 protobuf格式的graph...
架構與設計
怎麼樣去架構乙個專案?1 對專案必須有足夠的了解。從客戶角度來看,客戶想要乙個什麼樣的產品,有哪些需求,我們將這些需求進行評估。2 評估時候對需求模組進行逐一分解,需要哪些技術進行支撐,同時對這些技術進行統計總結,提供統一的元件 我們自己的解決方案 提高系統的靈活性,復用性,擴充套件性和可維護性,達...
設計模式與架構設計
論設計模式在架構設計中的運用 設計模式 在我們現實的軟體專案開發中,常常會遇到一次又一次的關於軟體設計上的問題,而設計模式就針對那些問題提供了一系列的解決方案。設計模式是一種較高層次程式結構的設計策略 是一種技巧,它著重於為軟體系統 子系統內部的各物件間提供乙個良好的通訊平台,協調各者之間的關係,使...