动态

详情 返回 返回

三種 Badcase 精度驗證方案詳解與 hbm_infer 部署實錄 - 动态 详情

在模型結構優化與部署量化過程中,開發者往往會遇到一個關鍵任務:​基於歷史 Badcase 數據驗證模型精度變化​,確保模型修改不會引入明顯性能退化。 這類驗證常見於感知、預測、行為識別等任務,尤其在客户交付或精度迴歸過程中十分關鍵。

但實際場景中,Badcase 的來源和管理非常複雜:

  • 數據常常​分散在客户服務器​;
  • 有些數據是​動態生成、無法導出​;
  • 板端資源有限,難以長期駐留模型或數據。

為此,地平線工具鏈圍繞量化後的模型,提供了三種可選的精度驗證方案,分別適配不同類型的項目需求。

一、三種 Badcase 精度驗證方案

1.1 方案一:仿真推理(Simulate Inference)

使用量化過程生成的與 hbm 等效的 .bc 模型,在服務端模擬 BPU 行為進行推理,無需依賴硬件設備。

  • 優點​:

    • 無需開發板,部署輕量;
    • 適合多模型結構快速迭代驗證;
  • 缺點​:

    • 本地仿真推理因為缺少了專用板端硬件參與,速度相對較差。
適用場景​:早期算法開發、模型結構調整的初步驗證。

1.2 方案二:本地數據,遠程推理(hbm_infer 協同執行)

基於 hbm_infer 模塊,服務端將輸入數據通過 RPC 接口發送至板端,調用 HBM 模型進行真實硬件推理,結果再返回服務端進行分析。

  • 優點​:

    • 數據留在服務端,可動態調度;
    • 使用板端 硬件推理,速度較快,且度評估基於真實 BPU,結果可靠;
  • 缺點​:

    • 網絡帶寬影響推理效率;
    • 需依賴板端資源;
適用場景​:Badcase 動態生成、服務端數據不便遷移、對驗證速度存在較大需求 、真實精度驗證。

1.3 方案三:板端本地驗證(純離線推理)

通過 NFS 或本地掛載方式將全部數據傳輸到板端,在板端離線完成所有推理與驗證工作。

  • 優點​:

    • 推理速度最快,完全無網絡瓶頸;
    • 精度結果與部署完全一致;
  • 缺點​:

    • 需預先準備所有測試數據;
    • 動態輸入或在線調試能力較弱
    • 重度需依賴板端資源;
適用場景​:靜態 Badcase 精度評估、大規模離線驗證、交付測試。

二、三方案對比一覽

image.png

三、為什麼重點介紹方案二?

儘管三種方案各有應用空間, 在目前發佈的 OE 包與官方示例中,​對方案一/三已有説明與案例​,而​方案二雖然支持面廣、功能強大,卻缺少系統化教程​,另外方案二 ​hbm_infer​ 是目前唯一能同時滿足以下需求的解決方案​:

  1. 數據無需遷移​:Badcase 可在服務器本地組織;
  2. 推理結果真實可信​:完全基於硬件板端執行;
  3. 部署過程存在一定複雜度​:但可高度自動化,適合通用集成;

本文將聚焦方案二的 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 打開性能日誌分析;

六、總結建議

image.png

user avatar y_luoe_hai_61a734cbf3c94 头像 chaoshenjinghyperai 头像 leguandeludeng 头像 tecdat 头像 nick_58a54a169c75f 头像 hzyopsfuture 头像 kaiwudb 头像 youngcoding 头像 aurora700 头像 houbinbin 头像 jidcoo 头像 easynvr 头像
点赞 12 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.