Запускаем LLaMa 2 70B GPTQ на двух GPU 24 Gb (для новичков)
Из-за огромного размера GPT-моделей даже для вывода требуется несколько производительных GPU. Для ускорения созданы разные методы квантизации (простыми словами - сжатия), которые существенно снижают требования к видеопамяти.
В данной публикации будет приведен код с Hugging Face для запуска квантизированной версии - Llama 2 70B GPTQ. Также этот код подойдет для любых других моделей с меньшим количеством параметров 7B, 13B и т.д. Прежде чем перейти к коду предоставлю несколько заметок про нюансы, связанные с квантизированными моделями.
- Нужна ли 70B?
- Снижается ли качество при квантизации
- Требования к видеопамяти
- Выбор конкретной модели
- Запускаем Llama 2 70B GPTQ
Нужна ли 70B?
Из таблицы ниже видно, что прогресс Llama 2 кажется не существенным по сравнению с меньшими моделями. 70B от 13B лучше в разных сравнениях примерно от 5 до 20%. Как это ощутимо на практике сложно оценить.
В каждой специализированной задаче лучше сравнивать конкретные результаты, чтобы не бить из золотой пушки по мухам. Во многих задачах может хватить 7B и 13B.
По моему опыту тестирования в задачах анализа текса 13B предпочтительнее 7B. Квантизированная 70B может в чем-то уступать даже 13B. У 70B часто замечается более богатый язык.
Многое зависит от конкретных моделей, как они были модифицированы на каких-то датасетах. Один и тот же промт может отлично работать в 13B, но в 70B потребуется корректировка, и наоборот.
Наглядный пример вывода моделей разного размера Llama 2.
Лидерборд Chat Arena
В лидерборде Chat Arena Llama 2 70B модель занимает верхние места. Хотя видно, что количество параметров не гарантирует топ.
Снижается ли качество при квантизации
Качество заметно снижается при квантизации ниже 8-бит. В дополнении к битности, появилась еще версия квантизации с k-quants, такие модели имеют в названии K. В итоге имеем большой зоопарк квантизированных моделей, которые можно использовать в разных обстоятельствах. Из справки llama.cpp для 7B модели приводили такую таблицу:
Перплексия (качество генерации)
Качество в между разными версиями квантования часто оценивают статистически через перплексию - это распределение вероятностей по целым предложениям или текстам. Чем ниже перплексия, тем выше качество и меньше потерь.
Влияние инструмента квантизации
Квантизированные модели, сделанные для разных инструментов, таких как llama.cpp, AutoGPTQ, ExLlama, bitsandbytes будут отличаться по качеству и скорости работы. Например, в некоторых сравнениях GGML в llama.cpp показал более низкую перплексию, чем AutoGPTQ, ExLlama.
Для моделей GGML подойдет llama.cpp с моделями Q4_K_M. Для моделей GPTQ у нас есть два варианта: AutoGPTQ или ExLlama.
Влияние длины контекста
Пользователь предоставил факты, указывающие что от длины контекста перплекисити изменяется.
Есть интересные графики сравнения перплексии LlaMa-2 и LLaMa-1 в разных битно, один из них.
Чтобы понять какая версия квантизации подходит для конкретной модели потребуется тестирование. Проблема в том, что потери мало сказываться на одних задачах, но могут сильно вылазить в других.
Требования Llama 2 к видеопамяти и оперативке
Чтобы запустить Llama 2 70B без квантизации в fp16 потребуется 2 x 80GB GPU or 4 x 48GB GPU or 6 x 24GB GPU. В 4-bit требования следующие:
Оперативка. Файл с квантизированной моделью занимает на диске примерно 37 Гб. Примерно столько потребуется оперативной памяти на этапе загрузки модели в GPU, а на этапе вывода около 3-4 Гб памяти. Это значит, что если у вас оперативной памяти 16 или 32 Гб всего, то обязательно нужен swap файл и все запустится. Ну и вообще если памяти не хватает - просто увеличивайте swap. Само собой если диск медленный, то на этапе загрузки придется подождать. Но это не критично.
Выбор конкретной модели
Для запуска через стандартный pipeline требуется модель в формате GPTQ. Все доступные модели GPTQ Llama 2 70B можно найти через поиск. Если в названии модели указано GPTQ - значит подходит для нашего кода. Можно сконвертировать fp16 модель в GPTQ из этого лидерборда.
Я остановился на модели в формате GPTQ - TheBloke/Llama-2-70B-Orca-200k-GPTQ. Часто в опубликованной модели есть разные версии квантования, которые описаны на странице. Они отличаются качеством и скоростью. Мы коде будем использовать - gptq-4bit-32g-actorder_True.
Запускаем Llama 2 70B GPTQ
C августа 2023 года библиотека AutoGPTQ стала интегрирована в HF, поэтому можно упрощенно запускать квантизированные модели со стандартным pipeline с наименьшими телодвижениями.
Полный список требуемых модулей питона пока не приведу, по ошибкам обнаружите. Потребуются самые свежие bitsandbytes, auto-gptq. Скорее всего нужно будет проапгрейдить все трансформеры и торчи, если не запускается. Если что-то не запускается, то чаще всего из-за устаревшей версии пакетов.
Прописываем модель и конфиг, указываем нужную версию - gptq-4bit-32g-actorder_True
Добавляем контекст из 600 слов (800+ токенов примерно) и вопрос для суммаризации
Чем больше контекст, тем больше памяти жрет. Запускаем вывод.
Итого было затрачено примерно 44 Гб памяти и 13.5 секунд. Результат:
Если нашли неточность в описании - буду рад поправкам. Если есть вопросы - пишите, чем смогу помогу. Замечу, что я лишь энтузиаст-исследователь, а не профессиональный ИИ-программист. Также вы можете подписаться на мой ТГ-канал, где я делюсь своими находками и опытом.
Впервые вижу что кто-то затрагивает тему что интеллект модели падает при кванте, хоть и говорят об этом. Есть какие-то примерные данные сколько теряется в процентах интеллекта у модели? От q8 до q4 к примеру. Если не ошибаюсь, это 10% до q4, и чем цифра ниже, тем сильнее падает производительность по схеме лавины.
Так же слышал что чем крупнее модель, тем её квант в более компактные варианты вредит ей меньше. Типо, квантовка 70b до q2 превращает её в овоща, а нового 180b Falcon страдает от этого на много меньше.
Речь в целом идёт об ggml и gguf. Только такие и могу запускать
По таблицам лидербордов и разным преплексити, там действительно малый процент отклонения. На мой субьективный взгляд, все эти значения метрик и тестов никогда не отвечают, а в какой момент модель просядет. Подозреваю, что даже 0.1% отклонения может где-то выстрелить плачевно в самом неожиданном месте. Нужно проводить тестирование в конкретных задачах.
Он жрет столько памяти только за один промт? Или структура сама весит столько?