--- title: t-mac hackmd: url: https://hackmd.io/6U2Ac9Z7QB2GfFBYtNcxPw title: t-mac lastSync: 2025-06-04T00:08:55.936Z --- ## T-MAC 論文筆記 - paper: [T-MAC: CPU Renaissance via Table Lookup for Low-Bit LLM Deployment on Edge](https://arxiv.org/html/2407.00088v1) - 研究背景與問題核心 - 在不依賴 GPU 的情況下高效推理 e.g. 手機晶片 - 過去:權重量化 e.g. 4-bit、2-bit、甚至 1-bit - 問題: - 推理時需反量化(dequantization) - 低位元權重轉回高精度格式(如 int8、float16)以進行矩陣乘法,會抵銷原本低位元帶來的加速與節能效果。 - 硬體不支援混合精度運算 - 硬體多為固定對稱精度,無法直接處理這類「低權重、高激活」的不對稱計算。 - T-MAC 的核心創新與貢獻 - 查找表(LUT)取代乘法運算 - T-MAC(Table-based Mixed-Precision Acceleration Core)徹底捨棄反量化與乘法運算,透過將矩陣乘法轉換為按位(bit-wise)查表 + 加法,極大地提升效率並降低功耗。 - 技術細節摘要: - 查表代替乘法:對激活向量與可能的 1-bit 權重組合做乘法,並將結果存入查找表。 - 查表駐留快取記憶體 - 查找表存放於寄存器或快取記憶體中(on-chip memory)。 - 實作了 軸重排(axis reordering) 和 記憶體交錯(interleaving),提升記憶體存取效率。 - 查找表壓縮(LUT Compression) - 鏡像壓縮(mirror consolidation):僅儲存正值,負值可直接對應為其相反數。 - 表格量化(table quantization):對表格內資料再量化,進一步減少空間需求。 ## 跑 T-MAC 程式 ``` export TMAC_ROOT=$(pwd) cd 3rdparty/tvm export TVM_SRC=$(pwd) export BUILD_DIR="$TVM_SRC/build" ``` ``` sudo apt update -y sudo apt install -y \ build-essential clang llvm-dev cmake ninja-build \ libzstd-dev libssl-dev zlib1g-dev libbz2-dev libreadline-dev \ libsqlite3-dev libffi-dev libxml2-dev liblzma-dev libgdbm-dev \ uuid-dev libnss3-dev ``` ``` STATIC_ZSTD=/usr/lib/x86_64-linux-gnu/libzstd.a if [[ -f "$STATIC_ZSTD" ]]; then echo "[info] Temporarily renaming libzstd.a → libzstd.a.bak to force dynamic linking" sudo mv "$STATIC_ZSTD" "${STATIC_ZSTD}.bak" fi ``` ``` rm -rf "$BUILD_DIR" mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" ``` ``` ZSTD_SO=$(ldconfig -p | grep libzstd.so | head -n1 | awk '{print $4}') cmake -G Ninja .. \ -DCMAKE_BUILD_TYPE=Release \ -DUSE_LLVM=llvm-config \ -DUSE_GRAPH_EXECUTOR=ON \ -DUSE_AUTO_SCHEDULER=ON \ -DZSTD_LIBRARY="$ZSTD_SO" \ -DZSTD_INCLUDE_DIR=/usr/include ``` - `ninja -j$(nproc)` - `export PYTHONPATH=$TVM_SRC/python:\$PYTHONPATH` - `export PATH=/home/alanhc/workspace/T-MAC/build/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin:$PATH` ``` export PATH=${TMAC_ROOT}/build/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin:$PATH export PYTHONPATH=${TMAC_ROOT}/3rdparty/tvm/python:$PYTHONPATH ```  [https://hackmd.io/@sysprog/linux-zerocopy](https://hackmd.io/@sysprog/linux-zerocopy) ## T-MAC 載入模型的機制 - https://deepwiki.com/search/_d0710710-bd94-4619-9b7d-492abce9c3c7 - https://deepwiki.com/search/homealanhcworkspacetmacdeployt_0f16804b-f25e-4c37-bebc-0e2867170003 - `kernel.cc` 如何被使用? - include/t-mac/tmac_gemm_wrapper.h - llama_cpp_init 會呼叫 preprocessor_int8,根據輸入的維度參數選擇合適的預處理器實現,例如 preprocessor_t1_int8_m17280_k3200_n1_b2。 - 編譯過程中產生的包裝函數 - 包裝函數會被寫入 kernels.h - deploy/compile.py - 流程 - 定義核心形狀 - 創建兩種程式碼產生器 - QGeMMLUTBitsCodegen -> 矩陣乘法 - QGeMMLUTBitsPreprocessorCodegen -> 預處理 - 編譯核心函數 - 產生配置文件 - kcfg.ini (核心參數) - 輸出 C/C++ 程式碼 - 產生的程式碼寫入 `kernels.h` 和 `kernels.cc`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up