Учебное пособие по Gemma C++ (gemma.cpp)

gemma.cpp — это облегченная реализация модели Gemma во время выполнения на чистом C++.

Дополнительную информацию о Джемме смотрите в карточке модели . Веса моделей, включая специфические артефакты gemma.cpp, доступны на Kaggle .

Для кого этот проект?

Современные механизмы вывода LLM представляют собой сложные системы, часто со специальными возможностями, выходящими за рамки традиционных сред работы нейронных сетей. Это открывает возможности для исследований и инноваций посредством совместной разработки алгоритмов высокого уровня и вычислений низкого уровня. Однако существует разрыв между средами выполнения вывода C++, ориентированными на развертывание, которые не предназначены для экспериментов, и исследовательскими средами машинного обучения, ориентированными на Python, которые абстрагируют низкоуровневые вычисления посредством компиляции.

gemma.cpp предоставляет минималистскую реализацию моделей Gemma 2B и 7B, уделяя особое внимание простоте и прямоте, а не полной универсальности. Это вдохновлено реализациями вертикально интегрированных моделей C++, такими как ggml , llama.c и llama.rs .

gemma.cpp предназначен для экспериментов и исследований, в частности, для изучения пространства разработки алгоритмов вывода ЦП и использования портативного SIMD через библиотеку Google Highway . Предполагается, что его будет легко встраивать в другие проекты с минимальными зависимостями, а также легко модифицировать с помощью небольшой базовой реализации LoC размером ~ 2 КБ (вместе с LoC ~ 4 КБ вспомогательных утилит).

Для периферийного развертывания, ориентированного на производство, мы рекомендуем стандартные пути развертывания с использованием зрелых платформ Python, таких как JAX, Keras, PyTorch и Transformers ( все варианты моделей здесь ).

Большой и маленький вклад сообщества приветствуются. Этот проект соответствует принципам сообщества открытого исходного кода Google .

Быстрый старт

Чтобы выполнить это краткое руководство, необходимо клонировать или загрузить gemma.cpp .

Системные Требования

Перед запуском у вас должно быть установлено:

Шаг 1. Получите веса модели и токенизатор от Kaggle.

Посетите страницу модели Gemma на Kaggle и выберите «Вариации модели».

Джемма С++ . On this tab, the раскрывающийся список «Вариант» включает следующие параметры ниже. Обратите внимание, что параметры весов bfloat16 обеспечивают более высокую точность, а 8-битные переключаемые веса с плавающей запятой обеспечивают более быстрый вывод.

2B модели, настроенные по инструкциям ( it ) и предварительно обученные ( pt ):

Название модели Описание
2b-it Модель, настроенная с помощью инструкций, на 2 миллиарда параметров, bfloat16
2b-it-sfp Модель, настроенная с помощью инструкций, на 2 миллиарда параметров, 8-битная переключаемая плавающая запятая
2b-pt Предварительно обученная модель на 2 миллиарда параметров, bfloat16
2b-pt-sfp Предварительно обученная модель на 2 миллиарда параметров, 8-битная переключаемая плавающая запятая

7B модели, настроенные по инструкциям ( it ) и предварительно обученные ( pt ):

Название модели Описание
7b-it Модель на 7 миллиардов параметров, настроенная с помощью инструкций, bfloat16
7b-it-sfp Модель на 7 миллиардов параметров, настроенная с помощью инструкций, 8-битная переключаемая плавающая запятая
7b-pt Предварительно обученная модель на 7 миллиардов параметров, bfloat16
7b-pt-sfp Предварительно обученная модель на 7 миллиардов параметров, 8-битная переключаемая плавающая запятая

ПРИМЕЧАНИЕ . Мы рекомендуем начать с 2b-it-sfp чтобы приступить к работе.

Шаг 2: Извлеките файлы

После заполнения формы согласия загрузка должна продолжиться и получить файл tar-архива archive.tar.gz . Извлеките файлы из archive.tar.gz (это может занять несколько минут):

tar -xf archive.tar.gz

