<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深入學習和掌握TPU硬件架構有困難?TDB助力你快速上手!

算能開發者社區 ? 2023-12-22 08:33 ? 次閱讀

TDB介紹

TDB(TPU DeBugger)是針對TPU-MLIR編譯出來的BModel設計的一系列調試工具集合, 可以支持對BModel反匯編、結構可視化、單步執行仿真等功能,使用方法靈活。能夠快速定位BModel與原始模型推理結果不一致的問題,進而修復TPU-MLIR的編譯或模型出錯點。

下圖是TDB工具集的框架。b6c7c1e6-a061-11ee-9788-92fbcf53809c.png

TDB主要是基于Python開發的,其核心功能模塊包括TPU架構相關的指令解析、指令運行、數據IO功能,以及通用的BModel反匯編框架及MLIR的索引機制。在此基礎上,形成了TDB調試、BModel_checker, BModel_dis, MLIR2graph等工具。TDB目前支持的處理器包括BM1684、BM1684X。

下表是TDB工具的具體功能b6d4c99a-a061-11ee-9788-92fbcf53809c.png

本文重點介紹tdb.py的使用方法和實現細節。

tdb.py的使用

tdb.py提供了一個和pdb、gdb界面類似的調試窗口,用于分析BModel運行,支持添加斷點,單步執行,查看內存數據(修改內存數據),數據比對。相關差異可參考下圖:

b6e55242-a061-11ee-9788-92fbcf53809c.png

進入調試

usage:tdb.py[-h][--inputs[INPUTS]][--ref_data[REF_DATA...]][--plugins[PLUGINS]][--ddr_size[DDR_SIZE]][-v][context_dir]

TPUDebugger.

positionalarguments:
context_dirThepathofBModel.

options:
-h,--helpshowthishelpmessageandexit
--inputs[INPUTS]TheinputsdataoftheBModel.
--ref_data[REF_DATA...]
ThereferencedataoftheBModel.
--plugins[PLUGINS]Theextrapluginstobeadded.
--ddr_size[DDR_SIZE]
Theddr_sizeofcmodel.
-v,--verboseuseprogressbar

在context_dir直接運行tdb.py即可調試當前目錄下的compilation.bmodel文件;可通過--ref_data來傳入參考數據,示例如下:

tdb.py--ref_data../yolov5s_1o_bm1684x_f32_tpu_outputs.npz

調試命令

在進入TDB后,可以使用多個快捷命令來控制運行狀態。按下兩次tab或者鍵入 ? 獲取命令提示。

基本命令

命令說明
r/run從頭執行到結束,run指令包含重新初始化
s/start加載 bmodel 并初始化cmodel,cmodel 為單例模式,不會重復加載,只會清空內存;bmodel 每次初始化均會重新加載。
n/next執行下一條指令,可以使用n 3來執行接下來的三條指令
c/continue繼續執行指令
q/quit退出
py直接在環境中執行python命令,集成了pdb的代碼補全功能,連按兩下 tab 鍵獲取提示

插件系統

為了減少代碼的冗余程度,設計上TDB本體只負責對指令執行過程的基本控制,而額外通過插件系統對TDB的功能進行擴展。插件提供的功能包括:

  • TDB執行指令的不同生命周期接收回調信息
  • TDB本身的指令進行擴展

目前內置的“插件” 有 breakpoints、display、info、data-check 等,可以根據需求實現自己的TDB插件。

breakpoint

breakpoint插件用于實現斷點功能,在設計之初就考慮了可以通過多種形式添加斷點,包括指令名、指令地址、指令id、mlir的Operation名、value-id、location...等,同時可以根據需求靈活建立斷點。

命令介紹示例
b/break添加斷點,具體查看下方的b %1
enable num允許在index為num 的斷點停下enable 1
enable 1,2,3
disable num停止使用index為num的斷點disable 1
disable 1,2,3
delete刪除斷點delete 1
info b查看斷點信息info b

目前支持的斷點類型包括:

