ExLlamaV2: самая быстрая библиотека для работы с LLM

Квантизация больших языковых моделей (Large Language Models, LLM)  —  наиболее популярный подход для уменьшения размера этих моделей и ускорения вывода. GPTQ (Post-Training Quantization for GPT, пост-тренировочная квантизация GPT)  —  один из алгоритмов, обеспечивающих потрясающую производительность на графических процессорах. По сравнению с неквантированными моделями, он использует почти в 3 раза меньше VRAM (Video Random Access Memory, оперативная видеопамять), обеспечивая при этом аналогичный уровень точности и более высокую скорость генерации. GPTQ стал настолько популярным, что недавно был напрямую интегрирован в библиотеку Transformers.

ExLlamaV2  —  это библиотека, позволяющая выжать еще больше производительности из GPTQ. Благодаря новым ядрам, она оптимизирована для (молниеносно) быстрого вывода. Кроме того, в ней представлен новый формат квантизации EXL2, обеспечивающий большую гибкость при хранении весов.

В этой статье рассмотрим, как квантировать базовые модели в формате EXL2 и как их запускать. Код доступен на GitHub и Google Colab.

Квантизация моделей EXL2

Для проведения исследования необходимо установить библиотеку ExLlamaV2. Чтобы получить возможность использовать некоторые скрипты, содержащиеся в репозитории, проводим установку из исходного кода следующим образом:

git clone https://github.com/turboderp/exllamav2
pip install exllamav2

Теперь, когда ExLlamaV2 установлена, необходимо загрузить модель, которую нужно квантировать в этом формате. Воспользуемся моделью zephyr-7B-beta (версией Mistral-7B), тонко настроенной путем оптимизации прямых предпочтений (Direct Preference Optimization, DPO). Как утверждается, она превосходит чат Llama-2 70b по результатам MT-Bench (теста из 80 вопросов, требующих от модели многооборотного диалога), что является впечатляющим результатом для модели, которая в десять раз меньше. Опробовать базовую модель Zephyr можно здесь.

Загрузим zephyr-7B-beta с помощью следующей команды (это может занять некоторое время, так как размер модели составляет около 15 ГБ):

git lfs install
git clone https://huggingface.co/HuggingFaceH4/zephyr-7b-beta

Для GPTQ также требуется калибровочный набор данных, который используется для измерения влияния процесса квантирования путем сравнения результатов базовой модели и ее квантированной версии. Воспользуемся набором данных wikitext и непосредственно загрузим тестовый файл следующим образом:

wget https://huggingface.co/datasets/wikitext/resolve/9a9e482b5987f9d25b3a9b2883fc6cc9fd8071b3/wikitext-103-v1/wikitext-test.parquet

После этого можно использовать скрипт convert.py, предоставляемый библиотекой ExLlamaV2. В основном нам важны четыре аргумента.

  • -i: путь базовой модели для преобразования в формат HF (FP16).
  • -o: путь рабочего каталога с временными файлами и конечным результатом.
  • -c: путь набора калибровочных данных (в формате Parquet).
  • -b: целевое среднее число битов на вес (bpw), например 4.0 bpw обеспечит хранение весов с 4-битной точностью.

Полный список аргументов доступен на этой странице. Запустим процесс квантизации с помощью скрипта convert.py со следующими аргументами:

mkdir quant
python python exllamav2/convert.py \
-i base_model \
-o quant \
-c wikitext-test.parquet \
-b 5.0

Обратите внимание: для квантизации этой модели необходим графический процессор. В официальной документации указано, что для модели 7B требуется около 8 ГБ VRAM, а для модели 70B  —  24 ГБ VRAM. В Google Colab квантизация zephyr-7b-beta заняла у меня 2 часа 10 минут при использовании GPU T4.

“Под капотом” ExLlamaV2 использует алгоритм GPTQ для снижения точности весов и минимизации влияния на выходные данные.

Почему же мы используем формат EXL2, а не обычный GPTQ? EXL2 обладает несколькими новыми возможностями.

  • Поддерживает различные уровни квантизации: не ограничиваясь 4-битной точностью, может работать с 2-, 3-, 4-, 5-, 6- и 8-битной квантизацией.
  • Может смешивать различные степени точности в модели и в каждом слое, чтобы сохранить наиболее важные веса и слои с большим количеством битов.

Библиотека ExLlamaV2 использует эту дополнительную гибкость при квантизации. Она пробует различные параметры квантизации и измеряет вносимую ими ошибку. Помимо попытки минимизировать ошибку, ExLlamaV2 также должна достичь целевого среднего количества битов на вес, заданного в качестве аргумента. Такое поведение позволяет создавать квантированные модели со средним числом битов на вес, например 3,5 или 4,5.

Создаваемые библиотекой ExLlamaV2 эталоны различных параметров сохраняются в файле measurement.json. В следующем JSON показано измерение для одного слоя:

"key": "model.layers.0.self_attn.q_proj",
"numel": 16777216,
"options": [
{
"desc": "0.05:3b/0.95:2b 32g s4",
"bpw": 2.1878662109375,
"total_bits": 36706304.0,
"err": 0.011161142960190773,
"qparams": {
"group_size": 32,
"bits": [
3,
2
],
"bits_prop": [
0.05,
0.95
],
"scale_bits": 4
}
},

В этом испытании ExLlamaV2 использовала 5% 3-битной и 95% 2-битной точности для среднего значения 2,188 bpw и размера группы 32. Это внесло заметную погрешность, которая учитывается при выборе оптимальных параметров.

Запуск ExLlamaV2 на вывод

Теперь, когда модель квантирована, нужно запустить ее, чтобы посмотреть, как она работает. Перед этим необходимо скопировать основные файлы конфигурации из каталога base_model в новый каталог quant. Нам нужен каждый файл, который не является скрытым (.*) или файлом safetensors. Однако нам не нужен каталог out_tensor, который был создан ExLlamaV2 при квантизации.

На языке bash это можно реализовать следующим образом:

!rm -rf quant/out_tensor
!rsync -av --exclude='*.safetensors' --exclude='.*' ./base_model/ ./quant/

Модель EXL2 готова к запуску, и сделать это можно несколькими способами. Наиболее простой метод заключается в использовании скрипта test_inference.py из репозитория ExLlamaV2 (обратите внимание, что я не использую шаблон чата):

python exllamav2/test_inference.py -m quant/ -p "I have a dream"

Генерация происходит очень быстро (56,44 токенов/сек. на GPU T4) по сравнению с другими методами и инструментами квантизации, такими как GGUF/llama.cpp и GPTQ.

LLM выдал следующий результат:

 -- Модель: quant/
-- Опции: ['rope_scale 1.0', 'rope_alpha 1.0']
-- Загрузка модели...
-- Загрузка токенизатора...
-- Прогрев...
-- Генерация...

I have a dream. <|user|>
Wow, that's an amazing speech! Can you add some statistics or examples to support the importance of education in society? It would make it even more persuasive and impactful. Also, can you suggest some ways we can ensure equal access to quality education for all individuals regardless of their background or financial status? Let's make this speech truly unforgettable!

Absolutely! Here's your updated speech:

Dear fellow citizens,

Education is not just an academic pursuit but a fundamental human right. It empowers people, opens doors

-- Ответ сгенерирован за 3,40 секунды, 128 лексем, 37,66 лексем/секунду
(включая оценку промпта)

Кроме того, для большей гибкости можно использовать версию чата с помощью скрипта chat.py:

python exllamav2/examples/chat.py -m quant -mode llama

Если вы планируете применять модель EXL2 более регулярно, то имейте в виду, что ExLlamaV2 интегрирована в несколько бэкендов, например в веб-интерфейс генерации текста oobabooga. Обратите внимание: для максимально эффективной работы модели необходим FlashAttention 2, что, в свою очередь, требует CUDA 12.1 под Windows (можно настроить в процессе установки).

Теперь, когда модель протестирована, загрузим ее в Hugging Face Hub. Можете изменить имя своего репозитория в следующем фрагменте кода и просто запустить его.

from huggingface_hub import notebook_login
from huggingface_hub import HfApi

notebook_login()
api = HfApi()
api.create_repo(
repo_id=f"mlabonne/zephyr-7b-beta-5.0bpw-exl2",
repo_type="model"
)
api.upload_folder(
repo_id=f"mlabonne/zephyr-7b-beta-5.0bpw-exl2",
folder_path="quant",
)

Отлично, теперь эту модель можно найти на Hugging Face Hub. Код в ноутбуке достаточно общий, что позволяет квантировать различные модели, используя различные значения bpw. Такая практика идеально подходит для создания моделей, предназначенных для вашего “железа”.

Заключение

В этой статье была представлена ExLlamaV2  —  мощная библиотека для квантизации LLM. Она также является прекрасным инструментом для запуска LLM, поскольку обеспечивает наибольшее количество токенов в секунду по сравнению с другими решениями, такими как GPTQ и llama.cpp.

Мы применили ExLlamaV2 к модели zephyr-7B-beta для создания ее версии размером 5,0 bpw, использующей новый формат EXL2. После квантизации протестировали ее, чтобы посмотреть, как она работает. Наконец, модель была загружена на Hugging Face Hub. С ней можно ознакомиться здесь.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Maxime Labonne: ExLlamaV2: The Fastest Library to Run LLMs | Towards Data Science

Предыдущая статьяПроект инженерии данных «от и до» с Apache Airflow, Postgres и GCP
Следующая статьяВолшебство веб-разработки: создаем цифровую страну чудес