gemma.cpp: Gemma 모델의 빠른 실행을 위한 C++ 추론 엔진 (by Google)

PyTorchKR​:fire::kr: :thinking::speech_balloon:

  • Google:google:에서 가벼운 LLM인 Gemma와 함께 경량화된 C++ 추론 엔진인 gemma.cpp를 함께 공개했습니다. 정말 Google이 칼을 갈았구나 싶은데요, 2B와 7B 모델 모두 bflot16과 8bit 변환 소수점(SFP, Switched Floating Point)으로 변환한 모델 가중치들까지 공개하고 있습니다. 이번 주말에는 gemma.cpp로 로컬에서 2B 모델 한 번 돌려보시는건 어떠실까요? :smiley:
  • 이 글은 GPT 모델로 정리한 것으로, 잘못된 부분이 있을 수 있으니 글 아래쪽의 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

gemma.cpp: Gemma 모델의 빠른 실행을 위한 C++ 추론 엔진 (by Google)

gemma.cpp 소개

gemma.cpp는 Google이 공개한 경량 LLM인 Gemma 모델들을 위한 경량(lightweight), 독립적으로 실행이 가능한(standalone) C++ 추론 엔진입니다.

Gemma-2B와 7B 모델의 추론을 위한 최소 구현을 제공하며, 전체 일반성보다는 단순성과 직접성에 중점을 둡니다. 이는 ggml, llama.c, llama.rs와 같은 수직 통합 모델 구현에서 영감을 받았습니다.

gemma.cpp는 실험 및 연구 목적으로의 사용을 대상으로 구현 및 공개되었습니다. 즉, 최소한의 의존성으로 다른 프로젝트에 쉽게 내장될 수 있도록 설계되었으며, 작은 약 2K LoC의 핵심 구현(약 4K LoC의 지원 유틸리티와 함께)으로 쉽게 수정할 수 있습니다. CPU 추론을 위한 휴대용 SIMD를 활용하기 위해 Google Highway 라이브러리를 함께 사용합니다.

Edge에서의 배포를 위해서는 JAX, Keras, PyTorch, Transformers와 같은 Python 프레임워크를 사용하는 표준 배포 경로를 권장합니다.

빠른 시작

시스템 요구 사항

시작하기 전에 다음을 설치해야 합니다:

  • CMake
    • homebrew가 설치된 macOS에서는 brew install --cask cmake 으로 설치할 수 있습니다.
  • 최소 C++17을 지원하는 Clang C++ 컴파일러.
  • Kaggle에서 아카이브를 추출하기 위한 tar.

1단계: Kaggle에서 모델 가중치와 토크나이저 내려받기

Kaggle의 Gemma 모델 페이지

Kaggle의 Gemma 모델 페이지를 방문하고 Model Variations |> Gemma C++을 선택하세요. 이 탭에서 Variation 드롭다운에는 아래 옵션이 포함됩니다. bfloat16 가중치는 더 높은 충실도를 제공하는 반면, 8비트 전환 부동 소수점 가중치는 더 빠른 추론을 가능하게 합니다.

2B 지시 조정(Instruction Tuning, it) 및 사전 훈련된(Pre-Trained, pt) 모델:

모델 이름 설명
2b-it 2B 파라매터의 지시 조정 모델, bfloat16
2b-it-sfp 2B 파라매터의 지시 조정 모델, 8-bit 전환 부동 소수점
2b-pt 2B 파라매터의 사전 훈련된 모델, bfloat16
2b-pt-sfp 2B 파라매터의 사전 훈련된 모델, 8-bit 전환 부동 소수점

7B 지시 조정(Instruction Tuning, it) 및 사전 훈련된(Pre-Trained, pt) 모델:

모델 이름 설명
7b-it 7B 파라매터의 지시 조정 모델, bfloat16
7b-it-sfp 7B 파라매터의 지시 조정 모델, 8-bit 전환 부동 소수점
7b-pt 7B 파라매터의 사전 훈련된 모델, bfloat16
7b-pt-sfp 7B 파라매터의 사전 훈련된 모델, 8-bit 전환 부동 소수점

