CrowsHaveEyes

CrowsHaveEyes

На Пикабу
210 рейтинг 14 подписчиков 1 подписка 18 постов 0 в горячем
7

Квантизация позволяет запускать Llama 3.2 на мобилках

Квантизация помогла портировать последнюю версию LLM Llama 3.2 на мобильные платформы - iOS и Android. Для этого разработчики выпустили квантованные версии Llama 3.2 1B и 3B, которые при тестах на ARM-процессорах показали высокую скорость инференса, по сравнению с несжатыми весами в формате BF16.

Как вообще получилось, что Llama работает на мобильных процессорах, ведь для ее запуска нужен определенный программный стек, чаще всего библиотека Pytorch и CUDA на операционной системе Linux?

Дело в том, что Meta* (признана в России экстремистской организацией) используют ExecuTorch - это фреймворк, который является частью Pytorch-платформы и предназначен для запуска Pytorch-программ на мобильных девайсах. ExecuTorch поддерживается фреймворком Llama Stack для запуска моделей Llama, а именно легковесных Llama 3.2 1B и 3B, на iOS и Android. Для разработки мобильных приложений под эти платформы Llama Stack предоставляет клиентский SDK на Swift для iOS и Kotlin для Android, оба написаны под ExecuTorch бэкенд.

Какого именно уровня производительности удалось добиться новым квантованным моделям Llama?

В среднем это ускорение инференса от двух до четырех раз по сравнению с весами в формате BF16, при сохранении практически сопоставимого качества. Уменьшение размера модели на 56% - что важно для мобильного приложения, чтобы меньше места на телефоне занимало - и уменьшение объема потребляемой памяти на 41% процент. Все это согласно результатам бенчмарков, приведенных на сайте Llama.

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

Традиционный путь - QLoRA

Для квантизации применили два разных подхода, во-первых, QLoRA - знакомую методику, когда после квантизации матриц весов в 4bit к ним применяется low-rank-adaptation. Этот подход по-прежнему является очень эффективным и показал лучшие результаты на бенчмарках.

QLoRA достаточно легко выполнить самому, но для этого нужен подходящий графический процессор, базовая модель с весами в 16 битном разрешении и датасет. То есть веса модели сжимают в 4bit и файнтюнят на данных с применением LoRA, low-rank adaptation. Иными словами, обучаются только параметры LoRA-адаптеров - матриц более низкого порядка. Такой умный файнтюнинг дает то, что вы увидите ниже на приведенных бенчмарках - QLoRA-модель по качеству очень близка к весам в оригинальном разрешении.

Тем не менее, для этого метода все-таки необходима видеокарта - она должна иметь достаточно памяти, чтобы вместить веса в четырехбитном формате. Я арендую GPU в облаке для файнтюнинга с использованием QLoRA, и чаще всего я работаю с 8B моделями, так что мощности не такие уж огромные.

Усовершенствованная post-training квантизация: SpinQuant

Другой подход, альтернативный QLoRA - SpinQuant, который позволяет квантовать модели после обучения. То есть для выполнения квантизации вам не нужен датасет и видеокарты для обучения, в отличие от QLoRA. Вернее, видеокарта нужна, но по-настоящему обучать не придется. SpinQuant предполагает две манипуляции с весами модели - ротацию матриц активации и весов и обычную PTQ-квантизацию.

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

Есть открытый репозиторий на Python и Pytorch, который предлагает реализацию SpinQuant, совместимую с ExecuTorch и Llama Stack. С его помощью удобно квантовать веса под разные платформы, включая мобильные.

Вот результаты подробного сравнения моделей с разными типами квантизации. Представлены метрики, полученные на несжатых весах в BF16, на весах после обычной post-training квантизации - здесь заметно падение качества - и на весах после SpinQuant и QLoRA. Последние, особенно QLoRA, на бенчмарках показывают результаты очень близко к оригинальной модели.

Квантизация позволяет запускать Llama 3.2 на мобилках Искусственный интеллект, Машинное обучение, Программирование, Длиннопост

