rwkv.cpp: RWKV-LM을 ggml 포맷으로 구현한 프로젝트
요약
RWKV-LM 아키텍처를 ggerganov의 ggml 포맷으로 구현한 프로젝트입니다. 이 프로젝트는 FP32, FP16 외에도 INT4, INT5, INT8 등 다양한 양자화된 추론을 지원하며, CPU에 최적화되어 긴 컨텍스트 길이에서도 효율적인 성능을 보여줍니다. C 라이브러리와 Python 래퍼를 제공하여 사용 편의성을 높였습니다.
핵심 포인트
- RWKV-LM 아키텍처를 ggml 포맷으로 구현하여 접근성을 높임.
- FP32, FP16 및 INT4/5/8 등 다양한 양자화 추론을 지원함.
- CPU에 중점을 두었으며 cuBLAS도 지원하는 하이브리드 환경 제공.
- C 라이브러리와 Python 래퍼를 통해 개발 통합이 용이함.
rwkv.cpp
이것은 BlinkDL/RWKV-LM을 ggerganov/ggml로 포팅한 것입니다.
일반적인 FP32 외에도 FP16, 그리고 양자화된 INT4, INT5, INT8 추론을 지원합니다. 이 프로젝트는 CPU에 중점을 두었지만, cuBLAS도 지원합니다.
이 프로젝트는 C 라이브러리 rwkv.h와 이를 위한 편리한 Python 래퍼(python/rwkv_cpp/rwkv_cpp_model.py)를 제공합니다.
RWKV는 대규모 언어 모델 아키텍처입니다. O(n^2) 어텐션을 사용하는 트랜스포머와 달리, RWKV는 로짓을 계산하는 데 이전 단계의 상태만 필요로 합니다. 이 덕분에 RWKV는 긴 컨텍스트 길이에서도 매우 CPU 친화적입니다.
이 프로젝트는 RWKV v4, v5, v6 및 최신 v7 아키텍처를 지원합니다.
Blealtan의 형식으로 LoRA 체크포인트를 로드하는 것은 merge_lora_into_ggml.py 스크립트를 통해 지원됩니다.
<!-- TODO: Update data below -->품질 및 성능
만약 rwkv.cpp를 심각한 용도로 사용하려면, 대표적인 데이터셋에서 사용 가능한 모든 포맷에 대해 퍼플렉서티(perplexity)와 지연 시간(latency)을 테스트하고 자신에게 가장 적합한 트레이드오프를 결정해야 합니다.
아래 표는 참고용일 뿐입니다. 측정은 AVX2가 적용된 4C/8T x86 CPU, 4 스레드를 사용하여 수행되었습니다. 모델은 RWKV v4 Pile 169M, RWKV v4 Pile 1.5B입니다.
| Format | Perplexity (169M) | Latency, ms (1.5B) | File size, GB (1.5B) |
|---|---|---|---|
Q4_0 | 17.507 | 76 | 1.53 |
| ... |
cuBLAS 사용 시
측정은 Intel i7 13700K 및 NVIDIA 3060 Ti 8 GB에서 수행되었습니다. 모델은 RWKV-4-Pile-169M이며, 12개의 레이어가 GPU로 오프로드되었습니다.
토큰당 지연 시간(Latency per token)이 밀리초 단위로 표시되어 있습니다.
| Format | 1 thread | 2 threads | 4 threads | 8 threads | 24 threads |
|---|---|---|---|---|---|
Q4_0 | 7.9 | 6.2 | 6.9 | 8.6 | 20 |
| ... | |||||
| Format | 1 thread | 2 threads | 4 threads | 8 threads | 24 threads |
| -------- | ---------- | ----------- | ----------- | ----------- | ------------ |
Q4_0 | 59 | 51 | 50 | 54 | 94 |
| ... | |||||
Note: cuBLAS는 ggml_mul_mat()에 대해서만 지원되므로, 나머지 연산을 실행하기 위해 여전히 일부 CPU 리소스를 사용해야 합니다. |
hipBLAS를 이용한 경우
측정은 CPU AMD Ryzen 9 5900X 및 GPU AMD Radeon RX 7900 XTX에서 수행되었습니다. 모델은 RWKV-novel-4-World-7B-20230810-ctx128k이며, 32개 레이어가 GPU로 오프로드되었습니다.
토큰당 지연 시간(Latency per token)을 밀리초(ms) 단위로 보여줍니다.
| Format | 1 thread | 2 threads | 4 threads | 8 threads | 24 threads |
|---|---|---|---|---|---|
f16 | 94 | 91 | 94 | 106 | 944 |
| ... | |||||
Note: cuBLAS와 마찬가지로, hipBLAS는 ggml_mul_mat()만 지원하므로, 나머지 연산을 실행하기 위해 여전히 일부 CPU 리소스를 사용해야 합니다. |
사용 방법
1. 레포지토리 클론(Clone the repo)
필수 사항: git.
git clone --recursive https://github.com/saharNooby/rwkv.cpp.git
cd rwkv.cpp
2. rwkv.cpp 라이브러리 얻기
옵션 2.1. 미리 컴파일된 라이브러리 다운로드
Windows / Linux / MacOS
Releases를 확인하고, 사용자의 OS와 CPU에 맞는 적절한 ZIP 파일을 다운로드하여 rwkv 라이브러리 파일을 레포지토리 디렉토리에 추출합니다.
Windows의 경우: CPU가 AVX2 또는 AVX-512를 지원하는지 확인하려면 CPU-Z를 사용하세요.
옵션 2.2. 라이브러리 직접 빌드하기
이 옵션은 최대 성능을 위해 권장됩니다. 왜냐하면 라이브러리가 사용자의 CPU와 OS에 맞춰 특별히 빌드될 것이기 때문입니다.
Windows
필수 요구 사항: CMake 또는 anaconda에서 CMake, Build Tools for Visual Studio 2019.**
cmake .
cmake --build . --config Release
모든 과정이 정상적으로 완료되었다면, bin elease wkv.dll 파일이 나타나야 합니다.
Windows + cuBLAS
종합적인 가이드는 docs/cuBLAS_on_Windows.md를 참조하십시오.
Windows + hipBLAS
종합적인 가이드는 docs/hipBLAS_on_Windows.md를 참조하십시오.
Linux / MacOS
필수 요구 사항: CMake (Linux: sudo apt install cmake, MacOS: brew install cmake, anaconoda: cmake 패키지).
cmake .
cmake --build . --config Release
Anaconda 및 M1 사용자: cmake .을 실행한 후 CMAKE_SYSTEM_PROCESSOR: arm64인지 확인하십시오. 만약 x86_64가 감지된다면, # Compile flags 아래의 CMakeLists.txt 파일을 수정하여 `set(CMAKE_SYSTEM_PROCESSOR
선택적으로, 모델을 위 표의 양자화된 형식 중 하나로 양자화할 수 있습니다:**
# Windows
python python\quantize.py C:\rwkv.cpp-169M.bin C:\rwkv.cpp-169M-Q5_1.bin Q5_1
...
4. 모델 실행하기 (Run the model)
명령줄 사용 (Using the command line)
요구 사항: numpy가 설치된 Python 3.x 버전이 필요합니다. Pile 또는 Raven 모델을 사용하는 경우, tokenizers도 필요합니다.
텍스트를 생성하려면 다음 명령어를 실행하세요:
# Windows
python python\generate_completions.py C:\rwkv.cpp-169M-Q5_1.bin
...
봇과 채팅하려면 다음 명령어를 실행하세요:
# Windows
python python\chat_with_bot.py C:\rwkv.cpp-169M-Q5_1.bin
...
generate_completions.py 또는 chat_with_bot.py를 수정하여 프롬프트와 샘플링 설정을 변경할 수 있습니다.
자체 코드에서 사용하기 (Using in your own code)
간단한 스크립트인 inference_example.py가 Python에서 rwkv.cpp를 사용하는 방법을 시연합니다.
C/C++에서 rwkv.cpp를 사용하려면 헤더 파일 rwkv.h를 포함하세요.
다른 언어에서 rwkv.cpp를 사용하려면 아래의 Bindings 섹션을 참조하세요. 사용하는 언어가 지원되지 않는 경우, 해당 언어에서 제공하는 도구를 사용하여 C API에 바인딩을 시도해 볼 수 있습니다.
Bindings (바인딩)
이 프로젝트들은 rwkv.cpp를 다른 언어나 프레임워크에서 더 쉽게 사용할 수 있도록 래핑(wrap)합니다.
- Golang: seasonjs/rwkv
- Node.js: Atome-FE/llama-node
Compatibility (호환성)
ggml은 빠르게 발전하고 있어, 때때로 이전 파일 형식과의 호환성이 깨질 수 있습니다.
rwkv.cpp는 모델 파일을 로드할 수 없는 이유와 사용자에게 제공 가능한 다음 단계를 설명하기 위해 최선을 다할 것입니다.
참고용으로, 이전 형식을 지원했던 rwkv.cpp의 최신 버전 목록을 제공합니다. 이 버전들은 더 이상 지원되지 않습니다.
Q4_2, 양자화 포맷의 구(舊) 레이아웃Q4_3,Q4_1_O
rwkv.cpp 모델 파일의 버전 번호와 변경 로그는 docs/FILE_FORMAT.md를 참조하세요.
기여 (Contributing)
docs/CODE_STYLE.md에 설명된 코드 스타일을 따라주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Research의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기