tvm.meta_schedule — tvm 0.20.dev0 documentation
MetaSchedule 通過在調優過程中運行不同的 schedule 配置,能夠計算每個 operator 的執行時間。
在每個 operator 的調優過程中,MetaSchedule 會根據不同的調度策略進行多次測試,並提供每個策略的 成本模型 或 實際執行時間。這樣,你可以知道每個 operator 在不同的硬體或配置下的效能表現,並進一步確定哪些 operator 是效能瓶頸。
將調優過程與 TVM Dashboard 結合使用,能清楚地看到每個 operator 的執行時間和效能指標,這對於定位瓶頸非常有幫助。MetaSchedule 可以產生具體的時間記錄,顯示每個 operator 及其排程策略的效能數據。
MetaSchedule 在調優過程中會嘗試多種排程(schedule)策略,並對每個策略進行評估。如果某個 operator 在特定配置下表現不佳,MetaSchedule 會自動搜尋其他可能的調度方式,直到找到最佳方案,這可以有效降低瓶頸問題。
調優完成後,MetaSchedule 會返回每個 operator 的 最佳執行策略,並顯示其在硬體上的性能數據。這使你能夠精確地了解哪些 operator 對整體效能有最大的影響,並可以針對這些瓶頸進行優化。
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"
ExtractedTask 用來描述從原始計算圖中「提取」出來的需要進行調優優化的單一任務或子任務。其重點如下: