- lm.rs는 Rust로 CPU에서 로컬 언어 모델 추론을 실행하는 프로젝트이며, ML 라이브러리 없이 전체 추론을 수행하는 최소 코드 구현을 목표로 함
- Karpathy의 llama2.c와 llm.c에서 영감을 받았고, 초기에는 Google Gemma 2만 지원했지만 Llama 3.2와 PHI-3.5 이미지 입력 지원까지 확장됨
- 최신 변경으로 배치 처리가 구현되어 이미지 인코딩 속도가 최대 약 3배 빨라졌고, Llama 3.2 1B는 작성자의 16코어 머신에서 50 tok/s로 실행됨
- 준비된 모델은 Hugging Face에서 받을 수 있으며, README는 Q8_0 사용을 권장하고 Q4_0 양자화는 아직 개선 중이라고 밝힘
- 사용자는 LMRS 형식 모델과 토크나이저를 내려받아 바로 빌드하거나, Hugging Face의 원본 모델 파일을 export.py와 tokenizer.py로 변환해 실행할 수 있음
lm.rs가 목표로 하는 것
- lm.rs는 Rust로 작성된 로컬 CPU 기반 언어 모델 추론 구현체임
- 목표는 ML 라이브러리 없이 CPU에서 언어 모델의 전체 추론을 수행하는 최소 코드 구현임
- Karpathy의 llama2.c와 llm.c에서 영감을 받음
- README는 현재 코드가 “그렇게 최소는 아니며”, 일부 코드는 최적화와 개선 여지가 있다고 밝힘
- 프로젝트는 작성자가 Rust를 처음 써보기 위한 계기이기도 함
지원 모델과 멀티모달 확장
- 초기에는 Google Gemma 2 모델만 지원했지만, 이후 Llama 3.2 모델 지원이 추가됨
- 최근에는 PHI-3.5를 통해 이미지 사용 옵션이 추가됨
- 현재 강조되는 지원 항목
- PHI-3.5-vision 모델을 통한 멀티모달 지원
- PHI-3.5-mini 텍스트 전용 모델 지원
- 관련 리소스
성능과 준비된 모델
- 최신 뉴스로 배치 처리가 구현되어 이미지 인코딩 속도가 최대 약 3배 향상됨
- Llama 3.2 1B는 작성자의 16코어 머신에서 50 tok/s로 실행됨
- 준비된 모델과 토크나이저는 Hugging Face에서 받을 수 있음
- 속도 측정은 16코어 AMD Epyc에서 수행됨
- README는 Q8_0 사용을 권장하며, Q4_0 양자화는 아직 개선 중이라고 밝힘
-
준비된 모델 표
- Gemma 2 2B IT Q4_0: 1.39G, 20 tok/s
- Gemma 2 2B IT Q8_0: 2.66GB, 24 tok/s
- Gemma 2 9B IT Q4_0: 4.91GB, 7 tok/s
- Gemma 2 9B IT Q8_0: 9.53GB, 8 tok/s
- Llama 3.2 1B IT: 4.94GB, 21 tok/s
- Llama 3.2 1B IT Q8_0: 1.27GB, 50 tok/s
- Llama 3.2 3B IT Q4_0: 1.71GB, 17 tok/s
- Llama 3.2 3B IT Q8_0: 3.31GB, 19 tok/s
- PHI 3.5 IT Vision Q8_0: 4.28GB, 17 tok/s
- PHI 3.5 IT Mini Q8_0: 3.94GB, 18 tok/s
모델 변환 흐름
- 준비된 양자화 모델과 토크나이저를 Hugging Face에서 받으면 변환 과정을 건너뛸 수 있음
- Google 또는 Meta가 Hugging Face에 공개한 모델을 직접 변환하려면 추가 Python 의존성을 설치해야 함
pip install -r requirements.txt
- 원본 모델 페이지에서 .safetensors와 config.json 파일을 내려받아 사용함
- PHI3.5 Vision 같은 멀티모달 모델에는 CLIP config 파일도 필요함
export.py는 bfloat16 가중치를 LMRS 형식으로 변환함
python export.py --files [ordered .safetensor files] --config [model config.json] --save-path [name and path to save] --type [model type (GEMMA/LLAMA/PHI)]
- 양자화 버전을 내보내려면 --quantize와 --quantize-type 플래그를 사용함
- int8 양자화 모델 크기는 그룹 크기에 따라 약 9.8G에서 약 2.5G로 줄어들 수 있음
- 멀티모달 모델은 --vision-config 인자를 포함해야 함
tokenizer.py는 토크나이저 모델을 LMRS 토크나이저 형식으로 변환함
python tokenizer.py --model-id [huggingface model_id] --tokenizer-type [type of the tokenizer (GEMMA/LLAMA/PHI)]
빌드와 실행
- Rust 코드는
cargo로 컴파일하며, README는 target-cpu 플래그 전달을 명시함
RUSTFLAGS="-C target-cpu=native" cargo build --release --bin chat
- 멀티모달 기능을 활성화하려면 --features multimodal 인자를 추가함
- 기본 실행은 모델 가중치 파일을 지정해 수행함
./target/release/chat --model [model weights file]
- 추가 인자로 tokenizer, temperature, top-p, show-metrics 등을 사용할 수 있음
- 사용 가능한 인자는 --help로 확인함
- 멀티모달 모델에서는 --image 인자로 이미지 경로를 지정함
- PHI3.5-vision 사용 시 README는 temperature 0을 권장함
WebUI 백엔드 실행
- WebUI용 백엔드를 실행하려면 backend 기능으로 컴파일함
RUSTFLAGS="-C target-cpu=native" cargo build --release --features backend --bin backend
- 멀티모달 백엔드는 backend-multimodal 기능을 활성화함
- 백엔드는 모델 가중치 파일을 지정해 실행함
./target/release/backend --model [model weights file]
- --ip와 --port로 IP와 포트를 변경할 수 있음
- temperature 같은 추가 플래그도 사용할 수 있음
- 멀티모달 호환성에는 --multimodal 플래그를 사용함
- 실행 후 웹 인터페이스로 연결할 수 있음
TODO 상태와 라이선스
- 완료된 항목
- 다른 샘플링 방법 추가
- 9B와 27B 모델 테스트 항목 중 9B 테스트 완료, 27B는 너무 느릴 것으로 표시
- 멀티헤드 어텐션 루프 병렬화
- 성능 지표 추가
- int8, int4 양자화 지원
- 남은 항목
- 라이선스는 MIT임