본문 바로가기
기타 공부

[BitNet] i2_s 빌드 :: BitNet i2_s 모델, Termux에서 정상 구동까지의 실전 빌드 기록

by 으노으뇨 2026. 3. 22.
728x90
반응형
SMALL

지금 비트넷을 스마트폰에 넣고있는데 ㅠㅠㅠ

  • BitNet 전용 커널 소스
  • 모델 파라미터 자동 생성기
  • ggml/llama.cpp 기반 엔진 패치


그런데 Termux 환경에서는

sentencepiece 빌드 실패
gguf-py 실패
bitnet-kernel 자동생성 실패
include 헤더 404 Not Found
심볼릭 링크 깨짐
Clang21 정책 에러
C++ const 문제
AArch64 매크로 누락
GGML 내부 정책 차이

이런 난관이 생겨서 정상 build 경로가 거의 불가능했다...


헤더 직접 생성
커널 파라미터 직접 삽입
ggml 소스 패치
커스텀 gemm-config 제작
ARM 최적화 매크로 수동 정의를 통해 진행가능하다.

그리고 가장중요한 tl1,tl2로 빌드하고 모델은 i2_s로 돌리려니 엉뚱한 답변나왔었다.

막상 Termux에서 BitNet-b1.58-2B-4T(i2_s) 모델을 실행하면…
adrenal exclude import74 fine outside reshigen ...

이런 이상한 랜덤 영어 단어만 뱉어서 충격을 받았다.
문제가 뭔지 한참을 파고들다가 결국 원인을 찾았고,
정상적인 문장 출력까지 성공했다.

결론부터 말하자면:


i2_s 모델은 모델만 받아와서는 절대 정상 동작하지 않는다.
반드시 codegen_tl1.py로 LUT + kernel_config를 재생성해줘야 한다.

이 과정을 공식 문서에서는 알려주지 않기 때문에 여기 기록으로 남겨둔다…


이렇게 진행해보겠다...

#############################################
# BitNet-b1.58-2B-4T (i2_s) Termux 원샷 스크립트
#  - Git clone
#  - LUT 코드 생성 (codegen_tl1.py, 3B 셰이프 사용)
#  - Clang/chrono 패치
#  - cmake + ninja 빌드
#  - i2_s GGUF 다운로드
#  - 테스트 실행 (llama-cli)
#############################################

# 에러 발생 시 바로 중단
set -e

# 간단한 에러 체크 함수
fail_check() {
    if [ $? -ne 0 ]; then
        echo -e "\e[1;31m[!] 실패: $1\e[0m"
        exit 1
    else
        echo -e "\e[1;32m[✔] 성공: $1\e[0m"
    fi
}

echo -e "\e[1;34m[1/7] 프로젝트 디렉터리 준비 및 BitNet 클론\e[0m"
mkdir -p ~/projects
cd ~/projects

rm -rf BitNet
git clone --recursive https://github.com/microsoft/BitNet.git
fail_check "BitNet 저장소 클론"

cd BitNet
git submodule update --init --recursive
fail_check "llama.cpp 서브모듈 초기화"

echo -e "\e[1;34m[2/7] Python 의존성(최소) 설치\e[0m"
# Termux 기준 (이미 설치되어 있으면 무시)
# pkg update -y
# pkg install python clang cmake ninja git -y

python3 -m pip install --upgrade pip
python3 -m pip install numpy pyyaml tqdm
fail_check "numpy / pyyaml / tqdm 설치"

echo -e "\e[1;34m[3/7] include 디렉터리 및 gemm-config.h 구성\e[0m"
mkdir -p include

# ggml-bitnet-mad.cpp, ggml-aarch64.c에서 요구하는 GEMM/블록 설정
cat > include/gemm-config.h << 'EOF'
#ifndef GEMM_CONFIG_H
#define GEMM_CONFIG_H

// GEMM 타일 설정 (필요시 튜닝 가능)
#define BM 160
#define BK 64
#define wm 32
#define wn 32

// BitNet MAD 커널 병렬 처리 크기
#define PARALLEL_SIZE 4

