Обновить
16K+
252

Пользователь

31,1
Рейтинг
265
Подписчики
Отправить сообщение

Да, это так и будет, я обучал nanochat d24 размером 1.3B и по качеству это несколько уверенных уровней вверх. Правда ценность ruGPT3 в том, что они потратили компьют на 400B (80B*4 + 80B) токенов обучения, а не в архитектуре.

В ruGPT3 архитектура ближе к gpt3 за счет Sparce Attention, но всё равно MHA это тяжелая и прожорливая технология внимания, поэтому обучать GPT2-like архитектуры с нуля сейчас не особо имеет смысл. Даже GPT2-like habrGPT 0.5B я обучал на nanochat только, чтобы был материал про обучение на известном nanochat на ру сцене.

В 2026 современная архитектура это:

  • Mamba-2 (SSM) вместо квадратичного внимания, 75% слоев делают на mamba ради линейного внимания, чтобы вмещать 1м контекста, затраты тут O(n) на обучение и O(1) на инференс. Остальные 25% допустим MLA или GQA.

  • MLA с латентным низкоранговым пространством вместо разреженного внимания, работать с Sparse Attention у которого O(n²) тяжело. У MLA тоже O(n²), но он преобразует полные матрицы в низкоранговое пространство, тем самым экономия получается в разы.

  • GQA с той же сложностью как у Sparse Attention, но эффективнее, позволяет обучать весь контекст без безумных расходов памяти. Сюда же можно добавить Sliding Window, как в Gemma (iSWA), который снизит сложность с квадратичной до линейной, будет намного легче чем Sparse Attention. Обучать проще чем MLA, но тяжелее.

  • Другие современные методы: нормализация Pre-RMSNorm вместо Pre-LayerNorm, FFN активация SwiGLU вместо GELU, RoPE+YaRN, токенизатор на 150к, вместо 50к, для уплотнения на 20-30% информации, добавление SoftCap, чтобы стабилизировать обучение.

  • Value Residual и всё связанное SVFormer, ResFormer, PLE, value_embeds. В случае value_embeds снижение сложности на 50%.

Для самого обучения мало простого torch.compile(), что за счет компиляции ядер triton дает ускорение 50%, нужно добавить ещё разное:

  • Muon вместо чистого AdamW, это снижает расход памяти и стабилизует обучение.

  • Zero gradient checkpointing, для экономии памяти без потерь на forward, позволяет вместить больше батчей или параметров.

  • AdamW делит вычисления на мелкие шаги и для каждой части запускает своё CUDA-ядро. Можно объединять (fused) все эти операции в одно ядро, это сэкономит много памяти и ускорит обучение.

  • Можно объединить RMSNorm и SwiGLU, объединенное ядро для RoPE.

  • Вместо стандартного Cosine Annealing лучше Warmup-Stable-Decay, что создает качество лучше у pretrain.

  • Вместо Warmup-Stable-Decay можно попробовать взять Schedule-Free AdamW, чтобы не подбирать гиперпараметры, или попробовать μP для подбора, у которого подбор гиперпараметров решается математически.

Собрать такую архитектуру замороченее, но не сложнее, по сути это уже реализовано в transformers от huggingface или где-то рядом, что-то хорошо реализовано в Unsloth Train. Можно обучить дома в размере Dense 1.5B с value_embeds или MoE 6B-A0.6B без value_embeds, контекст допустим не 1м, а 32-64к за счет ssm. Тут скорее был бы полноценный датасет.

Спасибо. В рамках статьи цели объяснить, что такое PLE не было, цель была показать, что это своеобразный математический трюк, который работает, но как именно работает не так важно. К тому же в nanochat даже не тот PLE, что у Gemma, и чтобы объяснить отличие и изменение идеи в nanochat, сначала нужно глубоко погрузится в идею Gemma.

Можно относиться к этому как к форме “статичного” MoE, только вместо выбора между разными трансформерными слоями, тут для каждого токена заранее заготовлены смысловые векторы. И слой через гейт решает, сколько от этой заготовки взять к вычисляемому value. По мере продвижения по слоям заготовки усложняются, расширяя диапазон понимания без необходимости их вычислять.

Не думаю, что можно новичкам объяснить эту идею как-то сразу понятно, так как нужно понимать как работает MoE и эмбеддинги.

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