斷點類型名稱斷點命令使用示例斷點來源說明
asm-nameb dma.tensor
b arith.cast
解析出的asm的指令名稱,如:
%R8, %B2420 = "arith.cast"(%R0, %D288) {round_mode = 1} : (memref<16x64x1x512xf16, strides: [512, 512, 512, 1]>, none) -> (memref<16x64x1x512xf32, strides: [512, 512, 512, 1]>, none)
addressb R0
b G33386496
解析出的asm的 memref,如:
%G33386496, %D293 = "dma.matrix"(%R8, %B2422) {decompress = False} ...
目前對Local Memory僅支持offset,不支持通過 NPU_OFFSET 等進行索引
cmd-idb B23
b D465
解析出的 asm 的 cmd_id,如:
%R0, %D291 = "dma.matrix"(%G35471360, %B2420) {decompress = False} ...
value-idb %173final.mlir 的 Operation 的前綴,如:
%173 = "tpu.Cast"(%169) {ginfo ...
目前僅匹配字符串,只要字符串中包含對應的 value-id 就視為匹配
locationb #loc("conv1_glow")
b #loc(3)
final.mlir的Operation 的loc,目前僅支持 name
op-nameb tpu.Loadfinal.mlir中的Operation 的名字,如:tpu.Load
file-lineb mlir:312
b asm:168
在final.mlir和asm的行號上打斷點

display

display目前支持的較為簡陋,是通過對info函數的python調用封裝實現的:

display self.info("asm 5")

data-checker

默認在通過--ref_data傳入數據的情況下會直接開啟。也可以通過Bmodel_checker.py 使用b6f899ce-a061-11ee-9788-92fbcf53809c.png

print

提供了內置的一些打印功能,主要聚焦于打印當前指令以及指令對應的數據,并會在TDB每一個stop時打印待執行的下一個atomic commandb719ce0a-a061-11ee-9788-92fbcf53809c.png

info

提供了內置的一些打印功能,主要聚焦于打印出不同格式的當前指令的上下文。

b7244b46-a061-11ee-9788-92fbcf53809c.png

實現細節

文件結構

debugger首先提供了完整的指令解析和運行功能,這一部分的核心代碼位于 debugger/target_{產品型號/產品型號/common}。其中不同處理器在指令解析、cModel運行等方式的實現均有差異,這些差異分別在各自的文件夾中實現。而一部分相同的內容和對差異行為的抽象的聲明則在 python/debugger/target_common/ 目錄下提供。這部分內容比較復雜,在后面單獨介紹。

此外,debugger下還有一些其他文件,包括

  • debugger/disassembler.py:提供對Bmodel 文件的基本解析
  • debugger/atomic_dialect.py:基于disassembler.py,將 Bmodel的內容轉換為 mlir 的類型系統
  • debugger/final_mlir.py:解析 `final.mlir`` 文件并建立索引供 TDB使用
  • debugger/tdb_support.py:提供了基于cmd.Cmd的基本的TDB功能的實現,同時加載 bmodel、日志、斷點的基類、插件系統等。

各自的target_{device} 下提供的功能在后面介紹。而target_common包括

  • context.py:提供了CModelContext 這一基類以及相關方法的聲明
  • cmodel.py:提供了CModelRunner 和 Memory 兩個基類,提供了一些方法的聲明
  • decoder.py:提供了 Decoder 類定義以及解析tiu dma指令方法的聲明
  • op_support.py:提供了一些類型定義、Layout、MemoryType 等枚舉類型的聲明、一些公共方法、以及一些Operation 基類聲明

集成上下文環境

為了更方便的獲取不同target的相同功能(如指令解析或執行),每個target 需要繼承CModelContext并實現自己的TargetContext來主動暴露自己提供功能。每個TargetContext需要以類變量的方式定義:

  • MemRef:描述了一塊內存區域的view(address、dtype、layout等)
  • device:描述了該target的類型
  • memmap:描述了處理器上的內存地址信息
  • dma_sys、tiu_sys(部份處理器):描述了停止指令的類型
  • get_memory_type:根據輸入地址獲取地址類型(global、local、l2等 )
  • get_runner:獲取該target運行指令的Runner實例
  • 其他,如local_layout_to_stride,
  • merge_instruction:在每個subnet中,atomic指令滿足DAG,所以可以進行 topological sort(這一功能實際應該由 Decoder 提供),從而可以被順序執行

每個TDB實例在加載BModel后,會根據BModel的處理器來獲取到對應target的Context實例(是實例而不是類),從而能實現指令的解析和執行。

指令解析

每個target都需要繼承DecoderBase并實現自己的Decoder來提供各個target的指令解析功能,每個Decoder都需要實現以下接口

  • decode_tiu_cmd
  • decode_tiu_cmds
  • decode_dma_cmd
  • decode_dma_cmds

BModel中,指令以CmdGroup(對多核實現,通過CoreCmdGroup)的形式存儲,在python/debugger/atomic_dialect.py中定義了decode_cmdgroup,可以看做是調用Decoder方法的入口

defdecode_cmdgroup(
context:CModelContext,cmd_group:CmdGroup,subnet_id:int,core_id=0
)->StaticCmdGroup:
context=context
decoder=context.decoder

tiu=decoder.decode_tiu_cmds(cmd_group.tiu_cmd,core_id=core_id)
dma=decoder.decode_dma_cmds(cmd_group.dma_cmd,core_id=core_id)

cmdgroup=StaticCmdGroup(tiu,dma,context.merge_instruction(tiu,dma))
#hackinjectionsubnet_id
forcmdincmdgroup.all:
cmd.subnet_id=subnet_id
returncmdgroup

指令運行

b73c8dd2-a061-11ee-9788-92fbcf53809c.png

每個target都需要繼承MemoryBase和CModelRunner并實現自己的 Memory和TargetRunner來提供各個target的指令運行功能,其中:

  • 每個Memory都需要實現set_data、get_data、clear_memory方法
  • 每個TargetRunner都需要實現tiu_compute、dma_compute、init_memory、clear_memory、dynamic_compute 等方法

其中,Runner實例默認需要包含對應target的Memory實例。

插件系統

插件系統同時支持了指令執行回調和TDB功能擴展,相關的代碼位置包括:

  • 插件基類:tdb_support.py:TdbPlugin
  • 指令擴展基類:tdb_support.py:TdbPluginCmd
  • 回調注冊功能實現:tdb_support.py:add_callback
  • tdb 中實現相關邏輯:tdb_support.py:TdbCmdBackend.add_plugin
  • tdb 中注冊生命周期:tdb.py中各個地方添加的 add_callback 裝飾器
  • 各個 plugin 的具體實現:plugins/xxx.py

總結

BModel調試不是一件容易的事情,TDB提供了一種手段,可以看到BModel內部的推理過程并進行干預。本文介紹了TDB的使用方法和實現細節, 一方面讓大家熟悉BModel的調試方法,能夠更快地定位模型轉換過程中的問題并修復;另一方面,可以,并分析指令的格式和內容,增加開發的背景知識。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 硬件
    +關注

    關注

    11

    文章

    2952

    瀏覽量

    65106
  • python
    +關注

    關注

    52

    文章

    4698

    瀏覽量

    83609
  • TPU
    TPU
    +關注

    關注

    0

    文章

    133

    瀏覽量

    20597
收藏 人收藏

    評論

    相關推薦

    如何深入學習Labview?

    基礎的知識都懂了 但是深入學習卻不知如何下手。。。手中有一本教材 深入太難了 很難學的。。。{:23:}
    發表于 06-05 15:23

    protues怎么深入學習??!急求!

    protues怎么深入學習??!急求!
    發表于 11-27 23:07

    求推薦深入學習下C語言的書

    本人學習完譚浩強的C程序設計了,想再深入學習下C語言,想找一本可以學習的書,什么推薦嘛?
    發表于 10-23 14:10

    【高手問答】第17期:小梅哥和你一起深入學習 FPGA

    `小梅哥和你一起深入學習FPGA高手問答第17期小編導讀: 本期高手問答(11.21~12.5)邀請到了《FPGA與大學EDA教學》、《FPGA在電子設計大賽中的應用》的作者小梅哥, 梅工,論壇
    發表于 11-21 14:47

    【NanoPi NEO申請】嵌入式深入學習

    申請理由:項目描述:學習計劃:1.嵌入式開發板硬件驅動學習2.輕量級系統移植學習3.在Nano pi neo這種小型板子的基礎上開發便捷式智能穿戴設備或者通信設備本人為大學學生,
    發表于 10-11 18:14

    深入學習GNU Radio需要知道些什么

    也能發現一些有用的信息。 記住,在你開始學習gnuradio之前,那些基礎并不是必須要掌握的,但在接下來的教程中很可能會去回顧這些知識。
    發表于 05-28 07:41

    求射頻等基帶畫板深入學習資料?

    求射頻等基帶畫板深入學習資料?求推薦視頻與電子版資料
    發表于 08-10 07:32

    如何快速上手學習STM32呢

    單片機用處這么廣,尤其是STM32,這么火!如何快速上手學習呢?問,如何系統地入門學習stm32?這本身就是一個錯誤的問題。假如你會使用8
    發表于 08-03 07:06

    嵌入式硬件部分值得深入學習嗎?

    給自己的忠告:不是計算機或者相關專業科班出身的人千萬不要深入學嵌入式硬件部分!
    發表于 10-27 09:29

    深入學習并以致用

    電子的深入學習沒有止境,同時需要系統性的基礎學習,以此作為指南是個較好的參考,可以全面、系統地根本性提升,也希望用學到的知識與身邊同行一起相互探討,一起前行。
    發表于 04-04 09:55

    單片機視頻教程13:UART 通信深入學習

    《手把手教你學單片機》單片機視頻教程13:UART 通信深入學習 單片機視頻教程13:UART 通信深入學習 1、單片機控制功能 2、UART異步和IIC的同步 3、EEPROM的地址 4、EEPROM的讀寫時序問題
    發表于 08-21 09:47 ?7609次閱讀
    單片機視頻教程13:UART 通信<b class='flag-5'>深入學習</b>

    openwrt深入學習筆記

    openwrt深入學習筆記 網上也很多,這里給大家上傳一個,免費供大家學習參考
    發表于 11-17 16:23 ?71次下載

    深入學習ARM Cortex-M3的權威級

    深入學習ARM Cortex-M3的權威級
    發表于 10-15 10:02 ?9次下載
    <b class='flag-5'>深入學習</b>ARM Cortex-M3的權威級

    深入學習:一文了解程序設計實踐

    C語言深入學習資料
    發表于 03-10 10:59 ?3次下載

    精通Python的深入學習資料

    精通Python的深入學習資料:從多方面來了解Python的特性和用法。
    發表于 07-07 15:08 ?40次下載
    精通Python的<b class='flag-5'>深入學習</b>資料
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>