// AArch64용 ggml-aarch64.c 블록 크기
#define ROW_BLOCK_SIZE 32
#define COL_BLOCK_SIZE 32

#endif // GEMM_CONFIG_H
EOF
fail_check "gemm-config.h 생성"

echo -e "\e[1;34m[4/7] codegen_tl1.py로 LUT 및 커널 설정 생성 (3B 셰이프 활용)\e[0m"
# 공식 블로그(Spring13)와 동일하게 3B 셰이프를 이용하여
# bitnet-lut-kernels.h 및 kernel_config.ini 를 생성하고,
# 이를 2B-4T i2_s 모델과 함께 사용한다.
python3 utils/codegen_tl1.py \
  --model bitnet_b1_58-3B \
  --BM 160,320,320 \
  --BK 64,128,64 \
  --bm 32,64,32
fail_check "bitnet-lut-kernels.h / kernel_config.ini 코드 생성"

echo -e "\e[1;34m[5/7] Clang 21 / Termux 전용 패치 적용\e[0m"

# Clang 21의 const 시그니처 관련 경고/에러 회피
sed -i 's/void ggml_compute_forward_get_rows_i2_s(struct ggml_compute_params/void ggml_compute_forward_get_rows_i2_s(const struct ggml_compute_params/g' \
    3rdparty/llama.cpp/ggml/src/ggml.c || true

sed -i 's/void ggml_compute_forward_mul_mat_i2_s(struct ggml_compute_params/void ggml_compute_forward_mul_mat_i2_s(const struct ggml_compute_params/g' \
    3rdparty/llama.cpp/ggml/src/ggml.c || true

# Termux / Android 에서 high_resolution_clock 이슈 회피
sed -i 's/std::chrono::high_resolution_clock/std::chrono::steady_clock/g' \
    3rdparty/llama.cpp/common/common.cpp || true

sed -i 's/std::chrono::high_resolution_clock/std::chrono::steady_clock/g' \
    3rdparty/llama.cpp/common/log.cpp || true

fail_check "Clang / chrono 패치"

echo -e "\e[1;34m[6/7] cmake + ninja 빌드 (BitNet i2_s 엔진 컴파일)\e[0m"
mkdir -p build
cd build
rm -rf *

cd ~/projects/BitNet/build
rm -rf *

cmake .. -G Ninja \
  -DCMAKE_C_COMPILER=clang \
  -DCMAKE_CXX_COMPILER=clang++ \
  -DCMAKE_BUILD_TYPE=Release \
  -DLLAMA_NATIVE=ON \
  -DLLAMA_LTO=ON \
  -DLLAMA_F16C=OFF \
  -DLLAMA_MP=OFF \
  -DGGML_OPENMP=ON \
  -DGGML_BLAS=OFF \
  -DBITNET_ARM_DOTPROD=ON \
  -DLLAMA_BUILD_SERVER=OFF \
  -DLLAMA_BUILD_EXAMPLES=ON
fail_check "CMake 구성"

# 멀티코어 빌드, 실패 시 단일 스레드 재시도
ninja || ninja -j 1
fail_check "닌자 빌드"

echo -e "\e[1;34m[7/7] BitNet-b1.58-2B-4T i2_s 모델 다운로드 및 테스트 실행\e[0m"
cd ~/projects/BitNet

mkdir -p models/BitNet-b1.58-2B-4T

# Hugging Face 공개 GGUF (i2_s) 다운로드
wget -c \
  https://huggingface.co/microsoft/BitNet-b1.58-2B-4T-gguf/resolve/main/ggml-model-i2_s.gguf \
  -O models/BitNet-b1.58-2B-4T/ggml-model-i2_s.gguf
fail_check "ggml-model-i2_s.gguf 다운로드"

echo -e "\e[1;32m[✔] 모든 준비 완료! 이제 테스트 추론을 실행합니다.\e[0m"

~/projects/BitNet/build/bin/llama-cli \
  -m ~/projects/BitNet/models/BitNet-b1.58-2B-4T/ggml-model-i2_s.gguf \
  -p "Hello from BitNet on Termux! Please introduce yourself." \
  -n 128 \
  -t 6
#############################################
``
728x90
반응형
LIST

댓글