OneFlow 概念清单
生活随笔
收集整理的這篇文章主要介紹了
OneFlow 概念清单
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OneFlow 概念清單
本文將對 OneFlow 中涉及到的,常用的一些概念/名詞做一個概括性的解釋。主要內容針對算法工程師和框架開發者分為以下兩部分:
? 算法開發
? 框架開發
在算法開發部分,將解釋深度學習算法開發過程中常用的一些概念和名詞,而在框架開發部分,則側重于介紹 OneFlow 框架內部設計概念、重要數據結構。
算法開發
- Placeholder
Placeholder 即數據占位符,此概念用于描述輸入/輸出的數據形狀,而并不是實體的數據。
例如:
import oneflow.typing as tp
def test_job(
images: tp.Numpy.Placeholder((32, 1, 28, 28), dtype=flow.float),
labels: tp.Numpy.Placeholder((32,), dtype=flow.int32),
) -> Tuple[tp.Numpy, tp.Numpy]:do something with images or labels
return (images, labels)
描述了一個測試的 job 函數中,輸入的圖片 shape 是(32, 1, 28, 28),數據類型是 flow.float32;輸入的 labels 標簽的 shape 是(32,),類型是 flow.int32。 - Tensor 和 Blob
在其它框架中常用 Tensor 這個概念,譬如 pytorch 中的 Tensor,其中包含了數據值和類型(data, dtype)、梯度 grad、存放的設備類型 device 等屬性。利用 Tensor 可以用來構造和描述前向/反向過程中的計算圖。
而在 OneFlow 中,底層也使用了 Tensor 的概念,不過 OneFlow 中的 Tensor 和 pytorch/tensorflow 中的有些不同,為了對分布式和并行提供充分的支持,OneFlow 中的 Tensor 更為復雜,類型和屬性更多(譬如:邏輯/物理、設備、分布式相關的屬性),而且一個邏輯上統一的 Tensor 可能在實際計算過程中,被拆分到了不同的設備上,所以,為了簡化描述,OneFlow 中屏蔽了各種具體類型的 Tensor,其上層由一個統一的概念— Blob 作為定義。
Blob 在 OneFlow 中有對應的基類 BlobDef,搭建網絡時可以打印 Blob 的屬性,比如以下代碼打印 conv1 的 shape 和 dtype :
print(conv1.shape, conv1.dtype)
Blob 可能只是占位符 Placeholder,也可能是具體的包含數值的單元。 - Job Function(作業函數)
在 OneFlow 中,將訓練、預測等具體任務統稱為作業函數(job function),作業函數聯系用戶的業務邏輯與 OneFlow 管理的計算資源。
在 OneFlow 中,任何被定義為作業函數的方法體都需要用裝飾器 @oneflow.global_function 修飾,通過此裝飾器,不僅能定義作業的類型(如:type=“train”),同時將為作業綁定一個 FunctionConfig 對象用于設置作業函數運行時所需的配置,使得 OneFlow 能方便地為管理內存、GPU 等計算資源。 - Layer 和 Operator(op)
Layer
Layer 即運算層,layer 的概念和 tensorflow、pytorch 等主流深度學習框架類似,用來描述神經網絡模型中的一個層級如:conv2d 卷積層、batch_normalization 層、dense 全連接層、layer_norm 正則化層等。層的存在簡化了神經網絡模型的搭建過程,譬如,可以用簡單的幾行代碼搭建出 LeNet:
def lenet(data, train=False):
initializer = flow.truncated_normal(0.1)
conv1 = flow.layers.conv2d(
data,
32,
5,
padding=“SAME”,
activation=flow.nn.relu,
name=“conv1”,
kernel_initializer=initializer,
)
pool1 = flow.nn.max_pool2d(
conv1, ksize=2, strides=2, padding=“SAME”, name=“pool1”, data_format=“NCHW”
)
conv2 = flow.layers.conv2d(
pool1,
64,
5,
padding=“SAME”,
activation=flow.nn.relu,
name=“conv2”,
kernel_initializer=initializer,
)
pool2 = flow.nn.max_pool2d(
conv2, ksize=2, strides=2, padding=“SAME”, name=“pool2”, data_format=“NCHW”
)
reshape = flow.reshape(pool2, [pool2.shape[0], -1])
hidden = flow.layers.dense(
reshape,
512,
activation=flow.nn.relu,
kernel_initializer=initializer,
name=“dense1”,
)
if train:
hidden = flow.nn.dropout(hidden, rate=0.5, name=“dropout”)
return flow.layers.dense(hidden, 10, kernel_initializer=initializer, name=“dense2”)
layer 底層是由各種算子拼接而成,譬如:layers.conv2d 其實是由 conv2d 算子和 variable 算子組成。
Op
Operator 即算子(簡稱為op),是 OneFlow 中的基本運算單元 。上面例子中 layer 之間的計算全部由各種算子疊加完成。譬如 flow.nn.max_pool2d 就是一種算子,flow.reshape 是另一種算子。 - Consistent/Mirrored View
OneFlow 中采取了兩種視角: Mirrored View 和 Consistent View 來描述分布式情況下數據和模型的分布,不同的 view 對應了不同的并行策略。
Mirrored View 來源于 MPI 分布式計算中的鏡像策略,用于描述數據并行時,模型鏡像到多卡的行為;
Consistent View 則表示將分布式環境下的多機多卡視為一個整體,采取此策略時,OneFlow 會為用戶屏蔽掉具體的執行方式,內部將以最優化的策略選擇并行方式(可能是數據并行/模型并行或混合并行)
簡單來說:
當設置 mirrored view 時(flow.scope.mirrored_view)表示只能使用數據并行的方式。譬如在 job function 中設置了4臺單卡節點,則模型會被完整的復制/鏡像到4臺節點的GPU卡上,數據則會切分為4份分別喂給4臺節點上的GPU卡。
當設置 consistent view 時(flow.scope.consistent_view),則表示沒有限制,OneFlow 可以自由選擇模型并行、數據并行或者兩者共存的混合并行。
框架開發 - Boxing
負責在運行時根據并行屬性轉換張量的模塊,稱之為 Boxing。
例如:當上下游的 op 具有不同的并行特性(如并行數不同),OneFlow 將利用 Boxing 自動處理各種數據轉換和傳輸過程。 - SBP
本質上,神經網絡前向后向過程中的大多數操作,都可以歸納為矩陣計算,在矩陣計算中常有根據 axis 切分、廣播等操作。同樣 OneFlow 中也有類似的操作,稱為SBP,當然,OneFlow 中的 SBP 不僅僅是簡單的矩陣運算,其還對應了數據在不同物理 GPU 上的劃分、廣播等實際操作。
SBP 即 Split、Broadcast、Partial sum 的縮寫。其中 Split 表示切分;Broadcast 表示廣播;Partial sum 表示部分求和。
Split
在并行 op 計算時,張量被 split 切分為多個子張量。不同的 op 算符允許張量在不同的 axis 軸上進行拆分。Boxing 機制將自動處理一個張量在多種 op 操作下在不同軸上切分的情況。
Broadcast
并行 op 計算時,一個設備上的張量被廣播至多個設備,使每臺設備上有相同的張量。
Partial Sum
如果一個 op 具有分配(distributive)屬性,則張量會根據屬性進行部分維度的加和操作。 - TensorBuffer 和 TensorList
基于靜態圖機制,OneFlow 可以在編譯時提前推理出各個算子的張量形狀,并分配好內存,做到程序運行時內存零拷貝。但在某些特殊場景下,OneFlow 需要處理變長的數據,比如 DataLoader 加載的圖片形狀在編譯時無法獲知。為了處理這種變長數據,OneFlow 內部設計了兩種數據結構,分別是 TensorBuffer 和 TensorList 。
TensorBuffer
TensorBuffer 是一個較為靈活的數據結構,使用的時候,需要指定實例的維度。OneFlow 會為每個實例生成對應的 TensorBuffer 對象,TensorBuffer 對象間接引用內存數據,TensorBuffer 所引用的內存區域是動態的、不連續的。
TensorList
與 TensorBuffer 類似,TensorList 也是一種存放變長數據的數據結構,最主要的區別在與 TensorList 的數據部分在內存中是連續的。
總結
以上是生活随笔為你收集整理的OneFlow 概念清单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式训练
- 下一篇: 作业函数的定义与调用