Pull to refresh
8K+
11
Pavel Lepin@WhiteBehemoth

User

2,4
Rating
3
Subscribers
Send message

Спасибо за статью, было интересно.

Споткнулся на ffn объяснении. Если attention блоки было легко сопоставить с описанием выше, но к чему подвязать ffn блоки не понял.

Каждый "блок" (blk) - это параметры трансформера на соответствующем шаге. Они пронумерованы от 0 до 35. Внутри каждого блока хорошо видно два этапа - attention (attn), который содержит k, q, v и output - правила сбора информации и fast forward network (ffn), которая описывает, что делать с собранной информацией.

Спросил у Жемини про blk.35.ffn_* строки и направления в них. Оставлю тут, может у кого будет такая же неясность.

Скрытый текст

Для понимания этих весов нужно разобраться в архитектуре Feed-Forward Network (FFN), которая идет в каждом слое трансформера (в данном случае Qwen2/Qwen3) сразу после блока Attention.

В современных моделях (LLaMA, Mistral, Qwen) используется архитектура SwiGLU. В отличие от старых сетей, где было всего два слоя, здесь их три: gate, up и down.

Что значат эти названия (направления)?

Представьте, что данные проходят через «бутылочное горлышко», которое сначала расширяется, а потом сужается.

  1. ffn_up (Up-projection):

    • Что делает: Увеличивает размерность вектора.

    • В вашем дампе: из 4096 (скрытая размерность модели) в 12288.

    • Это «расширение» позволяет модели спроецировать данные в пространство более высокой размерности, чтобы извлечь сложные признаки.

  2. ffn_gate (Gate-projection):

    • Что делает: Работает параллельно с up. Это тоже расширение из 4096 в 12288.

    • Результат этого слоя проходит через функцию активации (обычно SiLU). Затем он поэлементно умножается на результат слоя up.

    • Это работает как «фильтр» или «ворота» (gate), определяя, какая информация из up важна, а какая — нет.

  3. ffn_down (Down-projection):

    • Что делает: Сжимает данные обратно в основную размерность модели.

    • В дампе: из 12288 обратно в 4096.

    • Это завершающий этап блока, подготавливающий данные для передачи в следующий слой.

Разбор ваших строк из дампа:

  • blk.35.ffn_norm.weight F32 [4096]

    • Это параметры нормализации (LayerNorm или RMSNorm) перед входом в FFN. Она стабилизирует числа, чтобы они не «взрывались». Веса хранятся в точности Float32 для стабильности.

  • blk.35.ffn_gate.weight Q4_K [4096 12288] и blk.35.ffn_up.weight Q4_K [4096 12288]

    • Это два огромных слоя расширения. Обратите внимание на тип Q4_K — это 4-битная квантование. Это сделано для экономии памяти, так как это самые «тяжелые» части модели.

  • blk.35.ffn_down.weight Q6_K [12288 4096]

    • Слой сжатия. Здесь используется Q6_K (6 бит). Часто разработчики оставляют чуть больше точности на down-projection, так как ошибки в этом слое сильнее влияют на итоговый результат.

Итог: зачем это нужно?

Если Attention отвечает за то, чтобы токены «смотрели» друг на друга и понимали контекст (связи между словами), то FFN (Fast Forward / Feed Forward) — это «база знаний» модели. Именно в этих огромных матрицах (расширение до 12288 и обратно) хранятся фактические знания и логические правила, которые модель применяет к каждому токену по отдельности.

Почему "Fast Forward"? Скорее всего, в статье или контексте это опечатка или упрощение от Feed-Forward (связь «вперед»). В контексте нейросетей это означает, что сигнал идет строго в одном направлении: вход -> gate/up -> down -> выход.

Скажем в доме 2 этажа и подвал (типичный коттедж). Прокинуть кабель от модема, до например, игрового ПК на другом этаже - это не пару раз продырявить стенку. Это очень нескучный квест по протяжке кабеля через полдома. А ТВ кабеля уже заведены в каждую комнату.

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

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

кстати да. Это ОЧЕНЬ важный момент, обойдённый автором. Если нету GPU (желательно от NVidia) то локальная LLM это грустно, медленно и малоинтересно.
16GB это очень хорошо, но сейчас и в более популярные 8GB можно поместить не сильно обрезанную (4 бита) qwen 3.5. (модель 5,6 gb + 0.9 gb на распознавание картинок, еще и на 8к+ токенов контекстного окна останется).
Это вполне себе интересный собеседник, да еще и без цензуры, спрашивай о чем хочешь.
если что, краткая инструкция (если вдруг у кого возникнет желание проверить, а лламы еще нету)

  1. Скачать llama.cpp под свою видео карту (или cpu, но это грустно) https://github.com/ggml-org/llama.cpp/releases

  2. Скачать модель https://huggingface.co/HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/blob/main/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf

  3. (опционально) модуль для распознавания картинок https://huggingface.co/HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/blob/main/mmproj-Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-BF16.gguf

  4. Запустить сервер llama-server.exe --model [путь до модели] --mmproj [путь до модуля] Остальные параметры можно попробовать по умолчанию - в последних релизах уже и окно контекста можно не указывать - обрежется по имеющийся памяти.

  5. Открыть WebUI localhost:8080

