Запуск 8B LLM в браузере без GPU

Опыт запуска языковой модели Llama 3.1 8B в браузере без GPU благодаря уникальному алгоритму сжатия. Модель снижена с 16 ГБ до 2,5 ГБ, что ускоряет вычисления.
Новости 2024 12 13

Введение

Запуск больших языковых моделей на пользовательских устройствах является увлекательной задачей, которая привлекает внимание как исследователей, так и разработчиков. В качестве примера был создан инференс для модели Llama 3.1 8B, который может работать непосредственно в браузере благодаря технологии WebAssembly. Особенно примечательно то, что этот процесс не требует использования высокопроизводительных графических процессоров (GPU), что открывает новые возможности для пользователей с ограниченными ресурсами. Основной движущей силой стала разработка уникального алгоритма сжатия. Этот алгоритм позволяет значительно уменьшить размер модели, сохраняя при этом её эффективность и производительность.

Языковые модели на пользовательских устройствах

Модели, такие как Llama 3.2 1B и Llama 3.2 3B, были специально разработаны для работы на маломощных устройствах, демонстрируя возможности работы даже на ограниченных ресурсах. Эти облегченные версии языковых моделей открывают двери к новым приложениям, позволяя пользователям взаимодействовать с мощными инструментами напрямую на своих смартфонах или персональных компьютерах.

Модели с 8 миллиардами параметров, такие как Llama 3.1 8B, отлично подходят для демонстрации современных подходов к сжатию. Используя продвинутые алгоритмы, можно значительно уменьшить объем занимаемой памяти без значительной потери качества. Это делает их доступными для браузерных приложений, где критично важно оптимальное использование ресурсов. Идея состоит в том, чтобы пользователи смогли взаимодействовать с высококачественными языковыми моделями в реальном времени, что безусловно открывает новые горизонты в области разработки и исследований.

Технология сжатия

Большие языковые модели требуют значительных ресурсов для хранения и обработки. В разжатом виде каждая модель использует 16 бит на параметр, что приводит к общему размеру 16 ГБ для 8B модели. Для оптимизации этого процесса применяются различные методы сжатия. Одним из самых распространённых является 4-битное сжатие nf4, которое позволяет уменьшить размер модели до 4 ГБ. Однако в примере используется более экстремальный метод — 2-битное сжатие.

Это решение уникально тем, что оно сокращает размер модели в восемь раз, что делает её объём около 2,5 ГБ. При этом достигается эффективное хранение информации с минимальными потерями качества. Использование такого подхода не только сокращает место на устройстве, но и способствует увеличению скорости вычислений, так как уменьшение объёма данных позволяет более эффективно работать с памятью, что критично для производительности моделей, работающих на конечных устройствах.

Преимущества экстремального сжатия

Экстремальное сжатие языковых моделей предлагает значительные преимущества в производительности и эффективности. Сжимая модель до 2 бит на параметр, мы не только уменьшаем её размеры, но и повышаем скорость вычислений. Это объясняется тем, что работа с меньшим объёмом данных требует меньше ресурсов памяти и времени на обработку. В результате, несмотря на то, что сжатая версия модели занимает в 2 раза меньше места, чем несжатая Llama 3.2 3B, она всё равно демонстрирует более высокое качество. Такое сочетание уменьшения размеров и увеличения производительности открывает новые горизонты для использования больших языковых моделей на устройствах с ограниченными ресурсами, делая их доступными для более широкой аудитории, без значительных потерь в качестве работы.

Концепция работы

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

В приведенном примере автор демонстрирует собственный подход (PV-Tuning), который улучшает существующие методы сжатия больших языковых моделей. Ключевым моментом является то, что PV-Tuning позволяет улучшить эффективность сжатия без необходимости изменять формат сжатых весов. Это достигается за счет оптимизации представления весов и их хранения, что не только снижает объем памяти, необходимой для работы моделей, но и повышает скорость их работы за счет уменьшения вычислительных затрат.

Использование Rust и WebAssembly

WebAssembly представляет собой революционную технологию, позволяющую запускать программы в веб-браузерах, написанные на различных языках программирования. Это открывает новые горизонты для разработчиков, поскольку теперь можно использовать более мощные и удобные инструменты для создания веб-приложений.

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

Например, формат safetensors от Hugging Face, используемый для хранения весов моделей, полностью реализован на Rust. Это значит, что любые взаимодействия с safetensors в Python, изначально написанном на Rust, выполняются с высокой производительностью и безопасностью. Кроме того, токенайзер tiktoken от OpenAI, применяемый в новых версиях Llama, также написан на этом языке. Благодаря интеграции Rust и WebAssembly мне удалось создать эффективное решение для инференса языковой модели, которое быстро и корректно работает в среде браузера, при этом обеспечивая высокую производительность и удобство использования.

Организация многопоточности

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

Основной вызов заключался в организации взаимодействия между воркерами и главным потоком. Был разработан кастомный RPC-стек, который позволяет эффективно обмениваться информацией между Rust и JavaScript. Такой подход обеспечивает гибкость и высокую скорость передачи данных. Когда главный поток требует выполнять операции, он посылает серию запросов в воркеры. Каждый воркер обрабатывает свой кусок данных и отправляет результаты обратно в главный поток, что в итоге увеличивает общую скорость вычислений примерно в два раза.

Завершение

Если вы хотите ознакомиться с работой модели без ожидания её загрузки, можете посмотреть видео демонстрации, которое наглядно продемонстрирует её возможности. Тем, кто решит протестировать модель на своём компьютере, рекомендую зайти на демо-страницу, где доступен интерактивный интерфейс. Чтобы обеспечить максимальную точность и качество ответов, лучше всего общаться с моделью на английском языке — в этом случае она сможет продемонстрировать свои аналитические способности в полной мере.

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

Поиск