Пришли две новые штукенции, коммутатор на 2.5Гбит и райзер сплитер 16x на пару 8x. #server
🔥19👍1👏1
Media is too big
VIEW IN TELEGRAM
"What I cannot create I do not understand" (c) Richard Feynman
Решил провести небольшой эксперимент чтобы узнать:
Если кратко, то да, может, но обо всём по порядку.
В качестве кодогенератора взял Cursor, но не простой, а используя модельку Sonnet 4.6 от Antropic, при этом, поскольку Claude Code мне так и не удалось настроить нормально, пришлось юзать модельку через API.
Заранее написал и предоставил агенту подробные спецификации по разработке кодового агента, агент этот должен собираться в один бинарник (да да, выбрал golang), должен уметь работать в формате Agent Client Protocol (ACP) агента, приложил ссылки на документацию, спецификации ACP, примеры того как работает Cursor, Codex и Claude Code, информацию о том как работать со скилами и MCP-серверами, плюс информацию о разных протоколах общения с моделями (OpenAI, Antripic, Ollama, OpenAI-like) и что мне нужен агент способный работать в режиме агента и в режиме планировщика (два моих любимых режима), плюс нужен визард конфига для первичной настройки.
Флоу стандартный BDD, сначала модель должна изучить все документы что я предоставил, потом синтезировать спецификации того, что конкретно она будет делать, потом по слоям создавать решение, сначала тесты, потом класс и так далее. В финале она должна убедиться, что полученное решение проходит все тесты, собирается по инструкции и что его можно по ACP использовать. Моделька соннет 4.6 где-то полчаса пилила проект, составил документацию хорошую. потом итеративно реализовала код. Отскакивая в сторону могу сказать, что качество кода для one-shot в целом очень приемлемое, понимаю почему людям так нравится клод код и эти модельки.
Далее я попробовал через плагин obsidian-agent-client для Obsidian настроить созданный мой агент и о чудо, он работает, хотя конечно у меня есть вопросики к интерфейсу ACP-клиента в Obsidian (форкну@пофикшу, ага), но это пока что мелочи.
Исходники Coddy Agent тут: https://github.com/coddy-project/coddy-agent
Решил провести небольшой эксперимент чтобы узнать:
может ли кодовый агент создать кодовый агент?
Если кратко, то да, может, но обо всём по порядку.
В качестве кодогенератора взял Cursor, но не простой, а используя модельку Sonnet 4.6 от Antropic, при этом, поскольку Claude Code мне так и не удалось настроить нормально, пришлось юзать модельку через API.
Заранее написал и предоставил агенту подробные спецификации по разработке кодового агента, агент этот должен собираться в один бинарник (да да, выбрал golang), должен уметь работать в формате Agent Client Protocol (ACP) агента, приложил ссылки на документацию, спецификации ACP, примеры того как работает Cursor, Codex и Claude Code, информацию о том как работать со скилами и MCP-серверами, плюс информацию о разных протоколах общения с моделями (OpenAI, Antripic, Ollama, OpenAI-like) и что мне нужен агент способный работать в режиме агента и в режиме планировщика (два моих любимых режима), плюс нужен визард конфига для первичной настройки.
Флоу стандартный BDD, сначала модель должна изучить все документы что я предоставил, потом синтезировать спецификации того, что конкретно она будет делать, потом по слоям создавать решение, сначала тесты, потом класс и так далее. В финале она должна убедиться, что полученное решение проходит все тесты, собирается по инструкции и что его можно по ACP использовать. Моделька соннет 4.6 где-то полчаса пилила проект, составил документацию хорошую. потом итеративно реализовала код. Отскакивая в сторону могу сказать, что качество кода для one-shot в целом очень приемлемое, понимаю почему людям так нравится клод код и эти модельки.
Далее я попробовал через плагин obsidian-agent-client для Obsidian настроить созданный мой агент и о чудо, он работает, хотя конечно у меня есть вопросики к интерфейсу ACP-клиента в Obsidian (форкну@пофикшу, ага), но это пока что мелочи.
Исходники Coddy Agent тут: https://github.com/coddy-project/coddy-agent
🔥12❤5
boosty.to
Павел Злой - Директор ИИ-завода
20 лет в IT ∈ 10 лет в разработке ∈ 3 года в ML/AI ∈ 1 год - вайбмастер
Кстати, поскольку судьба Телеграм неизвестна, на всякий случай, чтобы не потерять связь, завёл страничку на Бусти:
https://boosty.to/evilfreelancer
Планирую там публиковать посты про внутрянку проектов, лонгриды, которые не попадают в формат телеги, размышления на разные темы, ну и анонсы проектов для тех кому будет интересно принять участие в тестировании новинок.
https://boosty.to/evilfreelancer
Планирую там публиковать посты про внутрянку проектов, лонгриды, которые не попадают в формат телеги, размышления на разные темы, ну и анонсы проектов для тех кому будет интересно принять участие в тестировании новинок.
🔥8❤🔥2❤2😁1😢1
Pavel Zloi pinned «Кстати, поскольку судьба Телеграм неизвестна, на всякий случай, чтобы не потерять связь, завёл страничку на Бусти: https://boosty.to/evilfreelancer Планирую там публиковать посты про внутрянку проектов, лонгриды, которые не попадают в формат телеги, размышления…»
Проблема долговременной памяти чатов
Хоть я и считаю себя сторонником памяти агентных систем, даже большой пост на эту тему писал, но работая с чатами в которых есть память истории всех сообщений периодически ловлю себя на мысли, что надо напилить какой-нибудь пост на тему того, что память эта частенько работает плохо, вносит искажения в ответы модели и единственный годный режим её работы это "off", то есть отключена.
Пока ещё не придумал как сделать долговременную память хорошо, самое удачное решение на данный момент это кажется концепция которую я условно назвал "долговременная доменная память" (LDM), постараюсь кратко её описать, представим что мы создали Project в ChatGPT, это такая группа чатов, в которую мы закидываем файлы, промты, там же все чаты находятся, вот память в таком компактном домене была к месту.
Развивая эту мысль было бы удобно связать домены памяти, и скажем когда я работаю с доменом спецификаций некоего проекта я мог бы дать доступ к домену с нормативами от ИБ и или скажем домену оформления схем данных, при информационные потоки между доменами чтобы были однонаправленные, типа отсюда сюда я могу запросить память, а в другую сторону не могу.
Проще всего описать это в формате графа, где синие узлы это группы, а серые это чаты, чаты в пределах своего домена и в пределах доменов в которые есть доступ могут искать данные, но в других нет.
Хоть я и считаю себя сторонником памяти агентных систем, даже большой пост на эту тему писал, но работая с чатами в которых есть память истории всех сообщений периодически ловлю себя на мысли, что надо напилить какой-нибудь пост на тему того, что память эта частенько работает плохо, вносит искажения в ответы модели и единственный годный режим её работы это "off", то есть отключена.
Пока ещё не придумал как сделать долговременную память хорошо, самое удачное решение на данный момент это кажется концепция которую я условно назвал "долговременная доменная память" (LDM), постараюсь кратко её описать, представим что мы создали Project в ChatGPT, это такая группа чатов, в которую мы закидываем файлы, промты, там же все чаты находятся, вот память в таком компактном домене была к месту.
Развивая эту мысль было бы удобно связать домены памяти, и скажем когда я работаю с доменом спецификаций некоего проекта я мог бы дать доступ к домену с нормативами от ИБ и или скажем домену оформления схем данных, при информационные потоки между доменами чтобы были однонаправленные, типа отсюда сюда я могу запросить память, а в другую сторону не могу.
Проще всего описать это в формате графа, где синие узлы это группы, а серые это чаты, чаты в пределах своего домена и в пределах доменов в которые есть доступ могут искать данные, но в других нет.
👍9❤4🔥4✍1
Loading model from ruGPT3XL ...
Device: cpu, dtype: float32
Loading weights: 100%|██████████| 389/389 [00:01<00:00, 213.86it/s]
Model loaded. Parameters: 1,418,678,272
Prompt: В далеком космосе
Generated: В далеком космосе, в одной из звездных систем галактики Млечный путь на орбите искусственного спутника Земли вращается небольшое космическое тело — искусственный спутник «К-2», по своим размерам и массе не уступающий самой планете. На борту этого космического тела находится база для исследовательских работ землян под названием Земля-3126/1А.
На Земле же все спокойно: ученые проводят исследования атмосферы планеты
❤5
boosty.to
Реставрация ruGPT3XL 1.3B - Павел Злой
Пару дней занимаюсь попытками заставить работать модельку ai-forever/rugpt3xl , это такая классическая моделька от SberDevices на 1.3B параметров (крошка по современным меркам), на которой сберовцы обкатывали свои научные наработки. Подробнее в научной…
Ловите мой новый пост на Бусти, в нём я рассказываю про модельку ruGPT3XL на 1.3B, которую мне удалось отреставрировать и заставить работать на современном железе.
upd. Пост на бусти так как ещё не всё готово, но всех кому интересно приглашаю принять участие в тестировании.
upd. Пост на бусти так как ещё не всё готово, но всех кому интересно приглашаю принять участие в тестировании.
1❤7
Pavel Zloi
Ловите мой новый пост на Бусти, в нём я рассказываю про модельку ruGPT3XL на 1.3B, которую мне удалось отреставрировать и заставить работать на современном железе. upd. Пост на бусти так как ещё не всё готово, но всех кому интересно приглашаю принять участие…
GitHub
convert_hf_to_gguf: add RuGPT3XL (RuGPT3XLForCausalLM) support by EvilFreelancer · Pull Request #21011 · ggml-org/llama.cpp
Overview
Add conversion support for ruGPT3XL (RuGPT3XLForCausalLM), a tiny 1.3B Russian legacy GPT3-like decoder model (evilfreelancer/ruGPT3XL recovered from ai-forever/rugpt3xl).
The model is a b...
Add conversion support for ruGPT3XL (RuGPT3XLForCausalLM), a tiny 1.3B Russian legacy GPT3-like decoder model (evilfreelancer/ruGPT3XL recovered from ai-forever/rugpt3xl).
The model is a b...
🔥19👍3
Встречайте мой новый пост "Реставрация ruGPT-3 XL или как я вернул к жизни забытую русскую языковую модель" на Хабр, в нём я подробно рассказал о том как была реализована конвертация, как проводилось её тестирование, как запустить локально, как конвертировать в GGUF.
А вот ссылочки:
- evilfreelancer/ruGPT3XL - сконвертированная модель в формате HuggingFace (safetensors)
- evilfreelancer/ruGPT3XL-GGUF - квантизированные GGUF-веса для llama.cpp и Ollama
- evilfreelancer/rugpt3 - GGUF загруженные на Ollama
- EvilFreelancer/rugpt3xl-convert - исходники скриптов конвертации
А вот ссылочки:
- evilfreelancer/ruGPT3XL - сконвертированная модель в формате HuggingFace (safetensors)
- evilfreelancer/ruGPT3XL-GGUF - квантизированные GGUF-веса для llama.cpp и Ollama
- evilfreelancer/rugpt3 - GGUF загруженные на Ollama
- EvilFreelancer/rugpt3xl-convert - исходники скриптов конвертации
Хабр
Реставрация ruGPT-3 XL или как я вернул к жизни забытую русскую языковую модель
Несколько дней к ряду я занимался реставрацией легаси модели ai-forever/rugpt3xl , это классическая языковая модель от SberDevices на 1.3B параметров, крошка по современным меркам, на которой сберовцы...
4🔥18❤9👍5
Forwarded from Data Secrets
NeuralDeep Skills: локальная база агентных навыков под ру-сервисы
Всем, кто пользуется агентами, 100% известна такая вещь, как skills.sh. Это огромная база скиллов агентов под любые сервисы. Ставишь – и агент уже умеет с ними работать из коробки.
Так вот, в российском сообществе давно напрашивался аналог под локальный стек. И его сделал наш друг и коллега по тг – Валерий @neuraldeep. Он в целом регулярно делает разные практичные штуки для разработчиков, и это как раз одна из них.
Итак, встречайте: neuraldeep.ru/
Это база, в которой будут собраны скиллы для работы с самими разными ру-сервисами. Туда уже залили интеграции под инструменты Яндекс, Битрикс24, 1С и другое, чем многие пользуются каждый день.
– Установка все так же происходит одной командой, все привычно и понятно
– Проект опенсорсный: туда можно просто прийти и залить свой скилл через GitHub (формат claude-skill)
– Есть модерация и базовые проверки безопасности
Из этого вполне может получиться что-то вроде стандартного слоя для агентных интеграций под рф-рынок. Если работаете с агентами – заходите попробовать или даже поучаствовать.
Проект -> neuraldeep.ru/
Гитхаб -> https://github.com/vakovalskii/neuraldeep
Следите за обновлениями в канале Валеры -> @neuraldeep
Всем, кто пользуется агентами, 100% известна такая вещь, как skills.sh. Это огромная база скиллов агентов под любые сервисы. Ставишь – и агент уже умеет с ними работать из коробки.
Так вот, в российском сообществе давно напрашивался аналог под локальный стек. И его сделал наш друг и коллега по тг – Валерий @neuraldeep. Он в целом регулярно делает разные практичные штуки для разработчиков, и это как раз одна из них.
Итак, встречайте: neuraldeep.ru/
Это база, в которой будут собраны скиллы для работы с самими разными ру-сервисами. Туда уже залили интеграции под инструменты Яндекс, Битрикс24, 1С и другое, чем многие пользуются каждый день.
– Установка все так же происходит одной командой, все привычно и понятно
– Проект опенсорсный: туда можно просто прийти и залить свой скилл через GitHub (формат claude-skill)
– Есть модерация и базовые проверки безопасности
Из этого вполне может получиться что-то вроде стандартного слоя для агентных интеграций под рф-рынок. Если работаете с агентами – заходите попробовать или даже поучаствовать.
Проект -> neuraldeep.ru/
Гитхаб -> https://github.com/vakovalskii/neuraldeep
Следите за обновлениями в канале Валеры -> @neuraldeep
👍15🔥2🤮1💩1
Выгрузить модель на HuggingFace не так-то просто
Конвертировал тут новинку chromadb/context-1 в mxfp4 формат и пытаюсь загрузить веса на HuggingFace, но по какой-то причине huggingface-cli перестал подхватывать переменные прокси, в результате чего из моего контура запросы не уходят, пришлось лезть в исходники и оказалось, что авторы HF добавили в свой тул хранилища типа Xet включенные по умолчанию, а эта штука не использует httpx и как следствие игнорирует настройки прокси.
Короче чтобы решить эту проблему и из рабочего контура подключиться к проксику надо вырубить Xet переменной HF_HUB_DISABLE_XET, а дальше передать проксики и команду:
После этого загрузка начала работать.
Конвертировал тут новинку chromadb/context-1 в mxfp4 формат и пытаюсь загрузить веса на HuggingFace, но по какой-то причине huggingface-cli перестал подхватывать переменные прокси, в результате чего из моего контура запросы не уходят, пришлось лезть в исходники и оказалось, что авторы HF добавили в свой тул хранилища типа Xet включенные по умолчанию, а эта штука не использует httpx и как следствие игнорирует настройки прокси.
Короче чтобы решить эту проблему и из рабочего контура подключиться к проксику надо вырубить Xet переменной HF_HUB_DISABLE_XET, а дальше передать проксики и команду:
HF_HUB_DISABLE_XET=1 \
ALL_PROXY=socks5://192.168.1.21:1080 \
HTTPS_PROXY=socks5://192.168.1.21:1080 \
HTTP_PROXY=socks5://192.168.1.21:1080 \
huggingface-cli upload evilfreelancer/context-1-mxfp4 ./context-1-mxfp4 . --repo-type model
После этого загрузка начала работать.
👍13🤔3🔥2❤1
Pavel Zloi
Проблема долговременной памяти чатов Хоть я и считаю себя сторонником памяти агентных систем, даже большой пост на эту тему писал, но работая с чатами в которых есть память истории всех сообщений периодически ловлю себя на мысли, что надо напилить какой-нибудь…
Размышлял о памяти нейросетей и очень захотелось перечитать труд Марвина Мински про фреймы знаний.
❤🔥6
Trychroma
Chroma Context-1: Training a Self-Editing Search Agent
Retrieval pipelines typically operate in a single pass, which poses a problem when the information required to answer a question is spread across multiple documents or requires intermediate reasoning to locate. In practice, many real-world queries require…
Конвертация Chroma Context-1 в MXFP4 для домашней 4090
Позавчера Chroma выкатила техрепорт по своей модельке chromadb/context-1, прочёл я его сегодня и был крайне впечатлен.
Это 20B параметров, MoE-архитектура на базе openai/gpt-oss-20b, модель натренирована на агентный поиск, делает декомпозицию сложных запросов на подзапросы, выполнняет итеративный поиск по корпусу документов, и самое интересное - self-editing context, когда модель сама решает какие из найденных документов оставить, а какие выкинуть чтобы не засорять контекстное окно. На бенчмарках показывает результаты сопоставимые с топовыми LLM при скорости как у gpt-oss-20b.
Естественно, захотелось потрогать руками, но... модель выложена в BF16, а это 39 ГБ только веса, ну а моя 4090 хоть и прокачана до 48 ГБ VRAM, но 39 ГБ чистых весов + KV-кеш + накладные расходы CUDA в неё не влезут, нужно минимум ~45-50 ГБ чтобы хоть что-то сгенерировать с минимальным контекстом, но нужен не минимальный, а хотя бы 30-60к токенов, агенты же.
Что делать? Смотрю на оригинальную gpt-oss-20b от OpenAI, она в формате MXFP4, это Microscaling FP4, хитрый 4-битный формат, где каждый вес хранится как E2M1 (2 бита экспонента, 1 бит мантиссы), а группа из 32 весов делит общий 8-битный масштаб (E8M0), нативно поддерживается в vLLM через Marlin-ядра и должно отлично работать на RTX 50xx серии, в таком формате модель занимает ~14 ГБ, на мою 4090 влезает с запасом.
Сформировал спеки для кодового агента в Cursor, говорю мол вот тебе веса модели gpt-oss-20b как референс, вот спецификация по методам сжатия MXFP4, вот веса модели context-1 в BF16 которую надо конвертировать, вот docker-compose.yaml с vLLM 0.18.0 на которой агент должен проверять модель.
Задача написать скрипт конвертации, конвертировать модель, запустить в vLLM, убедиться по HTTP что приходят адекватные ответы.
Агент написал скрипт, который читает safetensors, для MoE-экспертов (gate_up_proj и down_proj) транспонирует веса в layout который ожидает vLLM, квантует и пакует всё в MXFP4, по аналогии с gpt-oss-20b, а слои внимания, роутера и эмбеддингов копируются как есть в BF16. В результате 39 ГБ превращаются в ~14 ГБ.
Запустил на vLLM, всё работает, reasoning что-то там рефлексирует, ответы вроде адекватные, но при тестировании tool calling (function calling) выяснилась забавная штука - модель при вызове инструментов валится с ошибкой:
Покопавшись в конфигах gpt-oss-20b обнаружил, что в generation_config.json модели отсутствует токен
Создал PR с фиксом в трекере оригинальной модели.
Ну а квантованную в MXFP4 версию загрузил на HuggingFace: evilfreelancer/context-1-mxfp4
PS. Поднял её на домашней видяшке и сделал доступной через мою апишку, пример как заюзать через openai-клиент добавил в комментарии.
Позавчера Chroma выкатила техрепорт по своей модельке chromadb/context-1, прочёл я его сегодня и был крайне впечатлен.
Это 20B параметров, MoE-архитектура на базе openai/gpt-oss-20b, модель натренирована на агентный поиск, делает декомпозицию сложных запросов на подзапросы, выполнняет итеративный поиск по корпусу документов, и самое интересное - self-editing context, когда модель сама решает какие из найденных документов оставить, а какие выкинуть чтобы не засорять контекстное окно. На бенчмарках показывает результаты сопоставимые с топовыми LLM при скорости как у gpt-oss-20b.
Естественно, захотелось потрогать руками, но... модель выложена в BF16, а это 39 ГБ только веса, ну а моя 4090 хоть и прокачана до 48 ГБ VRAM, но 39 ГБ чистых весов + KV-кеш + накладные расходы CUDA в неё не влезут, нужно минимум ~45-50 ГБ чтобы хоть что-то сгенерировать с минимальным контекстом, но нужен не минимальный, а хотя бы 30-60к токенов, агенты же.
Что делать? Смотрю на оригинальную gpt-oss-20b от OpenAI, она в формате MXFP4, это Microscaling FP4, хитрый 4-битный формат, где каждый вес хранится как E2M1 (2 бита экспонента, 1 бит мантиссы), а группа из 32 весов делит общий 8-битный масштаб (E8M0), нативно поддерживается в vLLM через Marlin-ядра и должно отлично работать на RTX 50xx серии, в таком формате модель занимает ~14 ГБ, на мою 4090 влезает с запасом.
Сформировал спеки для кодового агента в Cursor, говорю мол вот тебе веса модели gpt-oss-20b как референс, вот спецификация по методам сжатия MXFP4, вот веса модели context-1 в BF16 которую надо конвертировать, вот docker-compose.yaml с vLLM 0.18.0 на которой агент должен проверять модель.
Задача написать скрипт конвертации, конвертировать модель, запустить в vLLM, убедиться по HTTP что приходят адекватные ответы.
Агент написал скрипт, который читает safetensors, для MoE-экспертов (gate_up_proj и down_proj) транспонирует веса в layout который ожидает vLLM, квантует и пакует всё в MXFP4, по аналогии с gpt-oss-20b, а слои внимания, роутера и эмбеддингов копируются как есть в BF16. В результате 39 ГБ превращаются в ~14 ГБ.
Запустил на vLLM, всё работает, reasoning что-то там рефлексирует, ответы вроде адекватные, но при тестировании tool calling (function calling) выяснилась забавная штука - модель при вызове инструментов валится с ошибкой:
openai_harmony.HarmonyError: Unexpected token 12606 while expecting start token 200006
Покопавшись в конфигах gpt-oss-20b обнаружил, что в generation_config.json модели отсутствует токен
<|call|> (id 200012) в списке eos_token_id, из-за этого модель не останавливает генерацию после вызова tool call и harmony ломается. По сути баг в vLLM, но фикс элементарный, добавить 200012 в eos_token_id в generation_config.json модели, после этого и обычный чат и tool calling заработали как надо.Создал PR с фиксом в трекере оригинальной модели.
Ну а квантованную в MXFP4 версию загрузил на HuggingFace: evilfreelancer/context-1-mxfp4
PS. Поднял её на домашней видяшке и сделал доступной через мою апишку, пример как заюзать через openai-клиент добавил в комментарии.
🔥32❤8👏5
Sparse Attention Is All I Need
Вчера в соседнем чатике мне задали резонный вопрос о том какие метрики использовались для оценки качества работы конвертированной ruGPT3XL модели? И это очень правильный вопрос, я честно не знал, что ответить, так как гонял тесты MERA в отрыве от её оригинальной версии, потому что оригинальную так и не смог запустить (слишком старое железо требуется для древнего мегатрона, пайчарма, апекса, куды и так далее).
Ну и в общем свербила меня эта мысль, думаю ладно, надо что-то сделать, проблема только в том какую метрику считать? Решил взять perplexity (PPL), так как она указана в карточках всех моделей, но тут возникла другая проблема, эта PPL должна быть на датасете на котором оригинальные модельки тестировались, а у меня его по понятным причинам нет, да и не уверен, что он есть даже где-то в недрах SberDevices, времени то прошло почти пять лет с тех пор.
Короче пришла идея взять любой датасет с русскими текстами, желательно не очень большой на 5-10k примеров и чтобы размерность примеров была в пределах 2k токенов, под это условие отлично подошёл датасет gazeta Ильи Гусева @senior_augur.
Решил делать так, взять значения perplexity из карточек оригинальных моделей, составить табличку, написать скрипт расчёта прям как в публикации про rugpt3 модельки, потом взять датасет gazeta и выполнить расчёт на rugpt3small, rugpt3medium, rugpt3large и моей ruGPT3XL, полученные циферки сравнить и посмотреть есть ли корреляция.
При первом прогоне тесты показали, что конвертированная модель сильно проседает по PPL, результат был 50.1, что примерно в 4 раза больше чем 12.05 у оригинальной модели, думаю ну не может же быть, стал копать, оказалось агент решил не портировать механизм Sparse Attention (разреженного внимания) и вместо него заюзал Self Attention, родной механизм внимания у GPT2 и производных.
Внимательно попинал агента, показал ему примеры кода с правильным механизмом внимания, дал почитать публикацию про модельки ruGPT3 и спустя некоторое время получил исправленную версию modeling_rugpt3xl.py с репликой аналогичного механизма из Megatron-LM.
Запустил прогонку расчёта PPL ещё раз и увидел уже красивые циферки 11.68, по всем замерам составил табличку и несколько графиков, подробности тут.
Дополнительная проверка кода llama.cpp показала, что код Sparse Attention там тоже не поддерживается и сконвертированная в GGUF моделька будет использовать неправильный механизм внимания, похоже придётся делать большой патч в llama.cpp, попытаюсь добавить поддержку ruGPT3XL туда уже полноценно.
Вчера в соседнем чатике мне задали резонный вопрос о том какие метрики использовались для оценки качества работы конвертированной ruGPT3XL модели? И это очень правильный вопрос, я честно не знал, что ответить, так как гонял тесты MERA в отрыве от её оригинальной версии, потому что оригинальную так и не смог запустить (слишком старое железо требуется для древнего мегатрона, пайчарма, апекса, куды и так далее).
Ну и в общем свербила меня эта мысль, думаю ладно, надо что-то сделать, проблема только в том какую метрику считать? Решил взять perplexity (PPL), так как она указана в карточках всех моделей, но тут возникла другая проблема, эта PPL должна быть на датасете на котором оригинальные модельки тестировались, а у меня его по понятным причинам нет, да и не уверен, что он есть даже где-то в недрах SberDevices, времени то прошло почти пять лет с тех пор.
Короче пришла идея взять любой датасет с русскими текстами, желательно не очень большой на 5-10k примеров и чтобы размерность примеров была в пределах 2k токенов, под это условие отлично подошёл датасет gazeta Ильи Гусева @senior_augur.
Решил делать так, взять значения perplexity из карточек оригинальных моделей, составить табличку, написать скрипт расчёта прям как в публикации про rugpt3 модельки, потом взять датасет gazeta и выполнить расчёт на rugpt3small, rugpt3medium, rugpt3large и моей ruGPT3XL, полученные циферки сравнить и посмотреть есть ли корреляция.
При первом прогоне тесты показали, что конвертированная модель сильно проседает по PPL, результат был 50.1, что примерно в 4 раза больше чем 12.05 у оригинальной модели, думаю ну не может же быть, стал копать, оказалось агент решил не портировать механизм Sparse Attention (разреженного внимания) и вместо него заюзал Self Attention, родной механизм внимания у GPT2 и производных.
Внимательно попинал агента, показал ему примеры кода с правильным механизмом внимания, дал почитать публикацию про модельки ruGPT3 и спустя некоторое время получил исправленную версию modeling_rugpt3xl.py с репликой аналогичного механизма из Megatron-LM.
Запустил прогонку расчёта PPL ещё раз и увидел уже красивые циферки 11.68, по всем замерам составил табличку и несколько графиков, подробности тут.
Дополнительная проверка кода llama.cpp показала, что код Sparse Attention там тоже не поддерживается и сконвертированная в GGUF моделька будет использовать неправильный механизм внимания, похоже придётся делать большой патч в llama.cpp, попытаюсь добавить поддержку ruGPT3XL туда уже полноценно.
1👍12❤2
Pavel Zloi
Sparse Attention Is All I Need Вчера в соседнем чатике мне задали резонный вопрос о том какие метрики использовались для оценки качества работы конвертированной ruGPT3XL модели? И это очень правильный вопрос, я честно не знал, что ответить, так как гонял…
Мой третий PR в llama.cpp
GitHub
cpp: Adding new arch RUGPT3XL by EvilFreelancer · Pull Request #21161 · ggml-org/llama.cpp
Overview
Add dedicated RUGPT3XL architecture with block-sparse per-head attention support for the ruGPT-3 XL (1.3B) language model. ruGPT-3 XL was trained with DeepSpeed's FixedSparsityConf...
Add dedicated RUGPT3XL architecture with block-sparse per-head attention support for the ruGPT-3 XL (1.3B) language model. ruGPT-3 XL was trained with DeepSpeed's FixedSparsityConf...
1👏17🔥10❤5👍4
Pavel Zloi
Sparse Attention Is All I Need Вчера в соседнем чатике мне задали резонный вопрос о том какие метрики использовались для оценки качества работы конвертированной ruGPT3XL модели? И это очень правильный вопрос, я честно не знал, что ответить, так как гонял…
По совету хабровчанина внёс правки в код класса модели чтобы она обучалась без ошибок, проблема появилась после фикса Sparse Attention, надо было мне чуть дотошнее всё проверить.
Вдобавок ко всему по рекомендации от того же пользователя добавил в модель поддержку Triton, в результате чего на динамическом графе модели удалось достигнуть прироста в скорости инференса до 40%, а если выполнить torch.compile то и все 50% прирост.
Код класса модели тут: modeling_rugpt3xl.py
Подробнее про SDPA и бенчмаркинг тут: Training throughput (SDPA and Inductor)
Вдобавок ко всему по рекомендации от того же пользователя добавил в модель поддержку Triton, в результате чего на динамическом графе модели удалось достигнуть прироста в скорости инференса до 40%, а если выполнить torch.compile то и все 50% прирост.
Код класса модели тут: modeling_rugpt3xl.py
Подробнее про SDPA и бенчмаркинг тут: Training throughput (SDPA and Inductor)
👍14❤4👏2