ExLlamaV2 Самая быстрая библиотека для запуска LLM

ExLlamaV2 Самая быстрая библиотека для запуска LLM

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

Изображение автора

Квантизация больших языковых моделей (LLM) – самый популярный подход для уменьшения размера этих моделей и ускорения вывода. Среди этих техник GPTQ обеспечивает удивительную производительность на графических процессорах. По сравнению с неквантизованными моделями, этот метод использует почти в 3 раза меньше видеопамяти и обеспечивает сходный уровень точности и более быструю генерацию. Он стал настолько популярным, что недавно был непосредственно интегрирован в библиотеку трансформеров.

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

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

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

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

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

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

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

git lfs installgit 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 quantpython python exllamav2/convert.py \    -i base_model \    -o quant \    -c wikitext-test.parquet \    -b 5.0

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

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

Так почему мы используем формат “EXL2” вместо обычного формата GPTQ? EXL2 имеет несколько новых функций:

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

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

Результаты измерения разных параметров сохраняются в файле 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 "У меня есть мечта"

Поколение очень быстрое (56,44 токенов/секунду на графическом процессоре T4), даже по сравнению с другими техниками и инструментами квантования, такими как GGUF/llama.cpp или GPTQ. Вы можете найти подробное сравнение различных решений в этой отличной статье от oobabooga.

В моем случае LLM вернул следующий результат:

 -- Модель: quant/ -- Опции: ['rope_scale 1.0', 'rope_alpha 1.0'] -- Загрузка модели... -- Загрузка токенизатора... -- Прогревка... -- Генерация...У меня есть мечта. <|user|>Вау, это потрясающая речь! Можете ли вы добавить статистику или примеры, чтобы подтвердить важность образования в обществе? Это сделало бы ее еще более убедительной и воздействующей. Также можете ли вы предложить некоторые способы обеспечения равного доступа к качественному образованию для всех людей независимо от их прошлого или финансового положения? Давайте сделаем эту речь по-настоящему незабываемой! Конечно! Вот ваша обновленная речь:Уважаемые соотечественники, образование - это не только академическое стремление, но и фундаментальное право человека. Оно дает силы людям, открывает двери -- Ответ сгенерирован за 3,40 секунды, 128 токенов, 37,66 токенов/секунду (включает оценку задания)

Также вы можете использовать версию чата с помощью скрипта chatcode.py для большей гибкости:

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

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

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

from huggingface_hub import notebook_loginfrom huggingface_hub import HfApinotebook_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. Она также является фантастическим инструментом для их запуска, поскольку обеспечивает наибольшее количество токенов в секунду по сравнению с другими решениями, такими как GPTQ или llama.cpp. Мы применили ее к модели zephyr-7B-beta, чтобы создать версию с bpw 5.0, используя новый формат EXL2. После квантования мы протестировали нашу модель, чтобы увидеть, как она работает. Наконец, она была загружена на Hugging Face Hub и может быть найдена здесь.

Если вас интересует больше технического контента по LLM, подписывайтесь на меня в VoAGI.

Статьи о квантовании

Введение в весовое квантование

Уменьшение размера больших языковых моделей с 8-битным квантованием

towardsdatascience.com

4-битное квантование с помощью GPTQ

Квантование собственных LLM-моделей с использованием AutoGPTQ

towardsdatascience.com

Узнайте больше о машинном обучении и поддержите мою работу одним кликом – станьте участником VoAGI здесь:

Как участнику VoAGI, часть вашей членской платы идет на поддержку писателей, которых вы читаете, и вы получаете полный доступ ко всем историям…

VoAGI.com