置原理與實戰(zhàn)解析)
CANN opbase 中 aclTensor 的 SetOriginalFormat 接口原始 Format 設(shè)置原理與實戰(zhàn)解析【免費下載鏈接】opbase本項目是CANN算子庫的基礎(chǔ)框架庫為算子提供公共依賴文件和基礎(chǔ)調(diào)度能力。項目地址: https://gitcode.com/cann/opbaseSetOriginalFormat是 CANN opbase 基礎(chǔ)框架庫中aclTensor公共類型的一個成員接口用于設(shè)置張量在經(jīng)歷transdata節(jié)點之前的原始 FormatOriginFormat。本文將以 SetOriginalFormat.md 為骨架結(jié)合倉庫源碼與測試用例講解該接口的原型、參數(shù)、底層實現(xiàn)鏈路、Format 枚舉體系及在算子開發(fā)與框架調(diào)度中的實際應(yīng)用幫助算子開發(fā)者準(zhǔn)確理解并正確使用原始格式設(shè)置能力。OriginFormat先弄清原始格式到底是什么在昇騰計算圖的算子鏈路中張量的數(shù)據(jù)排布格式Format并非一成不變。為滿足昇騰 AI Core 對特定算子的高效計算要求框架可能會在算子之間插入transdata節(jié)點將張量從一種格式轉(zhuǎn)換為另一種格式。例如把 NCHW 布局的張量轉(zhuǎn)換為適合昇騰硬件計算的 FRACTAL_NZ 分形格式。OriginFormat描述的就是aclTensor 在經(jīng)歷 transdata 節(jié)點之前如果存在該節(jié)點的原始 Format 信息。它記錄的是這份數(shù)據(jù)最初以什么格式排布而與之相對的StorageFormat則描述數(shù)據(jù)在當(dāng)前存儲中的實際排布。二者解耦的意義在于即使張量在底層已經(jīng)以某種硬件友好的格式存儲上層語義如 shape 推導(dǎo)、算子語義判斷、dump 信息還原依然可以追溯到其原始格式。SetOriginalFormat正是用于顯式設(shè)置這一原始格式信息的接口原型如下void SetOriginalFormat(op::Format format)參數(shù)說明參數(shù)輸入/輸出說明format輸入數(shù)據(jù)類型為op::Format即ge::Format是一個枚舉類型定義了多種不同的數(shù)據(jù)排布格式例如 NCHW、ND、NC1HWC0、FRACTAL_NZ 等。返回值無void。約束無。接口為普通成員函數(shù)直接寫入張量的 Format 元信息不涉及內(nèi)存分配或設(shè)備側(cè)操作。源碼級解析接口的底層實現(xiàn)鏈路SetOriginalFormat聲明于公共類型頭文件 common_types.h位于aclTensor類中與GetOriginalFormat、SetStorageFormat、SetViewFormat等接口并列共同構(gòu)成 aclTensor 的 Format 三視圖管理能力op::Format GetStorageFormat() const; void SetStorageFormat(op::Format format); op::Format GetOriginalFormat() const; void SetOriginalFormat(op::Format format); op::Format GetViewFormat() const; void SetViewFormat(op::Format format);其實際實現(xiàn)位于 common_types.cpp實現(xiàn)非常簡潔——委托給內(nèi)部的op::Tensor對象void aclTensor::SetOriginalFormat(op::Format format) { tensor_-SetOriginFormat(format); }對應(yīng)的讀取接口實現(xiàn)為common_types.cppop::Format aclTensor::GetOriginalFormat() const { return tensor_-GetFormat().GetOriginFormat(); }由此可見aclTensor是對內(nèi)部op::Tensor元數(shù)據(jù)的薄封裝Format 信息被聚合存儲在 Tensor 的 Format 描述對象中SetOriginalFormat/GetOriginalFormat只是把OriginFormat的讀寫能力暴露給算子開發(fā)者。從代碼結(jié)構(gòu)看SetOriginalFormat與SetStorageFormatcommon_types.cpp、SetViewFormatcommon_types.cpp三者分別維護(hù)原始格式、存儲格式與視圖格式對應(yīng) common_types.h 中GetStorageShape/GetOriginalShape/GetViewShape的存儲-原始-視圖三視圖設(shè)計思想。常用 Format 枚舉值op::Format即ge::Format完整枚舉定義可參考 AICPU 側(cè)公共類型頭文件 cpu_types.h常用取值包括枚舉值含義FORMAT_NCHW經(jīng)典四維布局通道維 C 在第二位值為 0FORMAT_NHWC通道維 C 在最后一位FORMAT_ND通用多維張量布局不限定維度數(shù)FORMAT_NC1HWC0昇騰特有的 5 維布局C 維按 C0通常為 16切分FORMAT_FRACTAL_NZ分形 NZ 格式AI Core 計算友好的權(quán)重/激活布局FORMAT_NDC1HWC0/FORMAT_FRACTAL_Z等5D/3D 場景及更多專用布局此外format_utils.h 提供了一組格式輔助工具可用于判斷私有格式、字符串與枚舉互轉(zhuǎn)以及提取主格式/子格式/C0 信息例如op::ToFormat(const std::string)、op::ToString(Format)、op::GetPrimaryFormat、op::GetSubFormat、op::GetC0Format實際排布還可能通過主格式子格式組合編碼的方式表達(dá)設(shè)置原始格式時傳入基礎(chǔ)枚舉值即可。調(diào)用示例將輸入張量的 OriginFormat 顯式設(shè)置為 ND 格式即原文檔示例// 將 input 的 OriginFormat 置為 ND 格式 void Func(const aclTensor *input) { input-SetOriginalFormat(ge::FORMAT_ND); }將張量原始格式設(shè)置為 FRACTAL_NZ 的完整讀寫示例#include nnopbase/opdev/common_types.h void SetAndQueryOriginalFormat(aclTensor *tensor) { // 設(shè)置原始格式為 FRACTAL_NZ tensor-SetOriginalFormat(op::Format::FORMAT_FRACTAL_NZ); // 讀取并核對 op::Format fmt tensor-GetOriginalFormat(); // fmt op::Format::FORMAT_FRACTAL_NZ }注意示例中既可以使用ge::FORMAT_NDge命名空間別名也可以使用op::Format::FORMAT_FRACTAL_NZop命名空間二者指向同一枚舉。配套接口與三格式協(xié)同aclTensor圍繞 Format 提供了一組配套讀寫接口common_types.h實際開發(fā)中通常成組使用GetStorageFormat()/SetStorageFormat(Format)數(shù)據(jù)在內(nèi)存中的實際存儲格式GetOriginalFormat()/SetOriginalFormat(Format)數(shù)據(jù)進(jìn)入 transdata 之前的原始格式GetViewFormat()/SetViewFormat(Format)視圖view語義下的格式配合SetViewShape使用。三者的典型關(guān)系是原始格式描述語義排布存儲格式描述物理排布視圖格式描述用戶視角的切片排布。當(dāng)張量經(jīng)過transdata后其 StorageFormat 發(fā)生變化而 OriginFormat 保持不變這正是推理與調(diào)試場景中還原數(shù)據(jù)原始語義的關(guān)鍵。在框架調(diào)度中的實際應(yīng)用從源碼搜索可以看到OriginFormat被框架多個模塊讀取使用這些調(diào)用點印證了該接口的實戰(zhàn)價值Tiling 上下文構(gòu)建在單算子執(zhí)行器中indv_tilingcontext_builder.cpp 等多處通過storageFormat.GetOriginFormat()將原始格式寫入 TilingData供 AI Core 側(cè) Tiling 解析使用編譯描述生成復(fù)合算子引擎在 kernel_context_holder.cpp 中通過tensor-GetOriginalFormat()把原始格式寫入編譯描述compileDesc的 storage_format參與算子二進(jìn)制選擇與緩存 key 構(gòu)建Tiling 信息落盤算子信息記錄模塊在 tiling_context_to_json.cpp 中將origin_format序列化進(jìn) JSON供離線分析工具還原 Tiling 現(xiàn)場執(zhí)行器張量維護(hù)indv_executor_tensor.cpp 在運行期按實際存儲格式對運行時張量調(diào)用SetOriginFormat保證運行時上下文與編譯期描述一致。測試驗證倉庫測試用例對SetOriginalFormat與GetOriginalFormat的讀寫一致性做了直接驗證見 test_common_types.cppUT 用例ST 側(cè)用例見 test_common_types.cppa.SetStorageFormat(Format::FORMAT_FRACTAL_NZ); EXPECT_EQ(a.GetStorageFormat(), Format::FORMAT_FRACTAL_NZ); a.SetOriginalFormat(Format::FORMAT_FRACTAL_NZ); EXPECT_EQ(a.GetOriginalFormat(), Format::FORMAT_FRACTAL_NZ); a.SetViewFormat(Format::FORMAT_FRACTAL_NZ); EXPECT_EQ(a.GetViewFormat(), Format::FORMAT_FRACTAL_NZ);該用例將 Storage/Original/View 三種格式分別設(shè)置并斷言讀取結(jié)果直接驗證了SetOriginalFormat的寫入-讀取閉環(huán)也佐證了三格式互不干擾、獨立存取的設(shè)計。使用建議與注意事項設(shè)置時機(jī)建議在創(chuàng)建/構(gòu)造 aclTensor 語義信息時同步設(shè)置原始格式或在張量經(jīng)過格式轉(zhuǎn)換transdata之前記錄下轉(zhuǎn)換前的格式避免語義信息丟失與 StorageFormat 的關(guān)系SetOriginalFormat只影響語義層面的原始格式記錄不會觸發(fā)數(shù)據(jù)重排或內(nèi)存搬運真正的數(shù)據(jù)轉(zhuǎn)換由transdata算子完成本接口只是元數(shù)據(jù)標(biāo)注與視圖語義配合當(dāng)通過aclCreateTensor等接口創(chuàng)建帶 view 語義的張量時建議同時明確 Storage/Original/View 三套格式保證 shape 推導(dǎo)、tiling 計算與 dump 信息完整一致格式化調(diào)試如需將 Format 轉(zhuǎn)為可讀字符串可使用 format_utils.h 中的op::ToString(Format)與 Tiling 落盤 JSON 中的origin_format字段對應(yīng)便于排查格式鏈路問題。小結(jié)SetOriginalFormat雖然是一個僅有幾行實現(xiàn)的小接口卻是 aclTensor 三視圖 Format 體系中承上啟下的一環(huán)它把數(shù)據(jù)在 transdata 之前的原始格式顯式記錄進(jìn)張量元數(shù)據(jù)并被 tiling 上下文構(gòu)建、編譯描述生成與信息落盤等框架模塊廣泛讀取。掌握該接口及配套的GetOriginalFormat/SetStorageFormat/SetViewFormat有助于在自定義算子開發(fā)中正確維護(hù)張量格式語義確保 shape 推導(dǎo)、tiling 與 dump 全鏈路的信息一致性。相關(guān)接口的完整清單可參閱 common_types.md 與 opdev API 總覽?!久赓M下載鏈接】opbase本項目是CANN算子庫的基礎(chǔ)框架庫為算子提供公共依賴文件和基礎(chǔ)調(diào)度能力。項目地址: https://gitcode.com/cann/opbase創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考