日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OneFlow 概念清单

發布時間:2023/11/28 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OneFlow 概念清单 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OneFlow 概念清單
本文將對 OneFlow 中涉及到的,常用的一些概念/名詞做一個概括性的解釋。主要內容針對算法工程師和框架開發者分為以下兩部分:
? 算法開發
? 框架開發
在算法開發部分,將解釋深度學習算法開發過程中常用的一些概念和名詞,而在框架開發部分,則側重于介紹 OneFlow 框架內部設計概念、重要數據結構。
算法開發

  1. 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。
  2. 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,也可能是具體的包含數值的單元。
  3. Job Function(作業函數)
    在 OneFlow 中,將訓練、預測等具體任務統稱為作業函數(job function),作業函數聯系用戶的業務邏輯與 OneFlow 管理的計算資源。
    在 OneFlow 中,任何被定義為作業函數的方法體都需要用裝飾器 @oneflow.global_function 修飾,通過此裝飾器,不僅能定義作業的類型(如:type=“train”),同時將為作業綁定一個 FunctionConfig 對象用于設置作業函數運行時所需的配置,使得 OneFlow 能方便地為管理內存、GPU 等計算資源。
  4. 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 是另一種算子。
  5. 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 可以自由選擇模型并行、數據并行或者兩者共存的混合并行。
    框架開發
  6. Boxing
    負責在運行時根據并行屬性轉換張量的模塊,稱之為 Boxing。
    例如:當上下游的 op 具有不同的并行特性(如并行數不同),OneFlow 將利用 Boxing 自動處理各種數據轉換和傳輸過程。
  7. 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)屬性,則張量會根據屬性進行部分維度的加和操作。
  8. TensorBuffer 和 TensorList
    基于靜態圖機制,OneFlow 可以在編譯時提前推理出各個算子的張量形狀,并分配好內存,做到程序運行時內存零拷貝。但在某些特殊場景下,OneFlow 需要處理變長的數據,比如 DataLoader 加載的圖片形狀在編譯時無法獲知。為了處理這種變長數據,OneFlow 內部設計了兩種數據結構,分別是 TensorBuffer 和 TensorList 。
    TensorBuffer
    TensorBuffer 是一個較為靈活的數據結構,使用的時候,需要指定實例的維度。OneFlow 會為每個實例生成對應的 TensorBuffer 對象,TensorBuffer 對象間接引用內存數據,TensorBuffer 所引用的內存區域是動態的、不連續的。

TensorList
與 TensorBuffer 類似,TensorList 也是一種存放變長數據的數據結構,最主要的區別在與 TensorList 的數據部分在內存中是連續的。

總結

以上是生活随笔為你收集整理的OneFlow 概念清单的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。