--- 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
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.