У SpinQuant и QLoRA примерно одинаковая скорость инференса, хотя QLoRA потребляет чуть больше памяти. Скорость более чем в два раза выше, чем у несжатых BF-16 весов.

Квантизация позволяет запускать Llama 3.2 на мобилках Искусственный интеллект, Машинное обучение, Программирование, Длиннопост

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

Но теперь даже мобильные разработчики получили инструменты, которые позволят им начать исследовать возможности Generative AI.

Показать полностью 2
5

Мультимодальные приложения на Llama 3.2 и Llama Stack

Недавний релиз Llama 3.2 с мультимодальными версиями 11B и 90B открывает возможности для создания AI приложений, анализирующих визуальный ввод.

Мультимодальные модели были и раньше, но это первая официальная версия Llama с такими функциями. Модель может быть использована для распознавания объектов и текста на изображении, как это делает GPT-4o. Довольно интересен технический рецепт создания мультимодальной Llama 3.2. За основу была взята предыдущая версия - 3.1, обычная текстовая LLM. Логично, если принять во внимание, что конечная цель - извлекать признаки изображения и “транслировать” их в текстовые токены.

К LLM добавили image encoder, это модуль, который встраивает представление картинки-ввода в векторное пространство. А также слои image adapter’а - для того, чтобы полученные визуальные признаки передавать в языковую модель. Подробнее об энкодерах и адаптерах изображений можно прочитать, например, в статье Bordes et al. 2024 - введение в визуально-языковые модели. Обучают VLM на парах изображение-текст, именно так обучали и Llama 3.2. Причем в несколько этапов - сначала на большом корпусе данных, а затем применили файнтюнинг на меньшей, но более качественной выборке. Как показывает прошлый опыт работы с моделями Llama 3, такой подход дает хорошие результаты. Базовая модель, обученная на большом корпусе данных (например, 15трлн токенов Llama 3), хорошо генерализуется при файнтюнинге и меньше подвержена оверфиттингу. Пример - моя модель ruslandev/llama-3-8b-gpt-4o-ru1.0, которая после обучения на небольшом, но качественном датасете превзошла GPT-3.5 на русскоязычном бенчмарке.

Архитектура мультимодальных моделей Llama 3.2 - вопрос интересный, но в этой статье я хочу рассказать и о прикладной стороне, то есть о разработке AI приложений с использованием этих моделей.

Создатели Llama предложили Llama Stack - фреймворк для работы с их моделями, который позволяет деплоить многофункциональные API (для инференса, систем агентов, генерации собственных данных для обучения и других задач). У Llama Stack есть несколько клиентских SDK, в том числе на Python. С недавнего времени поддерживается мобильная платформа iOS - потому что модели Llama 3.2 1B и 3B могут работать на мобильном девайсе. Это обычные текстовые, только очень легковесные модели. По качеству сопоставимы с Gemma 2 и Phi-3.

Но если вас интересует именно мультимодальная Llama 3.2, то для ее деплоя на Llama Stack потребуется GPU -  особенно для версии 90B. Я развернул Llama Stack с мультимодальной 11B в облаке на видеокарте RTX 4090 и протестировал через Inference API и Python-клиент. По моим впечатлениям, и модель, и API вполне себе готовы к запуску в продакшен. Llama Stack поддерживает разнообразные API-бэкенды, как self-hosted (например, TGI) так и cloud-hosted (AWS Bedrock, Together и другие).

Если вам нужно развернуть Llama Stack на своей виртуальной машине - вот как я это сделал в GPU облаке. Кстати, видеокарты RTX 4090 более чем достаточно для работы мультимодальной 11B. Если хотите версию 90B, можете выбрать другой GPU или несколько. Llama Stack поддерживает мульти-GPU и квантизацию.

Я установил фреймворк, используя anaconda, но есть и вариант для тех, кто предпочитает докер. Мой тест модели и фреймворка можно посмотреть в этом видео:

Из минусов фреймворка - не помешала бы более подробная документация. В репозитории Llama Stack есть пример из демо - приложение-помощник дизайнера интерьера. Оно демонстрирует несколько концепций фреймворка, в том числе - создание и конфигурация агента, мультимодальный инференс, работа с памятью и RAG.


Чем хорошо наличие еще одного фреймворка для Generative AI? На первый взгляд функционал Llama Stack напоминает то, что уже было до него - LangChain, LlamaIndex и другие подобные фреймворки. Хорошо то, что этот инструмент является частью экосистемы Llama и, вероятно, станет официальным открытым API последующих версий ламы. Прицел на кроссплатформенность и многозадачность говорит о том же. Ранние доморощенные решения, скорее всего, перестанут быть актуальными, что относится и к моему собственному фреймворку - gptchain. Однако это верный признак того, что прикладная отрасль Generative AI становится более зрелой.

Показать полностью 1
8

OpenAI o1 - LLM, обученная выполнять сложные логические рассуждения

OpenAI изменили направление развития своих языковых моделей, от просто генерации текста их последняя модель перешла к решению задач с использованием логики и пошагового анализа проблемы

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

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

Во-первых, промпт, который требует от модели выполнять пошаговое рассуждение, "Chain of Thoughts" (Wei et al., 2022). Было установлено, что инференс с таким промптом заметно улучшает способность модели строить логически верные рассуждения.

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

OpenAI o1 - LLM, обученная выполнять сложные логические рассуждения Искусственный интеллект, Программирование, Машинное обучение, Программист

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

Досадно то, что OpenAI не открыли доступ к своим цепочкам рассуждений, которыми оперирует o1. Официальная причина - рассуждения модели не цензурируются, чтобы они не потеряли эффективность. Так что пользователь видит только краткое саммари и финальный ответ. Но основная причина того, что цепочки мыслей скрыты, это защита от конкурентов, как легко догадаться. Используя тот же подход обучения с подкреплением и данные цепочек мыслей, можно было бы обучить открытую модель генерировать их так же, как это делает o1.

Впрочем, рано или поздно это все равно произойдет. Недавно компания SambaNova опубликовала демо на HuggingFace - Llama-3.1-Instruct-O1. Как становится понятным из названия, они использовали модель Llama-3.1-Instruct, а именно версию 405B. Модель работает со сложным системным промптом, который заставляет ее строить цепочки мыслей, что похоже на o1. Этот эксперимент показывает достаточно хорошие результаты. Осталось улучшить способность Llama или другой открытой модели генерировать собственные цепочки мыслей путем обучения или файнтюнинга.

Генерация сложных цепочек мыслей действительно требует значительных ресурсов, и при выборе вычислительных мощностей для подобных задач важно учитывать, как оно справляется с высокими нагрузками. Одно из решений — использование квантизации моделей и серверных видеокарт с высокой пропускной способностью. В своих экспериментах я пробую разные облачные платформы, включая те, которые предлагают производительные видеокарты. Если вам интересно, какие результаты я получил, можно ознакомиться с подробным анализом на моем YouTube канале (Ruslan Dev), где я делюсь своим опытом работы с различными конфигурациями.

Скорость генерации становится особенно важной для моделей рассуждений типа o1. Качество ответа повышается пропорционально времени, которое модель тратит на обдумывание проблемы. Но ждать ответа часами пользователь не может, поэтому например SambaNova для своего демо использовали собственный AI-чип SN40L, с помощью чего удалось достичь скорости генерации 129 токенов в секунду. Еще один известный стартап в области AI-чипов, который преодолевает лимит скорости генерации - Groq. Такие решения понадобятся для инференса "думающих" языковых моделей.

Показать полностью 1
12

Запуск Llama 405b на своем сервере

В сегодняшней статье мы будем запускать модель Llama 405b на сервере. Llama 405b является одной из самых мощных открытых текстовых моделей, занимающей около 200 Гб памяти, если ее квантизировать в 4 бита при помощи AWQ квантизации. Мы будем использовать проект vLLM, который позволяет задеплоить на свой сервер практически любую нейросеть из Hugging Face.

Запуск Llama 405b на своем сервере Искусственный интеллект, Программирование, Сервер, Машинное обучение, Московская область, Openai, ChatGPT

