tvm.meta_schedule — tvm 0.20.dev0 documentation

1. 評估每個 Operator 的執行時間

MetaSchedule 通過在調優過程中運行不同的 schedule 配置,能夠計算每個 operator 的執行時間。

2. 詳細的效能分析

在每個 operator 的調優過程中,MetaSchedule 會根據不同的調度策略進行多次測試,並提供每個策略的 成本模型實際執行時間。這樣,你可以知道每個 operator 在不同的硬體或配置下的效能表現,並進一步確定哪些 operator 是效能瓶頸。

3. 可視化瓶頸

將調優過程與 TVM Dashboard 結合使用,能清楚地看到每個 operator 的執行時間和效能指標,這對於定位瓶頸非常有幫助。MetaSchedule 可以產生具體的時間記錄,顯示每個 operator 及其排程策略的效能數據。

4. 選擇最佳調度策略

MetaSchedule 在調優過程中會嘗試多種排程(schedule)策略,並對每個策略進行評估。如果某個 operator 在特定配置下表現不佳,MetaSchedule 會自動搜尋其他可能的調度方式,直到找到最佳方案,這可以有效降低瓶頸問題。

5. 分析結果回饋

調優完成後,MetaSchedule 會返回每個 operator 的 最佳執行策略,並顯示其在硬體上的性能數據。這使你能夠精確地了解哪些 operator 對整體效能有最大的影響,並可以針對這些瓶頸進行優化。


實例(ExtractedTask, runner**, CostModel**)

import onnx
import tvm
from tvm import relax, tir, meta_schedule as ms
from tvm.relax.frontend.onnx import from_onnx
from tvm.target import riscv
import numpy as np

# 設定日誌級別(可查看詳細調優過程)
tvm.logging.set_level("INFO")

# ------------------------------
# 1. 模型導入與 Relax IR 轉換
# ------------------------------
onnx_model = onnx.load("model.onnx")
shape_dict = {"input": (1, 3, 224, 224)}
dtype_dict = {"input": "float32"}

# 轉換成 Relax IRModule
mod = from_onnx(onnx_model, shape_dict, dtype_dict)
params = {}  # 若有參數需替換為實際值

# ------------------------------
# 2. 精確 RISC-V RVV 目標定義
# ------------------------------
# 明確指定 CPU 型號與向量化支援
target = riscv.Target(
    "riscv64-unknown-linux-gnu",
    mcpu="thead-c906",  # 假設的實際硬體型號(如 C910/C908)
    features="+v,+m,+a,+f,+d",  # 啟用 RVV、乘法、原子、浮點、雙精度
)
assert target.features.has_v, "RVV 未啟用!"

# ------------------------------
# 3. 手動預優化:向量化與佈局調整
# ------------------------------
def manual_vectorization_optimization(mod):
    """強制對關鍵算子插入向量化調度"""
    for gv in mod.functions:
        func = mod[gv]
        # 範例:對名為 "T_add" 的算子強制向量化
        if "add" in gv.name_hint.lower():
            sch = tir.Schedule(func)
            loops = sch.get_loops(sch.get_block("T_add"))
            if len(loops) >= 1:
                sch.vectorize(loops[-1])  # 向量化最內層循環
                mod.update_func(gv, sch.mod["main"])
    return mod

# 應用手動優化 Pass
mod = manual_vectorization_optimization(mod)

# 算子融合與佈局轉換
mod = relax.transform.OperatorFusion(fuse_opt_level=3, fuse_vector_ops=True)(mod)
mod = relax.transform.AlterOpLayout({"nn.dense": ["NHWC", "HWCN"]})(mod)

# ------------------------------
# 4. MetaSchedule 自動調優(RISC-V 適配)
# ------------------------------
from tvm.meta_schedule.relax_integration import extract_tasks, tune_relax

############# 抽取調優任務(包含手動優化後的 IR)#############
tasks = extract_tasks(mod, params, target=target)

# 配置 RISC-V 專用 Runner(補償硬體波動)
runner = ms.runner.LocalRunner(
    evaluator_config=ms.runner.EvaluatorConfig(
        number=10,       # 增加測量次數
        repeat=3,        # 重複次數
        min_repeat_ms=500,  # 最小執行時間
        enable_cpu_cache_flush=True  # 清除快取以準確測量
    ),
    alloc_repeat=1       # 減少內存分配干擾
)

# 執行調優
database = tune_relax(
    mod=mod,
    target=target,
    params=params,
    work_dir="./riscv_tune_logs",
    max_trials_global=2048,      # 增加試驗次數
    num_trials_per_iter=64,
    runner=runner,
    ############### 啟用 RISC-V 專用特徵提取##############
    cost_model=ms.CostModel.create(
        kind="xgb",
        feature_type="per_store"  # 細粒度特徵分析
    )
)

# ------------------------------
# 5. 編譯與效能分析
# ------------------------------
# 編譯優化後模型
ex = relax.build(mod, target=target, database=database)

# 導出部署檔案(需 RISC-V 工具鏈支援)
ex.export_library("compiled_model.so")

# ------------------------------
# 6. Dashboard 整合分析
# ------------------------------
# 啟動 Dashboard 服務(另開終端執行)
# tvm-dashboard --work_dir=./riscv_tune_logs --port=8080

# ------------------------------
# 7. 硬體驗證(QEMU/實機)
# ------------------------------
# 在 RISC-V 設備或 QEMU 中運行:
# qemu-riscv64 -cpu thead-c906 -L /path/to/sysroot ./compiled_model.so
# 查看實際執行時間
#echo "Profiling Result:"
#cat /proc/cpuinfo | grep "cycles"

補充:

1. ExtractedTask

ExtractedTask 用來描述從原始計算圖中「提取」出來的需要進行調優優化的單一任務或子任務。其重點如下: