Улучшение LLMs с помощью AutoGPTQ и трансформеров

Улучшение LLMs с AutoGPTQ и трансформерами

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

🤗 Главная миссия Hugging Face – демократизация хорошего машинного обучения, и это включает в себя сделать большие модели доступными как можно большему количеству людей. В том же духе, что и наше сотрудничество bitsandbytes, мы только что интегрировали библиотеку AutoGPTQ в Transformers, что позволяет пользователям квантовать и запускать модели с точностью от 8, 4, 3 или даже 2 бит с использованием алгоритма GPTQ (Frantar et al. 2023). При квантовании с использованием 4-битного представления практически нет потери точности, а скорость вывода сравнима с базовым значением fp16 для небольших размеров пакета. Обратите внимание, что метод GPTQ немного отличается от методов квантования после обучения, предложенных bitsandbytes, поскольку требуется передать набор данных для калибровки.

Эта интеграция доступна как для графических процессоров Nvidia, так и для графических процессоров AMD, работающих на платформе RoCm.

Содержание

  • Ресурсы
  • Краткое изложение статьи о GPTQ
  • Библиотека AutoGPTQ – универсальная библиотека для эффективного использования GPTQ в LLM
  • Поддержка моделей GPTQ в 🤗 Transformers
  • Квантование моделей с помощью библиотеки Optimum
  • Запуск моделей GPTQ с помощью Text-Generation-Inference
  • Точная настройка квантованных моделей с помощью PEFT
  • Возможности для улучшения
    • Поддерживаемые модели
  • Заключение и окончательные слова
  • Благодарности

Ресурсы

Вместе с этой статьей и релизом идут несколько ресурсов, чтобы начать работу с квантованием GPTQ:

  • Оригинальная статья
  • Основной пример использования в Google Colab – В этом примере показано, как квантовать модель transformers с помощью метода GPTQ, как выполнять вывод и как выполнять точную настройку с помощью квантованной модели.
  • Документация по интеграции Transformers
  • Документация по интеграции Optimum
  • Репозитории Bloke с совместимыми моделями GPTQ.

Краткое изложение статьи о GPTQ

Методы квантования обычно относятся к одной из двух категорий:

  1. Квантование после обучения (PTQ): Мы квантовываем предварительно обученную модель с использованием умеренных ресурсов, таких как набор данных для калибровки и несколько часов вычислений.
  2. Квантование с учетом обучения (QAT): Квантование выполняется перед обучением или дополнительной точной настройкой.

GPTQ относится к категории PTQ, что особенно интересно для массовых моделей, для которых полное обучение модели или даже точная настройка могут быть очень дорогостоящими.

Конкретно, GPTQ использует смешанную схему квантования int4/fp16, при которой веса квантуются как int4, а активации остаются в формате float16. Во время вывода веса деквантуируются на лету, и фактическое вычисление выполняется в формате float16.

Преимущества такой схемы двояки:

  • Сэкономленная память почти в 4 раза при использовании 4-битного квантования, так как деквантуация происходит непосредственно у вычислительных блоков в объединенном ядре, а не в глобальной памяти GPU.
  • Возможные ускорения благодаря времени, сэкономленному на передаче данных из-за более низкой ширины битов, используемой для весов.

Статья о GPTQ решает проблему сжатия на уровне слоя:

Пусть у нас есть слой lll с матрицей весов WlW_{l}Wl​ и входом слоя XlX_{l}Xl​, мы хотим найти квантованную версию весов W^l\hat{W}_{l}W^l​, чтобы минимизировать среднеквадратическую ошибку (MSE):

W^l∗=argminWl^∥WlX−W^lX∥22{\hat{W}_{l}}^{*} = argmin_{\hat{W_{l}}} \|W_{l}X-\hat{W}_{l}X\|^{2}_{2}W^l​∗=argminWl​^​​∥Wl​X−W^l​X∥22​

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

Для решения этой проблемы сжатия на уровне слоев автор использует оптимальный квантовательный фреймворк мозга (Frantar и др. 2022 года). Метод OBQ начинает с наблюдения за тем, что вышеуказанное уравнение можно записать как сумму квадратов ошибок для каждой строки WlW_{l}Wl​.

∑i=0drow∥Wl[i,:]X−W^l[i,:]X∥22 \sum_{i=0}^{d_{row}} \|W_{l[i,:]}X-\hat{W}_{l[i,:]}X\|^{2}_{2} ∑i=0drow​​∥Wl[i,:]​X−W^l[i,:]​X∥22​

Это означает, что мы можем квантовать каждую строку независимо. Это называется квантованием по каналам. Для каждой строки Wl[i,:]W_{l[i,:]}Wl[i,:]​ OBQ квантует один вес за раз, при этом всегда обновляя все еще не квантованные веса, чтобы компенсировать ошибку, возникающую при квантовании одного веса. Обновление выбранных весов имеет аналитическую формулу и использует гессианские матрицы.

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

По сравнению с OBQ, сам шаг квантования также быстрее с GPTQ: для квантования модели BERT (336M) с OBQ требуется 2 часа работы на GPU, в то время как с GPTQ модель Bloom (176B) можно квантовать менее чем за 4 часа работы на GPU.

Чтобы узнать больше о точном алгоритме и различных показателях перплексии и ускорения, ознакомьтесь с оригинальной статьей.

Библиотека AutoGPTQ – универсальная библиотека для эффективного использования GPTQ для LLM

Библиотека AutoGPTQ позволяет пользователям квантовать модели 🤗 Transformers с использованием метода GPTQ. В то время как параллельные совместные усилия сообщества, такие как GPTQ-for-LLaMa, Exllama и llama.cpp, реализуют методы квантования строго для архитектуры Llama, AutoGPTQ стала популярной благодаря своему плавному охвату широкого спектра архитектур трансформеров.

Поскольку библиотека AutoGPTQ имеет большую покрытие моделей трансформеров, мы решили предоставить интегрированный 🤗 Transformers API, чтобы сделать квантование LLM более доступным для всех. На данный момент мы интегрировали наиболее распространенные параметры оптимизации, такие как ядра CUDA. Для более продвинутых параметров, таких как ядра Triton или совместимость с объединенным вниманием, ознакомьтесь с библиотекой AutoGPTQ.

Поддержка нативных моделей GPTQ в 🤗 Transformers

После установки библиотеки AutoGPTQ и optimum (pip install optimum) запуск моделей GPTQ в Transformers теперь так просто, как:

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("TheBloke/Llama-2-7b-Chat-GPTQ", torch_dtype=torch.float16, device_map="auto")

Ознакомьтесь с документацией Transformers, чтобы узнать больше о всех возможностях.

Наша интеграция AutoGPTQ имеет множество преимуществ:

  • Квантованные модели могут быть сериализованы и могут быть разделены на Hub.
  • GPTQ значительно снижает требования к памяти для работы LLM, при этом латентность вывода соответствует выводу FP16.
  • AutoGPTQ поддерживает ядра Exllama для широкого спектра архитектур.
  • Интеграция имеет нативную поддержку RoCm для графических процессоров AMD.
  • Доступно дообучение с использованием PEFT.

Вы можете проверить на Hub, была ли уже квантована ваша любимая модель. TheBloke, один из ведущих участников Hugging Face, квантовал множество моделей с помощью AutoGPTQ и поделился ими на Hugging Face Hub. Мы работали вместе, чтобы убедиться, что эти репозитории будут работать из коробки с нашей интеграцией.

Это пример бенчмарка для случая размера пакета = 1. Бенчмарк был запущен на одном графическом процессоре NVIDIA A100-SXM4-80GB. Мы использовали длину промпта 512 и сгенерировали ровно 512 новых токенов. Первая строка – это не квантованное базовое значение fp16, в то время как остальные строки показывают использование памяти и производительность с использованием различных ядер AutoGPTQ.

Более полный воспроизводимый бенчмарк доступен здесь.

Квантование моделей с библиотекой Optimum

Для безшовной интеграции AutoGPTQ в Transformers мы использовали минималистическую версию API AutoGPTQ, которая доступна в Optimum, наборе инструментов Hugging Face для оптимизации обучения и вывода. Следуя этому подходу, мы достигли легкой интеграции с Transformers, позволяя людям использовать Optimum API, если они хотят квантовать свои собственные модели! Ознакомьтесь с документацией Optimum, если вы хотите квантовать свои собственные LLM.

Квантование моделей 🤗 Transformers с помощью метода GPTQ можно сделать всего несколькими строками:

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset = "c4", tokenizer=tokenizer)

model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=quantization_config)

Квантование модели может занять много времени. Обратите внимание, что для модели объемом 175B требуется не менее 4 часов работы GPU, если используется большой набор данных (например, `”c4″“). Как уже упоминалось выше, множество моделей GPTQ уже доступны на Hugging Face Hub, что позволяет обойти необходимость квантования модели самостоятельно в большинстве случаев использования. Тем не менее, вы также можете квантовать модель, используя собственный набор данных, соответствующий конкретной области, над которой вы работаете.

Запуск моделей GPTQ через Text-Generation-Inference

Параллельно с интеграцией GPTQ в Transformers, поддержка GPTQ была добавлена в библиотеку Text-Generation-Inference (TGI), предназначенную для обслуживания больших языковых моделей в производственной среде. Теперь GPTQ можно использовать вместе с такими функциями, как динамическая пакетизация, пагинация внимания и вспышечное внимание для широкого спектра архитектур.

В качестве примера, благодаря этой интеграции можно обслуживать модель объемом 70B на одном графическом процессоре A100-80GB! Это невозможно при использовании чекпоинта fp16, так как превышается доступная память GPU.

Подробнее о использовании GPTQ в TGI вы можете узнать в документации.

Обратите внимание, что ядро, интегрированное в TGI, масштабируется не очень хорошо с более крупными размерами пакетов. Несмотря на то, что этот подход экономит память, ожидается замедление при более крупных размерах пакетов.

Тонкая настройка квантованных моделей с помощью PEFT

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

Поле для улучшений

Наша интеграция AutoGPTQ уже приносит впечатляющие преимущества при небольшой стоимости качества прогнозирования. Есть еще место для улучшений, как в техниках квантования, так и в реализации ядра.

Во-первых, хотя AutoGPTQ интегрируется (по нашим лучшим знаниям) с наиболее производительным ядром W4A16 (веса как int4, активации как fp16) из реализации exllama, есть хороший шанс, что ядро все же можно улучшить. Были предложены другие многообещающие реализации от Kim et al. и от MIT Han Lab, которые, по всей видимости, являются многообещающими. Кроме того, из внутренних бенчмарков видно, что до сих пор нет производительного ядра W4A16 с открытым исходным кодом, написанного в Triton, что может быть направлением для исследования.

В отношении квантования давайте еще раз подчеркнем, что этот метод квантует только веса. Были предложены другие подходы для квантования LLM, которые могут квантовать как веса, так и активации при небольшой стоимости качества прогнозирования, например, LLM-QAT, где может использоваться смешанная схема int4/int8, а также квантование кеша ключей-значений. Одним из сильных преимуществ этой техники является возможность использования фактической целочисленной арифметики для вычислений, например, с поддержкой вычислений int8 Nvidia Tensor Cores. Однако, по нашим лучшим знаниям, нет открытых ядер квантования W4A8 с открытым исходным кодом, но это может быть интересным направлением для исследования.

Со стороны ядра также остается открытой задача разработки производительных ядер W4A16 для более крупных размеров пакетов.

Поддерживаемые модели

В этой начальной реализации поддерживаются только большие языковые модели с архитектурой только декодера или только энкодера. Это может показаться немного ограничивающим, но это включает в себя большинство современных LLM, таких как Llama, OPT, GPT-Neo, GPT-NeoX.

Очень большие модели зрения, аудио и мультимодальные модели в настоящее время не поддерживаются.

Заключение и финальные слова

В этом блогпосте мы представили интеграцию библиотеки AutoGPTQ в Transformers, что позволяет квантовать LLM с помощью метода GPTQ, чтобы они были доступны для всех в сообществе и давали возможность создавать увлекательные инструменты и приложения с использованием LLM.

Эта интеграция доступна как для графических процессоров Nvidia, так и для графических процессоров AMD с архитектурой RoCm, что является огромным шагом в направлении демократизации квантованных моделей для более широких архитектур графических процессоров.

Сотрудничество с командой AutoGPTQ было очень плодотворным, и мы очень благодарны за их поддержку и работу над этой библиотекой.

Мы надеемся, что эта интеграция сделает использование LLM проще для всех ваших приложений, и мы с нетерпением ждем, что вы построите с ее помощью!

Не пропустите полезные ресурсы, представленные выше, чтобы лучше понять интеграцию и как быстро начать использовать квантование GPTQ.

  • Оригинальная статья
  • Базовый пример использования в блокноте Google Colab – Этот блокнот показывает, как квантовать модель трансформера с помощью метода GPTQ, как выполнять вывод и как выполнять тонкую настройку с использованием квантованной модели.
  • Документация по интеграции Transformers
  • Документация по интеграции Optimum
  • Хранилища Bloke с совместимыми моделями GPTQ.

Благодарности

Мы хотели бы поблагодарить Уильяма за его поддержку и работу над потрясающей библиотекой AutoGPTQ, а также за его помощь в интеграции. Мы также хотели бы поблагодарить TheBloke за его работу по квантованию множества моделей с помощью AutoGPTQ и их публикацию на Hub, а также за его помощь в интеграции. Мы также хотели бы выразить признательность qwopqwop200 за его постоянный вклад в библиотеку AutoGPTQ и его работу по расширению библиотеки для ЦП, которая будет выпущена в следующих версиях AutoGPTQ.

Наконец, мы хотели бы поблагодарить Педро Куенку за его помощь в написании этого блогпоста.