В соседней статье дообучил эту модель на датасете ru-big-russian-dataset, и модель научилась новым навыкам, один из них переводить:

Да, маска накладывается так же, как и для других датасетов, тренировка только на последнем ответе ассистента:

full_enc = tokenizer(full_text, ...)
prompt_enc = tokenizer(prompt_text, ...)

input_ids = full_enc["input_ids"]
labels = input_ids.copy()
prompt_len = len(prompt_enc["input_ids"])
labels[:prompt_len] = [-100] * prompt_len 

# SFTDataCollator:
labels = torch.full((batch_size, max_len), -100, dtype=torch.long)

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

Тоже прислали письмо

Добрый день,

Обратили внимание на Вашу статью https://habr.com/ru/articles/1054710/, точнее, на датасет, использованный для обучения LLM, ссылка на который содержится в статье - https://huggingface.co/datasets/IlyaGusev/habr. Этот дата-сет был создан нелегально, поэтому мы уже обратились к его создателю (тоже пользователю Хабра) с требованием об удалении. Просим Вас также удалить ссылку из статьи.

C наилучшими пожеланиями, Habr Legal Team

Там без подбора, гиперпараметры в nanochat выставляются автоматически, сам Карпатый уже давно занимается оптимизацией параметров обучения, поэтому выставлены по его личному опыту, закону Шиншиллы и так далее. Только на DPO пришлось снижать, но в nanochat вообще нет DPO этапа.

Если в целом на все эксперименты, то ушел где-то месяц, я обучал не только nanochat, обучал и MoE подобные модели, и чистый 0.25B на кастомной архитектуре которую собирал из разных новых архитектур, и даже пытался обучить 7B модельку, которую с помощью многих ухищрений удалось вместить в 32Гб, но скорость обучения была 500 t/s. Выше уже писал про дообучения 1.3B претрейна, в целом dense 1.3B вполне можно дома обучать.

И кстати может качество будет получше если обучать на меньшем количестве токенов, но уже предобученную модельку? А то обучать с нуля обычно мало смысла…

Есть и такое. У меня готова, но не опубликована, статья, где я дообучал старую ruGPT3 XL 1.3B (как раз @efreelancer недавно публиковал статью, где сделал для этой модели конвертацию в современный формат и поддержку gguf). Это pretrain 2020-2021 года обученный на 80B токенов, который умеет только продолжать текст, и выглядит это часто не как ответ, а как повествование:

Создавался этот pretrain во времена, когда ещё не было понимания, как заставить хороший pretrain вести диалог в чате, следовать инструкциям. Это время за 2 года до выхода ChatGPT и первой InstructGPT. И после дообучения на SFT такая модель на 80B токенов куда богаче по возможностям, она больше знает, хорошо следует инструкциям, может работать с текстом, даже решать головоломки:

И чтобы было понятно, какой уровень получился у модели, то сравнил её с Gemma3 1B 2025 года, при чем получилось не всегда в пользу Gemma3.

Задача на внимательность, Gemma3 1B провалил:

Про квантовую причину горения Солнца, Gemma3 1B дал не правильное название явления:

Это не полный датасет хабра, в статье есть ссылка на датасет, которую выше уже продублировали. Датасет собрал @Takagi, его же датасет IlyaGusev/saiga_preferences я использовал для SFT.

Финальный pretrain ~9 часов и ещё пол часа на sft и dpo.

Чудесный, только очень уж теоретический материал. Интересно, возможно ли продемонстрировать его на каком-нибудь сверх-примитивном примере?

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

И до момента как освоила язык, и дальше смогла даже пообщаться в чате, выполнять простые задания, давать ответы на вопросы:

habrGPT. Обучим LLM 0.5B с нуля на статьях Хабра с помощью nanochat от Карпатого. Обучение fp8 дома и сравнение с bf16

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

Это оказалось 508M токенов, совсем мало. Но всё равно обучил модель, уже по нормальному, и в этот раз результат получился получше:

habrGPT. Обучим LLM 0.5B с нуля на статьях Хабра с помощью nanochat от Карпатого. Обучение fp8 дома и сравнение с bf16

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

Чекпоинты загрузил, обновил статью. Поддержка gguf только в форках, поэтому запуск через nanochat, нужно только разобраться куда ложить файлы и как запустить.

А какие существуют llm которые влазят в 32 гб(ну или впритык в 36) и при этом могут что-то полезное?