Выбор сервера

Для запуска модели Llama 405b нам нужен мощный сервер с четырьмя видеокартами A100, каждая из которых имеет 80 Гб видеопамяти. Суммарно получается 320 Гб видеопамяти. Примерно 200 ГБ займут веса модели, а остальное останется для контекста. Я использую сервер в облачном GPU сервисе с конфигурацией 4 х A100(80 gb). В качестве операционной системы используется серверная Ubuntu 24.04.

Запуск Llama 405b на своем сервере Искусственный интеллект, Программирование, Сервер, Машинное обучение, Московская область, Openai, ChatGPT

Docker

Первым шагом будет установка Docker на наш сервер. Я использовал Docker для запуска контейнера vLLM. Docker позволяет существенно упростить установку.

Запуск vLLM

Команда для запуска vLLM будет выглядеть следующим образом:

sudo docker run --ipc=host --log-opt max-size=10m --log-opt max-file=1 --rm -it --gpus '"device=0,1,2,3"' -p 8000:8000 --mount type=bind,source=/home/ubuntu/.cache,target=/root/.cache vllm/vllm-openai:v0.5.4 --model hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4 --tensor-parallel-size 4 --gpu-memory-utilization 0.94 --dtype half -q awq --disable-log-requests

После запуска к серверу можно слать запросы в OpenAI формате. На клиентской части используются библиотеки OpenAI. Многие программисты уже имеют такой опыт при обращении к ChatGPT по API.

Выводы

Вывод из этого эксперимента заключается в том, что модель Llama 405b доступна для запуска на своем сервере. Однако, производительность сервера может быть не такой высокой, как хотелось бы. Если вам важна приватность или у вас есть огромный объем данных, который может загрузить полностью видеокарты, то это может быть подходящий вариант.

Стоимость аренды сервера составляет около 800 рублей в час. Если снимать сервер на длительное время, то стоимость может быть снижена до 50%. Стоимость внешних API для доступа к Llama 405b начинается от 3 долларов за миллион токенов. Если у вас нет требований к приватности данных или количество запросов относительно небольшое, то проще и выгоднее использовать внешние сервисы, которые предлагают доступ к нейросетям по API.

Показать полностью 1
8

Llama 3.1 и Mistral Large 2

В прошлом месяце вышли две интересных модели - Llama 3.1, улучшенная версия Llama 3, и Mistral Large 2.

Самое заметное отличие Llama 3.1 от предыдущих моделей - у нее есть версия 405B- 405 миллиардов обучаемых параметров. Это самая большая открытая языковая модель, и опубликованные метрики показывают ее производительность на уровне GPT-4. Тесты проводились как на общих бенчмарках, например MMLU, так и специализированных - на код и математику.

Для меня особенно интересными показались улучшенные мультиязычные возможности этой модели, так как я давно экспериментирую с обучением LLM на мультиязычных данных, моя последняя модель ruslandev/llama-3-8b-gpt-4o-ru1.0 превзошла GPT-3.5 на русскоязычной версии бенчмарка MT-Bench.

Llama 3.1 поддерживает семь языков, кроме английского - французский, немецкий, хинди, итальянский, португальский, испанский и тайский. Русского в списке нет, как легко заметить, но это не значит, что в корпусе базовой модели нет примеров на русском. Есть, и предостаточно, это становится очевидно при файнтюнинге. У меня есть мой собственный датасет для файнтюнинга ruslandev/tagengo-rus-gpt-4o, который я сгенерировал из преимущественно русскоязычных промптов датасета Tagengo с помощью GPT-4o.

Теперь о минусах модели Llama 3.1 - файнтюнинг 405B версии обойдется дорого, так как даже при сжатии в 4bit необходимо выделить около 200 ГБ VRAM для такой задачи. Поэтому я файнтюнил версию 8b на вышеупомянутом датасете, арендуя две видеокарты A100 на облачном сервисе immers.cloud. Но я не заметил особого превосходства версии 3.1 над третьей версией. Даже наоборот, я столкнулся с несколькими проблемами - например, 3.1 после файнтюнинга на моем датасете показала тенденцию прерывать генерацию, не завершив ответ - до причины я так и не докопался, но у Llama 3 такой проблемы не было.

Кстати, если вам тоже кажется неподъемной версия 405B для запуска на своем железе, стоит обратить внимание на модель Mistral Large 2, которая вышла почти одновременно с Llama 3.1. У этой модели 123 миллиарда параметров - в три с лишним раза меньше, чем у Llama 3.1 405B. Но вот интересные результаты бенчмарков, по которым можно сравнить эти две модели.

Мистраль побеждает ламу на MT-Bench:

Llama 3.1 и Mistral Large 2 Искусственный интеллект, Nlp, Машинное обучение, Длиннопост

А также на задачах по генерации кода и математике:

Llama 3.1 и Mistral Large 2 Искусственный интеллект, Nlp, Машинное обучение, Длиннопост
Llama 3.1 и Mistral Large 2 Искусственный интеллект, Nlp, Машинное обучение, Длиннопост

При этом очевидно, что инференс Mistral Large 2 обходится дешевле.

Я еще не пробовал файнтюнинг Mistral - у Llama, на мой взгляд, больше инструментов для этого, включая официальные скрипты llama-recipes, которые поддерживают FSDP - Fully-Sharded Data Parallel, эффективный способ распределенного файнтюнинга, когда на нескольких видеокартах параллелятся не только данные (в отличие от DDP - Distributed Data Parallel), но и параметры и градиенты модели.

Так что по крайней мере 8B версия llama 3 и 3.1 остается отличным материалом для ИИ разработки, при ее легковесности и высокой производительности.

Показать полностью 3
12

Как обучил языковую модель, которая понимает русский лучше GPT 3.5 Turbo

В этой статье я расскажу, как я смог обучить модель, которая превзошла GPT 3.5 Turbo на русскоязычной части MT-Bench. Также я рассмотрю новую конфигурацию для обучения на двух графических процессорах параллельно с помощью accelerate и deepspeed.

Особенный интерес представляет мой датасет для обучения. Он получен из сабсета мультиязычных промтов набора lightblue/tagengo-gpt4 на русском, английском и китайском, всего 10 тысяч примеров, сгенерированных с помощью GPT-4o. Это в 8 раз меньше, чем исходный набор Tagengo, но обученная на последнем Suzume, как показали бенчмарки, лишь очень незначительно превосходит мою модель на ru_mt_bench, а на англоязычном бенче и вовсе уступает ей. Это значит, что я в разы сэкономил на GPU за счет более высокого качества данных, полученных с помощью GPT-4o.

Я использовал скрипт для получения ответов по заданным промптам. Для генерации русскоязычной выборки я изменил часть скрипта, чтобы выбрать все промпты на русском из Tagengo (8K примеров), так как основной фокус при обучении модели был на русском языке.

В итоге я получил датасет ruslandev/tagengo-rus-gpt-4o и приступил к обучению.

Для этого я создал Виртуальную Машину с NVIDIA H100, используя сервис immers.cloud. Для достижения наилучших результатов по instruction-following (что проверяется на MT-Bench) я взял в качестве исходной модели meta-llama/Meta-Llama-3-8B-Instruct. Именно на ней обучена модель Suzume, у которой высокая оценка на MT Bench. Предыдущие эксперименты показали, что базовая Llama-3 8B, а особенно ее четырехбитная версия для QLoRA - unsloth/llama-3-8b-bnb-4bit - значительно отстает по оценкам бенчмарка.

В этот раз я обучил параллельно на двух GPU, для этого я задал новую конфигурацию моей Виртуальной Машины - две NVIDIA A100.

Я воспользовался инструментом axolotl, который позволяет быстро сконфигурировать и запустить сессию обучения.

Мой конфиг axolotl здесь.

После установки axolotl, которая описана в документации, остается только запустить обучение командой:

accelerate launch -m axolotl.cli.train config.yaml

Accelerate - это Huggingface библиотека для распределенного обучения.

axolotl запустил два параллельных процесса с шардами модели для каждого из двух GPU. Обучение на одну эпоху длилось около часа, итоговый train loss - 0.8.

Результат превзошел мои ожидания - третье место в mt_bench:

Как обучил языковую модель, которая понимает русский лучше GPT 3.5 Turbo Программирование, Искусственный интеллект, Длиннопост

Моя модель превзошла llama-3-8b-instruct и большинство версий Suzume, кроме самой сильной из них. Это на англоязычном бенчмарке.

Теперь - результат ru_mt_bench:

Как обучил языковую модель, которая понимает русский лучше GPT 3.5 Turbo Программирование, Искусственный интеллект, Длиннопост

Моя модель получила оценку 8.12, немного не дотянув до Suzume и превосходя gpt-3.5-turbo, у которой 7.94.

Это очень многообещающий результат, здесь можно сделать несколько выводов. Во первых, мой датасет в восемь раз меньше, чем Tagengo, а значит, обучение обошлось гораздо дешевле, чем Suzume - всего-то два GPU часа.

Я не увеличивал англоязычную выборку в своем датасете, там всего тысяча примеров на английском, а англоязычный MT Bench неожиданно показал среднюю оценку 8 баллов. Это значит, что добавление большего количества качественных мультиязычных данных повышает общее качество модели, а не только ее показатели для этого конкретного языка. Эта эффект уже был показан в статье Петера Девина - Tagengo: A Multilingual Chat Dataset

Я очень рад, что мне удалось наблюдать реализацию этой идеи на практике. Мой датасет, веса модели, а также файлы в формате GGUF опубликованы в моем Huggingface аккаунте.

Модель: https://huggingface.co/ruslandev/llama-3-8b-gpt-4o-ru1.0

GGUF: https://huggingface.co/ruslandev/llama-3-8b-gpt-4o-ru1.0-gguf

Датасет: https://huggingface.co/datasets/ruslandev/tagengo-rus-gpt-4o

Показать полностью 2
5

Преимущества Tesla H100 в ML

Перезалив статьи. Пикабу не понравилось, что я активно рекламировал свои каналы. Меня зовут Руслан, я инженер-программист, автор YouTube канала Ruslan Dev, специализируюсь на облачных вычислениях и машинном обучении. В этом кейсе я расскажу о своем опыте разработки больших языковых моделей (LLM). Так как один из самых передовых графических процессоров Н100 стоит как крыло самолета, я арендовал ее через облачный сервис immers.cloud, чтобы я мог развернуть интересующую меня LLM.

В последнее время я часто обучал нейросети на видеокартах NVIDIA, и для своих задач я предпочитаю использовать одну из последних моделей - Н100. Созданная специально для AI-приложений, эта видеокарта обеспечивает наибольшую скорость обучения, что критически важно при разработке LLM на базе трансформера.

Ниже несколько нюансов.

Вычислительную способность графического процессора оценивают по числу операций с плавающей точкой в секунду, Flops. Именно в этом отношении H100 является лидером и вдвое (1.5K TFlops) превосходит модель-предшественника A100. Зачем нужно так много операций с плавающей точкой, читайте ниже, где я привел немного справочной информации.

Деплой базовой модели и инструментов для обучения на облачной платформе осуществляется достаточно просто - можно выбрать предустановленный образ Ubuntu с CUDA. Для конфигурации окружения остается установить Pytorch/Tensorflow/Jax и другие нужные библиотеки.

Как именно я настраиваю свое ML окружение, я описал в этом гайде.

Если вы знакомы с терминалом Linux, развертывание виртуальной машины с H100 на облаке, установка пакетов и конфигурация процесса обучения - например, в виде Unix-демона, как это сделал я - не составит для вас труда.

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

Наглядный пример преимущества скорости, которое H100 дает при обучении большой модели Llama 3 70B по сравнению с A100, был показан в моем видео:

Файнтюнинг и квантизация Llama-3 70B

По результатам этого примера, обучение Llama 3-70B на GPU H100 потребовало 7 часов, чтобы выполнить 2400 итераций:

График обучения

По сравнению с другими моделями H100 показала явное превосходство в скорости.

Но Flops - это не единственный параметр, который мне приходится учитывать при обучении нейросетей. Объем видеопамяти и пропускная способность видеокарты - два очень важных показателя. Первый определяет, сможете ли вы вместить веса своей модели в память GPU. А второй - с какой скоростью батч, или "кусок" данных, за одну итерацию обучения передается из видеопамяти в кэши и регистры ядер GPU, где происходит перемножение матриц, о котором речь ниже.

У H100 размер видеопамяти - 80 гигабайт - и пропускная способность - 2 терабайта в секунду - не отличаются от соответствующих параметров модели A100. Этих значений достаточно, чтобы обучать такие большие модели, как Llama 3 70B. Но с увеличением размера батча данных увеличивается размерность матрицы, которую перемножает GPU, а для этого нужно больше Flops, и здесь H100 проявляет себя, устраняя барьер скорости.

А дальше немного общей справочной информации.

При обучении трансформер выполняет операцию перемножения матриц - matmul, в очень тяжеловесных масштабах. Даже "небольшие" AI-модели имеют по 7-8 миллиардов параметров, которые перемножаются с вектором переданного на вход батча при каждой итерации обучения, а число итераций зависит от числа этих батчей, т. е. от объема данных. Этот объем при обучении современных базовых, или foundational моделей может достигать размеров Интернета - скажем, текстовый корпус Llama 3 содержит 15 триллионов текстовых токенов.

Конечно, не все задачи, связанные с AI, имеют такие эпические масштабы. LoRA предлагает эффективный способ уменьшения числа обучаемых параметров путем конвертации весов в матрицы низшего порядка. А при наличии уже обученной foundational модели чаще всего моя задача сводится к файнтюнингу на совсем небольшом наборе данных, условно от 10 до 100K примеров.

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

Благодарю за внимание, надеюсь, мой опыт поможет вам при выборе видеокарт для ML-приложения.

Ruslan Dev

Показать полностью
9

Цикл разработки LLM

В этой статье я использую мой опыт обучения больших языковых моделей (смотрите серию видео на канале Ruslan Dev), чтобы выявить и описать основные фазы разработки собственной LLM.

На сегодняшний день разработчики GenAI моделей, как правило, используют веса базовых (foundational) моделей, а не обучают нейросеть с нуля. В качестве данных для обучения часто используются ответы state-of-the-art LLM, таких как GPT-4. Этот подход получил распространение с тех пор, как создатели Stanford Alpaca показали, что инференс небольшой модели наподобие Llama 7B можно приблизить по качеству к GPT-3 путем файнтюнинга на ответах последней.

С тех пор и коммерческие, и опенсорс-модели шагнули вперед. Я работал с базовой моделью Llama-3, обученной на беспрецедентно огромном корпусе из 15 триллионов текстовых токенов, что дает широкие возможности для файнтюнинга. А датасет для обучения я собирал с помощью последней модели OpenAI - GPT-4o. Как видите, переменные изменились, но уравнение осталось то же - подход Альпаки работает по-прежнему.

Цикл разработки LLM Программирование, ChatGPT, Искусственный интеллект, Гайд, Длиннопост

Первую фазу создания LLM - сбор данных - я уже упомянул, за ней следует собственно обучение (точнее, файнтюнинг), evaluation (оценка) и квантизация. Индустрия AI пока формируется, и среди инструментов для разработки LLM нет единого стандарта - для каждой из этих фаз программисты используют то, что им подходит. Я считаю, что наличие фреймворка, предлагающего стандартную реализацию вместо беспорядочного скриптинга, не повредит инновациям - даже наоборот. Поэтому две наиболее сложные в вычислительном плане фазы разработки - обучение и квантизацию модели - я реализовал в моем фреймворке gptchain.

Что касается сбора данных, этот процесс в рассмотренном случае сводится к выполнению запросов к API GPT-4o, для чего я написал отдельный скрипт - он прилагается к моему датасету, опубликованному на Huggingface.