В результате должен быть создан файл, содержащий веса модели, например 2b-it-sfp.sbs , и файл токенизатора ( tokenizer.spm ). Возможно, вы захотите переместить эти файлы в удобный каталог (например, каталог build/ в этом репозитории).

Шаг 3: Сборка

Система сборки использует CMake . Чтобы создать среду выполнения вывода gemma, создайте каталог сборки и сгенерируйте файлы сборки с помощью cmake из каталога проекта верхнего уровня:

(cd build && cmake ..)

Затем запустите make , чтобы создать исполняемый файл ./gemma :

cd build make -j [number of parallel threads to use] gemma

Например, make -j 8 gemma . Если все прошло успешно, в каталоге build/ у вас должен появиться исполняемый файл gemma .

Шаг 4: Бегите

Теперь вы можете запустить gemma из каталога build/ .

gemma имеет следующие обязательные аргументы:

Аргумент Описание Пример значения
--model Тип модели. 2b-it , 2b-pt , 7b-it , 7b-pt , ... (см. выше)
--compressed_weights Сжатый файл весов. 2b-it-sfp.sbs , ... (см. выше)
--tokenizer Имя файла токенизатора. tokenizer.spm

gemma вызывается как:

./gemma \
--tokenizer [tokenizer file] \
--compressed_weights [compressed weights file] \
--model [2b-it or 2b-pt or 7b-it or 7b-pt]

Пример вызова для следующей конфигурации:

  • Файл сжатых весов 2b-it-sfp.sbs (модель 2B, настроенная с помощью инструкций, 8-битная переключаемая плавающая запятая).
  • Файл токенизатора tokenizer.spm .
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

Применение

gemma имеет различные режимы использования, управляемые флагом многословности.

Все режимы использования являются интерактивными и запускают генерацию текста при вводе новой строки.

Многословие Режим использования Подробности
--verbosity 0 Минимальный Печатает только выходные данные генерации. Подходит в качестве инструмента CLI.
--verbosity 1 По умолчанию Стандартный пользовательский интерфейс терминала.
--verbosity 2 Подробный Показывает дополнительную информацию о разработчике и отладке.

Приложение интерактивного терминала

По умолчанию для подробностей установлено значение 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 в качестве инструмента командной строки может оказаться полезным создать псевдоним для gemma.cpp с полностью указанными аргументами:

alias gemma2b="~/gemma.cpp/build/gemma -- --tokenizer ~/gemma.cpp/build/tokenizer.spm --compressed_weights ~/gemma.cpp/build/2b-it-sfp.sbs --model 2b-it --verbosity 0"

Замените указанные выше пути собственными путями к модели и токенизатору из загрузки.

Вот пример запроса gemma с усеченным вводом (с использованием псевдонима gemma2b , как определено выше):

cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b

ПРИМЕЧАНИЕ . Использование gemma.cpp в CLI является экспериментальным и должно учитывать ограничения длины контекста.

Вывод приведенной выше команды должен выглядеть так:

$ cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b
[ Reading prompt ] ......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
The code defines two C++ structs, `ConfigGemma7B` and `ConfigGemma2B`, which are used for configuring a deep learning model.

**ConfigGemma7B**:

*   `seq_len`: Stores the length of the sequence to be processed. It's set to 7168.
*   `vocab_size`: Stores the size of the vocabulary, which is 256128.
*   `n_layers`: Number of layers in the deep learning model. It's set to 28.
*   `dim_model`: Dimension of the model's internal representation. It's set to 3072.
*   `dim_ffw_hidden`: Dimension of the feedforward and recurrent layers' hidden representations. It's set to 16 * 3072 / 2.

**ConfigGemma2B**:

*   `seq_len`: Stores the length of the sequence to be processed. It's also set to 7168.
*   `vocab_size`: Size of the vocabulary, which is 256128.
*   `n_layers`: Number of layers in the deep learning model. It's set to 18.
*   `dim_model`: Dimension of the model's internal representation. It's set to 2048.
*   `dim_ffw_hidden`: Dimension of the feedforward and recurrent layers' hidden representations. It's set to 16 * 2048 / 2.

These structs are used to configure a deep learning model with specific parameters for either Gemma7B or Gemma2B architecture.