1. 程式人生 > >Tensorflow 核心流程剖析 3-- 執行裝置Device的生成和管理

Tensorflow 核心流程剖析 3-- 執行裝置Device的生成和管理

1. 關鍵術語描述

kernel

  • 在神經網路模型中,每個node都定義了自己需要完成的操作,比如要做卷積、矩陣相乘等。而實現這個操作的演算法,我們單獨抽象出來,叫做kernel。 可以將kernel看做是一段能夠跑在具體硬體裝置上的演算法程式,所以即使同樣的2D卷積演算法,我們有基於gpu的Convolution 2D kernel例項、基於cpu的Convolution 2D kernel例項。

device

  • 負責執行kernel的具體硬體裝置抽象。每個device例項,對應系統中一個具體的處理器硬體,比如gpu:0 device, gpu:1 device, cpu:0 device。一般來說,每個device例項同時包括處理器資源、記憶體資源。device的抽象支援硬體裝置提供的並行處理能力。

2. device是什麼

為方便描述,下面我們把在tensorflow裡面執行的神經網路模型都統一稱為graph。

我們知道,tensorflow主要針對的是跨硬體平臺、分散式、併發執行的場景,參與運算的每個硬體資源,我們都抽象為device例項,便於管理。

device的主要職責:

  • 管理處理器資源,為支援device內部的平行計算,進一步將其抽象為thread pool或streams:

    • cpu:使用thread pool來管理,thread之間可支援不同程度的平行計算能力
    • gpu: 針對nvidia gpu, 使用cuda streams來管理,根據不同的gpu型號,可支援不同數量的stream做平行計算
  • 管理記憶體資源:為kernel的執行,分配和釋放記憶體,進一步抽象為Allocator及其各種子類的例項來管理。

    • 主機記憶體:

      • cpu kernel 計算時需要的記憶體。
      • gpu kernel的輸出結果如果要放置到主機記憶體中時,gpu kernel也需要申請主機記憶體。
    • 視訊記憶體: gpu kernel 計算時需要的記憶體。

3. device的種類及應用場景

由於device要抽象的裝置種類較多,我們主要描述一下本地執行的cpu device、gpu device例項型別。先用一個UML圖來表示一下各種device抽象類的關係:

devices and classes UML

可以看到,cpu device例項使用的類是GPUCompatibleCPUDevice,主要是在ThreadPoolDevice的基礎上,增加了gpu<-> cpu之間記憶體傳輸資料的優化措施。

gpu device例項使用的類是 GPUDevice 。

4. device例項的關鍵資料結構

我們以常用的cpu device,gpu device為例, 用下圖描述一下device例項的關鍵資料結構:

device key data members

可以看到每個device例項內部都具備並行處理的能力:

  • GPUCompatibleCPUDevice例項

    • 將 cpu 的計算資源抽象為thread pool,以支援多thread之間的併發執行;
    • 將主機記憶體抽象為 CPUAllocator 例項來進行管理,為cpu kernel、gpu kernel提供主機記憶體的申請、釋放功能;
  • GPUDevice例項

    • 將gpu的計算資源抽象為streams, 由於目前只支援NVIDIA的gpu,所以這裡我們可以看作抽象為cuda streams,多個cuda streams之間的計算可以併發處理;
    • 通過GPUBFCAllocator例項來管理視訊記憶體,為gpu kernel提供視訊記憶體的申請、釋放功能。

5. device例項的建立

系統中可用的device例項,由session發起建立,歸屬於session例項。

device的建立,使用Factory 設計模式,session會呼叫所有註冊的device factory,逐一產出 符合條件的device例項。

以DirectSession例項建立gpu device、cpu device為例,具體流程如下圖所示。
為方便結合程式碼閱讀,已包含主要的類、函式呼叫路徑:

device create

可以看到,最終產出 的gpu device、cpu device例項,都會儲存至DirectSession例項的 devices_ 表中,由DirectSession例項進行分配和使用。

6. 在graph執行階段device的使用

在graph的建立階段,session為每個node分配一個具體的device例項,同時為每個node建立一個具體的kernel例項,這個kernel例項將會執行在分配的device例項上。(參見Tensorflow 核心流程剖析 2 – 神經網路模型的建立和分割)

接下來,在graph的執行階段,session會依次處理graph中的node,排程node所分配的device例項,去執行node的kernel例項。

每個kernel 在執行時,會向其分配的device,申請需要的計算資源、記憶體資源等,完成具體的運算操作。

上述流程如下圖所示。
為方便結合程式碼閱讀,已包含主要的類、函式呼叫路徑:

device usage