У вас подача материала хорошая, учительская. Если бы вы так рассказали про llama.cpp... Просто обёртки не только упрощают, но и ограничивают.
Например ollama list Это, конечно, просто, но скрывает такой важный параметр как квантование моделей и размер контекста. Вы говорите в статье "если модель тормозит, выберите поменьше". Но ведь память ест не только сама модель, но и окно контекста. Тогда становится понятнее, почему при свободной видео памяти 8 GB модель 7.5 GB "не влезает".
Я, погружаясь в тему с полного нуля полтора месяца назад, благодаря вот этому комментарию https://habr.com/ru/articles/991560/#comment_29467748 (думаю, что) сэкономил кучу времени на понимании принципов локальной LLM. Да, может чуть непонятнее в начале, но и Hugging Face и Llama.cpp - весьма дружественные к новичкам (особенно когда есть под рукой ИИ чат какой-нить).

Для обучения это почти идеальный вариант. Вы не отвлекаетесь на инфраструктуру и сразу видите базовую механику интеграции.

Olama - обёртка над llama.cpp

LiteLLM - обёртка над Open AI запросами

llama.cpp ставится не сложнее оламы. Open AI spec в простых случаях - тоже не китайская грамота. Понятно, что каждого джежая свой путь обучения, но не слишком ли упрощаете?

А он тоже умеет "убрать слова-паразиты и "окультурить" текст?"
Мне в статье идея связки с LLM понравилась.

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

Всё ждал, когда же начнётся раздел про "Как заставить англоязычную нейросеть читать по-русски", с примерами многочасового дообучения на русских аудио-материалах...да со сравнением разных открытых весов...
А тут не заставили, а попросили...

...гибридной связке. Нет необходимости сливать бюджет на рутину.

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

Не дурной получился кибер-панк. И, в отличии от прочей "классики" весьма злободневно.

логика у них есть? есть. Выводы делать умеет? умеет. Отвечает по сути/смыслу вопроса? - давно уже.

Это и есть составляющие процесса "думать". Про самосознание мы пока не говорим.

Если есть немного ресурсов на компе, стоит посмотреть на локальные варианты. Вот не так давно обзор был https://habr.com/ru/companies/raft/articles/991844/ там в серёдке упоминается проект на f5 tts который даёт результат, на мой взгляд, лучше, чем "Дмитрий" от microfoft (кстати я у них пробовал "интернациональные" голоса, они живее четырёх "русских", и на некоторых из DragonHDLatestNeural акцента почти не было).

Если решитесь на локальный вариант, посмотрите обсуждения на 4pda https://4pda.to/forum/index.php?showtopic=1110815 - это живая тема от автора "русификатора для F5 TTS.

Этот F5 чем хорош? - позволяет ставить ударения через знак "+". А если загонять через Azure voice AI - там только SSML разметка с указанием IPA транскрипции.

ну да, только вот обсудить можно было всегда с кем-то, в этом нет ничего нового, просто ответ получался не в 2 ночи, Вот и вся разница.

Человек - это всегда субъективно. И это диалог. И ограничения по времени и графику жизни.

Да, ИИ-чат - это эксперт-суррогат. Но объём данных в его распоряжении - колоссальный. И нет ограничений социальных рамок типа вежливости и т.п. Можно настроить под любой стиль общения.

А ещё, есть мнение что бесконечно отвечающий наставник это не плюс а минус. А когда у тебя есть человек который готов отвечать бесконечно то ты будешь на это полагаться, считая что ты что-то выучил

Типа в эпоху "до ИИ" мы учили все "раз и навсегда". Всё забывается со временем. И вообще, цитируя своих преподов из студенчества 90х годов "инженер не должен всё знать, но должен знать где и как искать ответ".

Странно, что нет урока на создание своей банды агентов. По-моему - это простой способ понять как это всё работает. Сделать все локально, на примере llama.cpp показать как регистрируются tools, как оркестратор переключает модели в зависимости от роли агента.

Меня больше пугает не то, что профессия деградирует, а то, что сама отрасль производства софта сильно изменится, сместив фокус с решения пользовательских задач на "агентское" взаимодействие через MCP сервера и т.п..
И потом некий "универсальный UI" с оркестратором агентов под капотом будет решать огромный спектр задач. Где не сможет сам, "на лету" создаст специализированные решения.

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

В процессе заражения инструмент PromptSpy обращается к облачной модели Google Gemini для анализа экрана жертвы.

оказалось, что это не этап внедрения, а этап persistence - "оставаться в системе".

generative AI is deployed only in a relatively minor part of PromptSpy's code – that responsible for achieving persistence

не важнее семьи, а важнее "отметить юбилей свадьбы" )

VP от инженеринга случаются те еще чудики с перекосами. Хотя тут я особого чудачества не вижу.

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

Молодец VP, получит свой бонус за маркетинг. И купит жене две сумочки.

Information

Rating
1,498-th
Location
Montreal, Quebec, Канада
Date of birth
Registered
Activity

Specialization

Десктоп разработчик, Бэкенд разработчик
Ведущий
C#
.NET
SQL
Git
Docker
CI/CD
Python
ООП