처음 시작하실 때에는 2b-it-sfp 모델을 사용하시는 것을 권장합니다.

2단계: 파일 추출

Gemma 모델 사용 동의 후, archive.tar.gz라는 tar 아카이브 파일을 검색하여 다운로드해야 합니다. archive.tar.gz에서 파일을 추출하세요(몇 분 정도 걸릴 수 있습니다):

tar -xf archive.tar.gz

위 단계를 통해 (1) 모델 가중치 파일(예. 2b-it-sfp.sbs)과 (2) Tokenizer 파일(예. tokenizer.spm)을 확인할 수 있습니다. 이후 단계에서 이 파일들을 사용하기 위해 접근이 편한 경로에 이동해두세요. (예. build/ 디렉토리 등)

3단계: 빌드

gemma.cpp는 CMake를 사용하여 빌드합니다. gemma 추론 런타임을 빌드하려면 빌드 디렉토리를 생성하고 상위 프로젝트 디렉토리에서 cmake를 사용하여 빌드 파일을 생성하세요:

(cd build && cmake ..)

그런 다음 make를 실행하여 ./gemma 실행 파일을 빌드하세요:

cd build
make -j [사용할 병렬 스레드 수] gemma
# 예. make -j 8 gemma

이 때, Windows Subsystem for Linux (WSL) 사용자는 병렬 스레드 수를 1로 설정해야 합니다. 더 큰 숫자를 사용하면 오류가 발생할 수 있습니다.

빌드가 성공적으로 완료되면 build/ 디렉토리에 gemma 실행 파일이 생성됩니다.

4단계: 실행

build/ 디렉토리 내부에서 gemma 파일을 실행합니다.
실행 시 필수 인수(argument)를 가집니다:

인수(argument) 설명 예시 값
--model 모델 유형. 2b-it, 2b-pt, 7b-it, 7b-pt, ... (위 참조)
--compressed_weights 압축된 가중치 파일. 2b-it-sfp.sbs, ... (위 참조)
--tokenizer 토크나이저 파일. tokenizer.spm

예를 들어, 아래와 같이 실행할 수 있습니다.

./gemma \
--tokenizer [2단계에서 추출한 토크나이저 파일] \
--compressed_weights [2단계에서 내려받은 모델 파일] \
--model [1단계에서 내려받은 모델 종류 (예. 2b-it, 2b-pt, 7b-it 등)]

예를 들어, 다음과 같은 구성으로 파일을 다운로드 받았다고 가정하면,

  • 모델 가중치: 2b-it-sfp.sbs (2B 지시 조정 모델, 8-bit 전환 부동 소수점).
  • Tokenizer: tokenizer.spm.

다음과 같이 실행하시면 됩니다:

./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

사용법

gemma 실행 시 verbosity 옵션을 통해 얼마나 상세하게 출력할지를 제어할 수 있습니다.

모든 사용 모드는 현재 대화형이며, 새 줄 입력 시 텍스트 생성을 트리거합니다.

상세도 사용 모드 세부 사항
--verbosity 0 최소 생성 출력만 인쇄합니다. CLI 도구로 적합합니다.
--verbosity 1 기본 표준 사용자 지향 터미널 UI입니다. (기본값)
--verbosity 2 상세 추가 개발자 및 디버그 정보를 보여줍니다.

대화형 터미널 앱(Interactive Terminal App)

기본적으로 verbosity 값은 1로 설정되어 gemma 실행 시 아래와 같은 터미널 기반 대화형 인터페이스를 불러옵니다:

$ ./gemma [...]
  __ _  ___ _ __ ___  _ __ ___   __ _   ___ _ __  _ __
 / _` |/ _ \ '_ ` _ \| '_ ` _ \ / _` | / __| '_ \| '_ \
| (_| |  __/ | | | | | | | | | | (_| || (__| |_) | |_) |
 \__, |\___|_| |_| |_|_| |_| |_|\__,_(_)___| .__/| .__/
  __/ |                                    | |   | |
 |___/                                     |_|   |_|

tokenizer                     : tokenizer.spm
compressed_weights            : 2b-it-sfp.sbs
model                         : 2b-it
weights                       : [no path specified]
max_tokens                    : 3072
max_generated_tokens          : 2048

*Usage*
  Enter an instruction and press enter (%Q quits).

*Examples*
  - Write an email to grandma thanking her for the cookies.
  - What are some historical attractions to visit around Massachusetts?
  - Compute the nth fibonacci number in javascript.
  - Write a standup comedy bit about WebGPU programming.

> What are some outdoorsy places to visit around Boston?

[ Reading prompt ] .....................


**Boston Harbor and Islands:**

* **Boston Harbor Islands National and State Park:** Explore pristine beaches, wildlife, and maritime history.
* **Charles River Esplanade:** Enjoy scenic views of the harbor and city skyline.
* **Boston Harbor Cruise Company:** Take a relaxing harbor cruise and admire the city from a different perspective.
* **Seaport Village:** Visit a charming waterfront area with shops, restaurants, and a seaport museum.

**Forest and Nature:**

* **Forest Park:** Hike through a scenic forest with diverse wildlife.
* **Quabbin Reservoir:** Enjoy boating, fishing, and hiking in a scenic setting.
* **Mount Forest:** Explore a mountain with breathtaking views of the city and surrounding landscape.

...

그 외 gemma.cpp를 다른 프로젝트에 통합하는 방법은 gemma.cpp의 GitHub 저장소를 확인해주세요.

마지막으로, gemma.cpp는 공식적으로 지원되는 Google 제품이 아니므로 이에 유의해주세요.

GitHub 저장소

Gemma 모델 가중치 확인 및 다운로드

Gemma 모델 살펴보기




:fire:파이토치 한국 사용자 모임:kr:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:gift: 아래:arrow_lower_right:쪽에 좋아요:heart:를 눌러주시면 뉴스 발행에 힘이 됩니다~ :star_struck:

아래와 같이 제 M1 mac mini에서 설치한 결과입니다.

0단계. 설치 및 gemma.cpp Clone

  • CMake 설치: brew install --cask cmake
  • (clang과 tar는 이미 설치되어 있습니다)
  • gemma.cpp 저장소 복제: git clone https://github.com/google/gemma.cpp
  • (저의 경우 /Users/reserve/Workspace/gemma.cpp에 복제해두었습니다)

1단계. 모델 다운로드 및 압축 해제

  • Gemma | Kaggle 방문 및 Term of Use 동의
  • 스크롤을 내리다가, 아래와 같은 Model Variations 섹션에서 Gemma C++ 선택 후 모델 다운로드
  • (README에서 추천한대로, 2b-it-sfp를 다운로드 받았습니다.)

2단계. 압축 해제

  • 1단계에서 내려받은 파일: ~/Downloads/archive.tar.gz
  • 압축 해제: tar -xf ~/Downloads/archive.tar.gz
  • (복제한 gemma.cpp 저장소 디렉토리 내에서) mv ~/Downloads/archive ./build/2b-it-sfp
  • 현재까지 진행하면, 아래와 같은 구조로 보여야 합니다.
.
├── build
│      └── 2b-it-sfp
│                 ├── 2b-it-sfp.sbs.      # 모델 가중치 파일
│                └── tokenizer.spm    # Tokenizer 파일
├── compression
├── docs
└── util

3단계. gemma 바이너리 빌드

실행

다음과 같이 실행하였습니다.

./gemma \
  --tokenizer ./2b-it-sfp/tokenizer.spm \
  --compressed_weights ./2b-it-sfp/2b-it-sfp.sbs 
  --model 2b-it