Вот тут я показывал опыт работы с Qwen3.6-35B-A3B, включая UD-Q2_K_XL и REAP урезание до 28B. Если памяти мало, то REAP интересная технология вырезания наименее активных экспертов, которые не нужны для определённых задач, и можно создать более компактную модель. И рядом про как ускорить без потерь за счет MTP.

REAP как агент доработала код майнкрайфта в браузере, добавила новые блоки с алмазами и создала постройку
REAP как агент доработала код майнкрайфта в браузере, добавила новые блоки с алмазами и создала постройку

Проблема в ассиметричных k и v, не все модели поддерживают такую работу на GPU и вычисления переносятся на CPU.

А симметричное q4_0 совсем плохо работает? Ключевая идея турбокванта это поворот Адамара, этот поворот добавили в llama.cpp и он по умолчанию работает для всего квантования KV, что должно давать не плохое качество на q4_0, но на практике не понятно, так это или нет.

вместо cpu-moe использовал n-cpu-moe - раскидал сколько смог слоев в видеокарту. n-cpu-moe на обычной llama.cpp дал 50 т/с, на ik_llama.cpp получил 60 т/с

Для qwen3.6 на днях добавили поддержку MTP, можно получить еще больше скорости без потери качества. Для Qwen3.6-35B-A3B ускорение не такое большое, как для Qwen3.6 27B, но оно тоже есть.

Вот тут подробнее: Qwen3.6 27B MTP весит на +0.3 Гб больше, а даёт ускорение в ~2 раза. С 60 t/s до 130 t/s без потерь. Что такое MTP

Если согласны потерять сколько-то в качестве, то можно ускориться раза в 1.5. Попробуйте кванты, которые хорошо работают на CPU, это Q4_0 и Q4_1.

Интересная идея и реализация, а есть какой-то результат для примера?

Неделю назад обучал 0.25B LLM с нуля исключительно на статьях с хабра, датасет IlyaGusev/habr, просто посмотреть, что из этого получится. SFT датасет автоматически построен из датасета хабра, чтобы не было примесей из других источников. Токенизатор обучен тоже только на хабре.

Идея была попробовать обучить 1B, но времени было мало, поэтому на коленке обучил только 0.25B за 3 часа. Первый шаг, это pre-train, который умеет только продолжать то, что ему задать как промпт:

Правильное понимание, где римские цифры, а где буквенное перечисление
Правильное понимание, где римские цифры, а где буквенное перечисление
Что-то похожее на связный текст
Что-то похожее на связный текст

Обучение pre-train было всего на 1 эпохе, поэтому знания плохо усвоены, но что-то аппроксимировано. Модель сама выявила паттерны русского языка, родов, склонений и прочего, хотя логика и знания хромают, общее написание фраз вполне корректное.

Для примера как выглядело начало обучения:

10% от 1 эпохи
10% от 1 эпохи

Дальше идет обучение SFT, где pre-train учится шаблону чата и умению отвечать на вопросы и уметь разделять где assistant, а где user. Качество общения зависит от качества SFT датасета, его я сделал автоматически и всего на 1к записей, как старт сойдет, но о проработке речи не идет:

Первое, что ответила модель после SFT обучения, все совпадения случайны
Первое, что ответила модель после SFT обучения, все совпадения случайны
0.25B LLM плохо обученная на статьях с хабра, SFT
0.25B LLM плохо обученная на статьях с хабра, SFT

Выставил температуру минимально, результаты должны быть максимально близки. Есть шанс заруинить. Допустим взяли черновую очень маленькую 0.6B

Отвечаю сам себе и уточняю для тех, кто сюда забредёт. Это информация устарела, она больше не актуальна. Проблем с черновыми моделями нет.

Спекулятивное декодирование дает идентичный результат без искажений, я специально проверил исходники llama.cpp, чтобы убедиться, что это действительно так. Особенно это актуально для новых методов MTP, Eagle-3, DFlash, которые дают сильно большее ускорение, чем старый метод через маленькие черновые модели.

Подробнее я расписал в статье: Qwen3.6 27B MTP весит на +0.3 Гб больше, а даёт ускорение в ~2 раза. С 60 t/s до 130 t/s без потерь. Что такое MTP

1
23 ...

Информация

В рейтинге
259-й
Зарегистрирован
Активность