在模型結構優化與部署量化過程中,開發者往往會遇到一個關鍵任務:基於歷史 Badcase 數據驗證模型精度變化,確保模型修改不會引入明顯性能退化。 這類驗證常見於感知、預測、行為識別等任務,尤其在客户交付或精度迴歸過程中十分關鍵。
但實際場景中,Badcase 的來源和管理非常複雜:
- 數據常常分散在客户服務器;
- 有些數據是動態生成、無法導出;
- 板端資源有限,難以長期駐留模型或數據。
為此,地平線工具鏈圍繞量化後的模型,提供了三種可選的精度驗證方案,分別適配不同類型的項目需求。
一、三種 Badcase 精度驗證方案
1.1 方案一:仿真推理(Simulate Inference)
使用量化過程生成的與 hbm 等效的 .bc 模型,在服務端模擬 BPU 行為進行推理,無需依賴硬件設備。
-
優點:
- 無需開發板,部署輕量;
- 適合多模型結構快速迭代驗證;
-
缺點:
- 本地仿真推理因為缺少了專用板端硬件參與,速度相對較差。
適用場景:早期算法開發、模型結構調整的初步驗證。
1.2 方案二:本地數據,遠程推理(hbm_infer 協同執行)
基於 hbm_infer 模塊,服務端將輸入數據通過 RPC 接口發送至板端,調用 HBM 模型進行真實硬件推理,結果再返回服務端進行分析。
-
優點:
- 數據留在服務端,可動態調度;
- 使用板端 硬件推理,速度較快,且度評估基於真實 BPU,結果可靠;
-
缺點:
- 網絡帶寬影響推理效率;
- 需依賴板端資源;
適用場景:Badcase 動態生成、服務端數據不便遷移、對驗證速度存在較大需求 、真實精度驗證。
1.3 方案三:板端本地驗證(純離線推理)
通過 NFS 或本地掛載方式將全部數據傳輸到板端,在板端離線完成所有推理與驗證工作。
-
優點:
- 推理速度最快,完全無網絡瓶頸;
- 精度結果與部署完全一致;
-
缺點:
- 需預先準備所有測試數據;
- 動態輸入或在線調試能力較弱
- 重度需依賴板端資源;
適用場景:靜態 Badcase 精度評估、大規模離線驗證、交付測試。
二、三方案對比一覽
三、為什麼重點介紹方案二?
儘管三種方案各有應用空間, 在目前發佈的 OE 包與官方示例中,對方案一/三已有説明與案例,而方案二雖然支持面廣、功能強大,卻缺少系統化教程,另外方案二 hbm_infer 是目前唯一能同時滿足以下需求的解決方案:
- 數據無需遷移:Badcase 可在服務器本地組織;
- 推理結果真實可信:完全基於硬件板端執行;
- 部署過程存在一定複雜度:但可高度自動化,適合通用集成;
本文將聚焦方案二的 hbm_infer 使用流程,提供完整、可運行的代碼模板,幫助你快速構建服務端 + 板端協同驗證框架。
四、 hbm_infer 使用指南(方案二)
4.1 安裝依賴
# 安裝核心組件
1. hbm_infer的使用依賴算法工具發佈的docker環境,因此在使用hbm_infer前需要先構建後DOCKER環境,然後在容器中安裝hbm_infer組件
2. 在NDA支持下獲取hbm_infer python安裝包,進入docker環境後使用pip install 安裝後使用
4.2 常規模式示例:開發調試推薦
import torch
import time
from hbm_infer.hbm_rpc_session import HbmRpcSession
def test_hbm_infer():
hbm_model = HbmRpcSession(
host="192.168.1.100", # 板端 IP
local_hbm_path="./model.hbm"
)
hbm_model.show_input_output_info()
data = {
"input_0_y": torch.randint(0, 256, (1, 512, 960, 1), dtype=torch.uint8),
"input_0_uv": torch.randint(0, 256, (1, 256, 480, 2), dtype=torch.uint8),
}
begin = time.time()
for _ in range(10):
outputs = hbm_model(data)
print({k: v.shape for k, v in outputs.items()})
print(f"Avg time: {round((time.time()-begin)*1000 / 10, 2)} ms")
hbm_model.close_server()
if __name__ == "__main__":
test_hbm_infer()
4.3 Flexible 模式示例:多線程/多模型推薦
from hbm_infer.hbm_rpc_session_flexible import (
HbmRpcSession, init_server, deinit_server, init_hbm, deinit_hbm
)
import torch, time
def test_flexible():
server = init_server(host="192.168.1.100")
handle = init_hbm(hbm_rpc_server=server, local_hbm_path="./model.hbm")
hbm_model = HbmRpcSession(hbm_rpc_server=server, hbm_handle=handle)
data = {
"input_0_y": torch.randint(0, 256, (1, 512, 960, 1), dtype=torch.uint8),
"input_0_uv": torch.randint(0, 256, (1, 256, 480, 2), dtype=torch.uint8),
}
begin = time.time()
for _ in range(10):
outputs = hbm_model(data)
print({k: v.shape for k, v in outputs.items()})
print(f"Avg time: {round((time.time()-begin)*1000 / 10, 2)} ms")
hbm_model.close_server()
deinit_hbm(handle)
deinit_server(server)
if __name__ == "__main__":
test_flexible()
五、小貼士:提高推理效率的建議
- 板端與服務端建議處於同網段或直連,降低傳輸延遲;
- 對於批量推理任務,可提前批量加載數據並串行發送;
- 支持
with_profile=True打開性能日誌分析;