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
'기타 공부' 카테고리의 다른 글
| [Termux] Termux + PRoot 환경과 Docker 비교 분석 (0) | 2026.04.21 |
|---|---|
| [Hugging Face] 허깅페이스 토큰발급받기 (0) | 2026.04.20 |
| [BitNet빌드]BitNet Ninja Build Error 증상 및 해결방법 (0) | 2026.03.22 |
| [Remix IDE] Remix와 Git 연동하기 / Remix에 git 리파지토리 올리기 (0) | 2022.12.07 |
| Open JDK 설치 / OperatingSystemMXBean 인터페이스 (0) | 2022.11.16 |
댓글