Промпты я взял из мультиязычного датасета Tagengo. При этом я решил отфильтровать промпты, на которые модель отвечает типа - извините, не могу с этим помочь. Чаще всего это потому, что промпт не проходит цензуру.

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

После получения ответа на каждый промпт все диалоги мержатся с помощью Pandas, а затем конвертируются в датасет в формате Huggingface. Как видите, скрипт для сбора данных функционально получился достаточно простой. Суть идеи в том, что громко анонсированная модель GPT-4o с улучшенными мультиязычными возможностями поможет существенно улучшить навыки ламы-3 справляться с задачами на следование инструкциям.

Для фазы обучения я использовал виртуальную машину с GPU NVIDIA H100 на облачном сервисе immers.cloud. Как настроить виртуальную машину, установить виртуальное окружение python и необходимые пакеты, я рекомендую прочитать в этой статье или посмотреть видео.

Я добавил поддержку своего нового датасета в gptchain, который, как и Tagengo, загружается с Huggingface в ShareGPT формате, а затем конвертируется моим фреймворком в ChatML.

Я обучал на 3 эпохи. Так как датасет маленький - 3 тысячи примеров, 3 эпохи не заняли много времени - примерно полчаса. Следует учесть, что это для Llama-3 8B, QLoRA с 4-битной квантизацией.

Как показывают метрики wandb, после трех эпох обучения train loss уменьшился с 1.4 до 0.8.

Прежде, чем перейти к следующей фазе - оценке модели на бенче, давайте сравним ее инференс с моими предыдущими экспериментами, чтобы почувствовать разницу чисто субъективно.

После файнтюнинга на датасете Tagengo (состоящем из ответов GPT-4):

Я: Из чего состоит нейронная сеть?

ИИ: Нейронная сеть состоит из нескольких основных компонентов, которые работают вместе для обработки и анализа данных. Вот основные компоненты нейронной сети:

**Нейроны (или узлы)**: Это основные вычислительные единицы нейронной сети. Нейроны принимают входные данные, обрабатывают их и генерируют выходные данные. [...]

После файнтюнинга на моем датасете (на ответах GPT-4o):

Я: Из чего состоит нейронная сеть?

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

**Входные нейроны**: принимают данные для обработки. В зависимости от задачи, данные могут быть в виде числовых значений, изображений, звуковых сигналов и т.д. [...]

Какой ответ лучше, оставлю судить вам. Важно отменить, что для генерации первого ответа использована Llama-3 70B, второго - Llama-3 8B.

Теперь пора оценить мою новую модель. Я использовал мультиязычный MT-Bench, и генерация ответов на тестовые вопросы на английском и на русском заняла у меня больше времени, чем сам файнтюнинг.

Кстати, техническую инструкцию, как выполнить мультиязычный MT-Bench на своей модели, смотрите в этой статье.

Результат моей модели на английском бенче составил 6.6, это значительно хуже, чем у той же Suzume, что впрочем неудивительно - в моем датасете всего тысяча англоязычных ответов, против 15 тысяч в датасете Tagengo.

Я попробовал и русскоязычный бенчмарк ru_mt_bench. На нем я получил 7.3, не так плохо, близко к GPT-3.5, но все еще слабее Suzume.

Подытожим. Для моего эксперимента мне хватило одной Виртуальной Машины с одним H100, но как бы этот процесс выглядел, будь это серьезный продакшн? Очевидно, добавился бы model parallelism - для более серьезного обучения лама параллелилась бы на несколько H100 одновременно. Я не затронул последнюю фазу - квантизацию, которая нужна для деплоя модели на компьютер или сервер пользователя. Для этого хорошо подходит GGUF формат, поддерживаемый библиотекой llama.cpp.

Можно представить, что для "фабрики LLM" наподобие той, что работает за закрытыми дверями "Open" AI, все эти фазы должны быть автоматизированы - включая дата-пайплайн и бенчмарки. Сделать это проще в облаке при наличии фреймворка наподобие gptchain, но все же остается нетривиальной задачей. Все описанные фазы разработки LLM можно посмотреть в действии - в моем последнем видео.

Показать полностью 1
Отличная работа, все прочитано!