
J6工具鏈模型X86推理方式說明X86 推理是指 開發(fā)機X86 CPU/GPU上針對不同階段的模型ONNX模型、Hbir模型和hbm模型進行相應的推理驗證。絕大多數(shù)的推理驗證不需要實際開發(fā)板但是使用hbm_infer需要board_ip來連續(xù)開發(fā)板。以下是工具鏈常見的幾種推理方式說明。ONNX模型HBRuntime推理庫HBRuntime是地平線提供的一套x86端模型推理庫支持PTQ鏈路各階段產(chǎn)出的ONNX模型進行推理并通過dict的數(shù)據(jù)格式傳入推理接口中。使用流程詳見如下鏈HBRuntime推理庫。使用示例如下import numpy as np # 加載地平線依賴庫 from horizon_tc_ui.hb_runtime import HBRuntime # 準備模型運行的輸入此處input.npy為處理好的數(shù)據(jù) data np.load(input.npy) # 加載模型文件根據(jù)實際模型進行設置 # ONNX模型 sess HBRuntime(model.onnx) # 獲取輸入輸出節(jié)點名稱 input_names sess.input_names output_names sess.output_names # 準備輸入數(shù)據(jù)根據(jù)實際輸入類型和layout進行準備配置格式要求為字典形式輸入名稱和輸入數(shù)據(jù)組成鍵值對 # 如模型僅有一個輸入 input_feed {input_names[0]: data} # 直接獲取字符串列表 # 如模型有多個輸入 input_feed {input_names[0]: data1, input_names[1]: data2} # 進行模型推理推理的返回值是一個list依次與output_names指定名稱一一對應 output sess.run(output_names, input_feed)ORTExecutorORTExecutor 是 HMCTHorizon Model Convert Toolkit提供的 ONNX 模型推理封裝接口底層基于onnxruntime。import numpy as np import onnx from hmct.api import ORTExecutor # 1. 加載 ONNX 模型 onnx_model onnx.load(model.onnx) # 需要 onnx.ModelProto 對象 # 2. 創(chuàng)建 ORTExecutor executor ORTExecutor(onnx_model) # 3. 創(chuàng)建 Session session executor.create_session() # 4. 獲取輸入輸出信息 inputs executor.get_inputs() # list[NodeArg] outputs executor.get_outputs() # list[NodeArg] # 5. 推理返回 Dict[str, np.ndarray] input_feed {inputs[0].name: data)} # 通過 NodeArg.name 獲取 result executor.inference(input_feed) # Dict: {output_name: ndarray}Hbir 模型 (.bc)編譯器feed接口feed() 是 hbdk4.compiler 中 Function 對象的方法用于對 hbir即.bc 模型進行推理。接口信息詳見模型推理使用示例需要注意的是feed()只接受 np.ndarray 和 torch.Tensor 兩種 Python 對象類型。.npy的輸入數(shù)據(jù)不能直接傳給該接口需要先 np.load() 加載成 np.ndarray。該接口所需要的輸入格式和輸出格式一致均包裝成字典。使用示例如下import numpy as np from hbdk4.compiler import load # 加載 BC 模型 model load(model.bc) fn model.functions[0] # 查看輸入輸出信息 for i in fn.flatten_inputs: print(f輸入: {i.name}, shape{i.type.shape}, dtype{i.type.torch_dtype}) for o in fn.flatten_outputs: print(f輸出: {o.name}, shape{o.type.shape}, dtype{o.type.torch_dtype}) # 從 npy 文件加載輸入數(shù)據(jù) input_data np.load(input.npy) # 準備輸入并推理 output fn.feed({fn.flatten_inputs[0].name: input_data}) # output 是 Dict[str, np.ndarray] print(output[fn.flatten_outputs[0].name].shape)HBRuntime推理庫HBRuntime是地平線提供的一套x86端模型推理庫支持對轉換過程中產(chǎn)出的HBIRbc模型進行推理并通過dict的數(shù)據(jù)格式傳入推理接口中。使用流程詳見如下鏈HBRuntime推理庫。推理的原理是基于hbdk4 的 load() function.feed()。因此需要注意hbdk的版本是否匹配。使用示例如下import numpy as np # 加載地平線依賴庫 from horizon_tc_ui.hb_runtime import HBRuntime # 準備模型運行的輸入此處input.npy為處理好的數(shù)據(jù) data np.load(input.npy) # 加載模型文件根據(jù)實際模型進行設置 # HBIR模型 sess HBRuntime(model.bc) # 獲取輸入輸出節(jié)點名稱 input_names sess.input_names output_names sess.output_names # 準備輸入數(shù)據(jù)根據(jù)實際輸入類型和layout進行準備配置格式要求為字典形式輸入名稱和輸入數(shù)據(jù)組成鍵值對 # 如模型僅有一個輸入 input_feed {input_names[0]: data} # 如模型有多個輸入 input_feed {input_names[0]: data1, input_names[1]: data2} # 進行模型推理推理的返回值是一個list依次與output_names指定名稱一一對應 output sess.run(output_names, input_feed)hrt_model_exec使用 X86 版本的 hrt_model_exec 工具進行模型信息查看和單幀推理支持推理 quantized.bc 模型及 hbm 模型相同quantized.bc編譯的hbm可以使用相同輸入文件進行推理。hrt_model_exec詳細介紹與使用示例請參考 hrt_model_exec工具介紹 。該工具推理功能支持多輸入模型的推理支持圖片輸入、二進制文件輸入、文本文件輸入及NumPy數(shù)組文件輸入輸入數(shù)據(jù)用逗號隔開。 模型的輸入信息可以通過 model_info 進行查看。hrt_model_exec工具模型輸入說明詳見模型輸入說明章節(jié)。X86 仿真環(huán)境使用 hrt_model_exec 工具推理 quantized.bc但需要 hbdk4相關的庫 和 hrt_model_execUCP的版本要匹配如UCP 3.14.7 配套 HBDK 4.9.7。需要注意的是板端的hrt_model_exec不支持推理quantized.bc。# 1、不加 dump只跑推理看時間 # --frame_count 1 只跑一幀 default為200 hrt_model_exec infer --model_file simple_quantized_model.bc --input_file input.npy --frame_count 1 # 2、加 dump需要驗證一致性的時候額外保存輸入輸出文件 hrt_model_exec infer \ --model_file simple_quantized_model.bc \ --input_file input.npy \ --frame_count 1 \ --enable_dump true \ --dump_path /tmp/output_dir # 3、該工具還支持反量化輸出和去除 Padding hrt_model_exec infer \ --model_file model.bc \ --input_file input.npy \ --frame_count 1 \ --enable_dump true \ --dequantize_process true \ --remove_padding_process true該命令還有以下兩個關鍵的參數(shù)配置--dump_format來控制模型的輸出格式默認為bin的輸出。--dump_precision控制txt 格式時的小數(shù)精度默認 9 位。其他參數(shù)配置詳見參數(shù)說明章節(jié)。UCP推理庫(C)注意X86 上推理hbm是指令級仿真速度非常慢。推薦推理 quantized.bc定點部分和 hbm 二進制一致。使用 UCP 推理接口進行驗證代碼的開發(fā)支持推理 quantized.bc 模型及 hbm 模型。UCP 仿真庫接口與嵌入式接口完全一致只是采用了不同的編譯配置。X86 仿真環(huán)境使用 UCP 推理接口推理 hbm 模型前需要設置 HB_UCP_SIM_PLATFORM_TYPE 環(huán)境變量用以指定要模擬的 BPU 架構。板端鏈接deps_aarch64/ucp/lib/libhbucp.so X86鏈接 deps_x86/ucp/lib/libhbucp.so ← 換這個 # 1. 設置仿真平臺類型必需否則不知道仿真哪個架構 export HB_UCP_SIM_PLATFORM_TYPEnash-e # J6E # export HB_UCP_SIM_PLATFORM_TYPEnash-m # J6MUCP 推理接口使用示例請參考 模型推理應用開發(fā)指導 章節(jié)。hbm 模型注意X86 上推理hbm是指令級仿真速度非常慢。推薦推理 quantized.bc定點部分和 hbm 二進制一致。因此只建議使用3.1節(jié)的方式進行推理。其他方法僅做示例補充了解即可。hbm_inferhbm_infer是一個X86板端聯(lián)合通信模式的Validation工具在X86端使用Python代碼做模型前后處理工作由板端Server執(zhí)行實際推理過程用于提升模型精度評測效率降低開發(fā)成本。和其他的python推理接口一樣傳入的數(shù)據(jù)形狀只需要和模型的輸入validShape 一致即可不需要padding。使用流程詳見如下鏈接hbm_infer工具用戶只需傳 host local_hbm_path 即可一鍵完成 SSH部署 文件上傳 gRPC連接。使用demo如下import time import torch from hbm_infer.hbm_rpc_session import HbmRpcSession def run_hbm_infer(run_epoch10): # 創(chuàng)建session sess HbmRpcSession( hostavailable_ip, local_hbm_pathlocal_hbm_path ) # 準備輸入數(shù)據(jù) input_data { img: torch.ones((1, 3, 224, 224), dtypetorch.int8) } # 執(zhí)行推理并返回結果 for i in range(run_epoch): output_data sess(input_data) print([output_data[k].shape for k in output_data]) # 關閉server sess.close_server() if __name__ __main__: run_hbm_infer()使用該工具推理需要注意輸入的合法性檢查以及數(shù)據(jù)預處理相關操作合法檢查名稱檢查input dict 的 key 必須與 get_input_info() 返回的輸入名稱完全匹配。類型檢查不顯式做數(shù)據(jù)類型強制轉換需要用戶保證 tensor_type與模型預期一致。shape 檢查需要用戶確保 shape 與模型的 valid_shape 匹配動態(tài)維度用 input_valid_shape 或 input_stride 指定。數(shù)據(jù)預處理建議對于 NV12 等 Pyramid/Resizer 輸入hbm_infer 不會自動做顏色空間轉換或歸一化用戶需按 input_type_rt 準備好數(shù)據(jù)如將 RGB 轉為 Y/UV 分量的 NV12 格式。如果配置了 mean_value/scale_value這些歸一化由模型內(nèi)部完成用戶不需要手動減均值除方差。編譯器feed接口不推薦feed() 是 hbdk4.compiler 中 Function 對象的方法用于對hbm模型進行推理。接口信息詳見模型推理使用示例具體使用方式和輸入輸出信息和見本文21節(jié)。針對該接口的輸入的合法性檢查以及數(shù)據(jù)預處理需注意合法檢查由 hbdk runtime 做數(shù)據(jù)類型校驗輸入的 numpy dtype 必須與模型預期的 tensor_type 兼容。Shape 校驗靜態(tài)維度必須完全匹配動態(tài)維度同樣需要滿足 shape 約束不匹配時會拋出異常。數(shù)量校驗輸入 tensor 的數(shù)量必須與模型定義一致。沒有隱式的布局轉換NCHW/NHWC需要用戶按模型預期準備。數(shù)據(jù)預處理同 hbm_infer的相關方式。HBRuntime推理庫不推薦HBRuntime是地平線提供的一套x86端模型推理庫支持對地平線工具鏈轉換過程中產(chǎn)出的HBM模型進行推理并通過dict的數(shù)據(jù)格式傳入推理接口中。HBRuntime是X86端推理庫你傳入的數(shù)據(jù)形狀只需要和模型的輸入一致即可不需要padding。使用流程詳見如下鏈HBRuntime推理庫。HB_HBMRuntime 底層會加載 hbdk4-runtime 的動態(tài)庫因此需要注意hbdk的版本是否匹配。使用示例如下import numpy as np # 加載地平線依賴庫 from horizon_tc_ui.hb_runtime import HBRuntime # 準備模型運行的輸入此處input.npy為處理好的數(shù)據(jù) data np.load(input.npy) # 加載模型文件根據(jù)實際模型進行設置 # HBM模型 sess HBRuntime(model.hbm) # 獲取輸入輸出節(jié)點名稱 input_names sess.input_names output_names sess.output_names # 準備輸入數(shù)據(jù)根據(jù)實際輸入類型和layout進行準備配置格式要求為字典形式輸入名稱和輸入數(shù)據(jù)組成鍵值對 # 如模型僅有一個輸入 input_feed {input_names[0]: data} # 如模型有多個輸入 input_feed {input_names[0]: data1, input_names[1]: data2} # 進行模型推理推理的返回值是一個list依次與output_names指定名稱一一對應 output sess.run(output_names, input_feed)合法檢查輸入 tensor 數(shù)量檢查feed dict 中提供的輸入數(shù)量必須與模型輸入數(shù)量一致。輸入名稱匹配feed 的 key 必須匹配模型注冊的輸入名稱。數(shù)據(jù)類型對齊如果 feed 的數(shù)據(jù)類型與模型預期的 tensor_type 不匹配runtime 會嘗試隱式轉換或報錯。Shape 校驗靜態(tài) shape 必須完全匹配動態(tài) shape 需要滿足 valid_shape 約束。數(shù)據(jù)預處理同 hbm_infer的相關方式。hrt_model_exec僅推薦模型信息查看hrt_model_exec使用方式和板端相同但需要配置HB_UCP_SIM_PLATFORM_TYPE環(huán)境變量用以指定要模擬的 BPU 架構具體可參考hrt_model_exec infer使用示例。# 推理hbm需要設置仿真平臺 export HB_UCP_SIM_PLATFORM_TYPEnash-e # J6E # export HB_UCP_SIM_PLATFORM_TYPEnash-m # J6M推理接口的詳細鏈接如下模型推理鑒于 hbm 在 X86 端推理速度較慢因此只建議在 X86端查看model_info。具體可參考hrt_model_exec model_info使用示例