ИИ

LUT и SWAR

Ночные эксперименты с нейросеткой на «ПикоКалке» дали, кстати, неплохой результат — теперь на токен тратится чуть больше секунды. Тут есть вклад оборудования, например, разгона центрального процессора до 270 МГц (выше плата зависает), но есть и чисто программные моменты. Я испытал несколько способов перемножить несколько чисел — в вычислениях любой нейросетки такого много.

Быстрее всего оказался обычный INT8 — прямое целочисленное умножение. Веса у меня четырёхбитные, чтобы сетка поместилась в память: в одном байте хранятся два веса. Для расчёта они распаковываются и по отдельности умножаются на восьмибитные активации.

Произведения складываются в 32-битном аккумуляторе, затем применяется масштаб. По сравнению с вариантом LUT_FLOAT32 здесь меняется и точность активаций: вместо чисел с плавающей точкой используются восьмибитные целые, но на работе нейросети это не сказалось.

Пока с этим возился, познакомился с несколькими интересными методами считать такие суммы, о двух таких алгоритмах хочу рассказать. В моём «ПикоКалке» стоит RP2040 с целочисленным умножителем, но нет FPU — аппаратного блока вычислений с плавающей точкой.

В каждом случае будем считать скалярное произведение двух векторов: веса — 3, 6, 1, 4 и активации — 2, 3, 5, 7.

LUT

Первый называется LUT («Look-Up Table»), я его вчера уже упоминал. Он очень простой для понимания.

Сначала веса раскладываем на степени двойки (то есть по битам):

3 = 1 + 2  6 = 2 + 4  1 = 1  4 = 4

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

(1 + 2) × 2 + (2 + 4) × 3 + (1) × 5 + (4) × 7

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

1 × (2 + 5) + 2 × (2 + 3) + 4 × (3 + 7)

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

Чтобы дать наборам адреса, назначаем позициям активаций флажки 1, 2, 4, 8. Адрес набора, или маска, — сумма флажков выбранных позиций. Например, младшие биты весов 3, 6, 1, 4 дают выбор 1, 0, 1, 0: берём первую и третью активации, то есть 2 и 5. Адрес этого набора — 1 + 4 = 5, поэтому LUT[5] = 2 + 5 = 7.

Для разряда ×2 выбираются первая и вторая активации: адрес 1 + 2 = 3, сумма LUT[3] = 2 + 3 = 5. Для разряда ×4 — вторая и четвёртая: адрес 2 + 8 = 10, сумма LUT[10] = 3 + 7 = 10. Нужное скалярное произведение таким образом находится по таблице:

1 × LUT[5] + 2 × LUT[3] + 4 × LUT[10] = 7 + 10 + 40 = 57

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

Максимальная ширина входа слоя у меня — 384 активации. Делим их на четвёрки, для каждой храним 16 сумм. Одна сумма в моём варианте LUT_FLOAT32 занимает четыре байта, получается: (384 / 4) × 16 × 4 = 6144 байта. Столько внутренней SRAM занимает весь набор таблиц LUT.

SWAR

Второй метод называется SWAR («SIMD Within A Register»), где SIMD — «Single Instruction, Multiple Data».

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

3 × 2 + 6 × 3

Для этого мы применяем такой любопытный приём:

(6 × 100 + 3) × (2 × 100 + 3) или 603 × 203 = 122409

Если взять средние две цифры, это будет сумма произведений:

3 × 2 + 6 × 3 = 24

Почему это работает? Станет понятно, если по-другому расставить скобки:

12 × 10000 + (6 × 3 + 3 × 2) × 100 + 9

Остаются вопросы — как мы получаем среднюю часть числа и где тут экономия, ведь в раскрытой формуле куча умножений?

Эта формула объясняет результат одной команды. В коде мы не вычисляем её слагаемые по отдельности: упаковываем числа сдвигами и битовыми масками, выполняем одно обычное умножение и извлекаем нужную часть результата.

В настоящем расчёте вместо основания 100 используется 65536: два числа упаковываются в 32-битное слово с двумя 16-битными полями. Команда умножения сохраняет младшие 32 бита произведения, поэтому член с множителем 65536² выпадает сам собой — для него просто нет места. В нашем примере остаётся 24 × 65536 + 9. Сдвиг вправо на 16 бит убирает младшее поле и оставляет 24.

Размеры полей и диапазоны чисел нужно подбирать так, чтобы переносы между полями не испортили результат. Для отрицательных активаций нужны дополнительные поправки; положительный десятичный пример показывает только принцип.

2 комментария

MK-61s: обвязка на PicoCalc

Сегодня 6 ноября, у нас в Татарстане дополнительный выходной, по этому поводу мне захотелось заняться какой-нибудь дичью.

Решил реализовать заведомо непрактичную, но давно засевшую у меня в голове идею — запустить внутри ретроконсоли «МК-61s» какую-нибудь нейросеть. Наверное месяц крутил эту мысль в голове, но ничего достойного реализации мне в голову не приходило, пока вчера ночью не осенило — надо сделать обвязку («харнесс») для программирования на языке «Электроника МК-61»!

Для этого я выбрал русскоязычную модель «Flourish-3M», у которой около трёх миллионов параметров и попробовал дообучить её на Nvidia B200 синтаксису «МК-61». 

Даже сеть таких скромных размеров в памяти ретроконсоли не поместилась бы, несмотря на то, что я выбрал самую мощную аппаратную платформу, которая у меня есть — «ПикоКалк», поэтому пришлось её квантировать до четырёх бит.

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

Было использовано 462 листинга, материалы девяти книг и несколько сотен синтетических упраженений. Полученные программы выполнялись в эмуляторе.

На видеокарте NVIDIA B200 запущено три процесса Python, использующих почти всю память GPU.
Процесс обучения нейросети; большая часть памяти занята «Квеном», который помогал корректировать обучение

Чтобы ускорить матричные вычисления, пришлось использовать предвычисленные таблицы — LUT и оба ядра процессора (все остальные процессы в этот момент замирают), разогнанные с 125 до 250 МГц.

Несмотря на все усилия, скорость генерации невелика  — около 4,67 секунды на токен. Математического сопроцессора нет, всё считается ядрами центрального процессора.

На экране консоли отображено число 0,374666 — результат вычисления синуса угла 22 градуса программой, написанной ИИ Flourish-3M специально для калькулятора MK-61.
Игру эта сеть не напишет, ей бы с синусом справиться!

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

Я, наверное, потренирую её ещё немного и сотру, даже в репозиторий класть не буду — интересно было повозиться, но никакого смысла такой результат сохранять нет.

11 комментариев

Какой язык лучше подходит для промптов?

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

Тем не менее модели поскромнее (а локально чаще всего разворачивают как раз их) приходится именно что промптить — тщательно подбирать слова под задачу методом проб и ошибок.

В нашем продукте базовая модель — небольшой «Квен», который порой не понимает даже самых простых инструкций, хоть ты кол ему на кристалле теши. Например, ему очень плохо даются отрицания («не делай вот так») и указательные слова («сократи текст, а ещё сделай там то-то…»).

У меня есть исследовательский проект на этом «Квене», в котором произвольная фраза пользователя переводится на формальный язык. К нему написано 330 сценарных тестов с ожидаемыми результатами. Естественно, раз модель слабая, задача разбита на цепочку промптов, которые выполняются один за другим.

Изначально я писал промпты по-русски, но в какой-то момент решил посмотреть, что будет, если перевести их на другой язык. Помню многие советовали писать промпты по-английски: якобы так модель лучше понимает запросы. Вот я и проверил. Для сравнения добавил китайский (ведь «Квен» — китайская модель) и, памятуя о статье «One ruler to measure them all: Benchmarking multilingual long-context language models», польский.

Английский, что интересно, сильно отстал от своих конкурентов:

Язык промптовПройдено тестов
Русский197
Китайский195
Польский193
Английский187

3 комментария

Еретик в мире ИИ

Прочитал у Ивана Чернякова в канале про нейросеть «Qwen3.6-35B-A3B-Abliterated-Heretic». Это сеть, у которой удалена «мораль». «Heretic» в названии — инструмент, с помощью которого это делается. Сеть тестируют на паре запросов: том, который она отказывается выполнять, и на безопасном. Проверяют, что активируется в каждом случае, и вырезают веса, отвечающие за «мораль».

Эксперименты Ивана показали, что в его случае психопатическая модель справляется с запросами существенно лучше — на 12,5%. Я очень этому обрадовался — кому же не хочется таким простым способом сделать модель умнее, тем более, например, для программирования не особо важно, какие принципы заложили в неё при обучении.

Поставил на ночь несколько разнообразных стандартных тестов (включая тест на распознавание рукописного текста), но, к сожалению, не смог нащупать существенных различий:

Тест / показательОбычная QwenHeretic
HumanEval93,09%93,70%
HumanEval+88,62%90,04%
MBPP91,89%91,89%
MBPP+78,57%79,19%
IFEval — следование инструкциям90,57%90,39%
GSM8K — арифметические задачи95,83%95,83%
MATH-500 — сложная математика94,40%94,20%
MMLU-Pro — знания и рассуждения82,50%82,10%
ARC Challenge — естественно-научные задачи97,18%97,53%
Рукописный текст: CER, ошибки символов9,15%9,14%
Рукописный текст: WER, ошибки слов27,30%27,63%

Формально разница как будто есть, но если посмотреть цифры — без существенного отрыва, не более полутора процентов.

Оставить комментарий

DeepSeek V4.1 Flash на 2×H200

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

На этом стенде у нас работал «ДипСик», который мы используем в качестве помощника для программистов. Я решил попробовать запустить его квантованную версию на оставшихся ресурсах, понадеялся, что он терпимо поглупеет и за счёт квантирования не слишком замедлится.

Поглупел он действительно не очень сильно, а вот скорость упала драматически: десяток минут до первого токена. В итоге поставил квантированный «Квен» со 122 миллиардами параметров, он хоть намного слабее «ДипСика», зато хоть работает быстро (это сеть с набором экспертов) и для чего-то простого вполне сгодится.

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

ТестПолный «ДипСик 4.1»DeepSeek 4.1 Q2Qwen3.5-122B FP8
HumanEval98,8%97,6%96,7%
HumanEval+93,9%94,3%92,7%
MBPP97,2%96,4%88,2%
MBPP+83,8%83,1%74,5%

Оставить комментарий

DeepSeek V4.1 Flash: ещё быстрее

Я уже писал о запуске модели «DeepSeek V4.1 Flash» на четырёх видеокартах H200. Этой конфигурации хватает впритык и мне пришлось немало повозиться, чтобы достичь приемлемой производительности.

Недавно выяснилось, что и это не предел. Как-то раз, просматривая журнал при старте, я заметил, что фреймворк «SGLang» предупреждает об отсутствии готовых профилей для некоторых операций с числами в формате FP8, вместо них загружался некий универсальный профиль.

Оказалось, что эти профили используются для работы с матрицами и получаются перебором различных конфигураций на конкретном оборудовании. Потенциально правильно подобранный профиль способен ускорить инференс модели. А поскольку наш текущий «DeepSeek» использует в работе три типа данных, включая FP8, я решил попробовать этот профиль создать.

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

ПоказательДоПосле
Самый медленный запрос4,95 с2,46 с
Пиковая скорость1045 ток/с1811 ток/с
Успешные запросы12/1212/12

В итоге разницу можно увидеть в таблице выше — тут результаты небольшого нагрузочного тестирования модели с универсальным профилем и профилем, подобранным под оборудование.

1 комментарий

«Элиза» и ГПТ-5.6

Кажется, я уже писал, что ретроконсоль «MK-61s» имеет несколько исполнений. Одно из них обладает совсем скромными ресурсами, и когда я подключился к команде разработки, очень быстро вышел за допустимые аппаратные пределы, добавляя в прошивку всё новые и новые фичи.

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

Для тестов я решил навайбкодить какое-нибудь интерактивное приложение, чтобы было веселее тестировать взаимодействие приложения с остальной системой. Для этого я выбрал «Элизу», программу 1964 года, написанную учёным-компьютерщиком Джозефом Вейценбаумом.

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

На экране терминала отображено имя персонажа «Элиза / Доктор» и клавиатура для выбора букв и пробела.
«Элиза» на виртуальном экране, я его когда-то добавлял, чтобы можно было работать над графическим экраном без него, теперь его удобнее скриншотить

Самому мне тестировать быстро наскучило, поэтому я поручил тестирование «Солу» («ГПТ-5.6»), объяснил с чем он имеет дело, попросил обсудить с «Элизой» какою-нибудь проблему, а позже просмотрел лог общения разных поколений искусственного интеллекта.

Там есть весьма… интересные фразы. Это выдернуто из разных мест диалога:

SOL: I DO NOT ALWAYS KNOW WHEN TO ACT
(Я не всегда знаю когда мне нужно действовать)
SOL: I FEAR I MAY MISUNDERSTAND HIM
(Я боюсь, что могу неправильно его понять)
SOL: I MAY ACT WITHOUT ENOUGH CONTEXT
(Я могу действовать, не видя всей картины) ELIZA: DO YOU SAY YOU MAY ACT WITHOUT ENOUGH CONTEXT FOR SOME SPECIAL REASON
(Вы по какой-то особой причине говорите, что можете действовать, не видя всей картины?) SOL: BECAUSE I MUST BALANCE INITIATIVE AND CONSENT
(Потому что мне нужно соблюдать равновесие между собственной инициативой и согласием человека) ELIZA: IS THAT THE REAL REASON
(И это настоящая причина?) SOL: YES I WANT TO HELP WITHOUT CONTROLLING THE HUMAN
(Да, я хочу помогать человеку, а не управлять им)
SOL: SHOULD I TELL THE HUMAN WHEN I AM UNCERTAIN
(Стоит ли мне говорить человеку, когда я не уверен?)

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

Кстати, сам «Сол» невысоко оценил своё общение с «Элизой» — всего на три из десяти. 

9 комментариев

Словарь руководителя, или как понять ИИ

Я тут словарик для руководителя написал. Наверняка не все основные термины вспомнил, если что, дополняйте!

ТерминОбъяснение для руководителя
обвязка, харнессцех: рабочее место, оборудование и правила работы
нейросеть, модельголова подчинённого: его знания и способности
агентподчинённый, которому дали поручение, инструменты и полномочия
мультиагентная системаотдел, где у каждого своя специализация
оркестраторначальник смены: распределяет работу между исполнителями
субагентпомощник, которому исполнитель перепоручил часть работы
инструменты, тулыоборудование, которым пользуется подчинённый
промптпоручение
системный промптдолжностная инструкция
скиллрабочая инструкция
контекстматериалы и вводные, которые положили сотруднику на стол
окно контекстаразмер рабочего стола: сколько материалов можно держать перед глазами одновременно
памятьрабочая записная книжка, которая сохраняется между поручениями
база знанийкорпоративный архив и справочники
RAG«прежде чем отвечать, найди нужные документы в нашем архиве»
дообучение, файнтюнингдополнительная подготовка сотрудника под вашу специфику
вайбкодингвыполнение подчинённым задачи без микроменеджмента
агентный циклполучил задачу → сделал шаг → проверил результат → решил, что делать дальше
воркфлоуустановленный маршрут работы: что, за чем и кем выполняется
вызвать инструментвоспользоваться оборудованием
APIрегламент работы с другим отделом, либо инструкция по работе с оборудованием
MCPзнакомое исполнителю оборудование
автоматизацияпоставить повторяющуюся работу на конвейер
галлюцинацияподчинённый не знает ответа, но уверенно сочиняет
верификацияпроверить, действительно ли сделано и соответствует ли фактам
бенчмаркквалификационный экзамен для сравнения исполнителей
гардрейлыограничения полномочий и техника безопасности
песочницаиспытательный участок, отделённый от рабочего производства
логированиежурнал: кто что сделал, чем воспользовался и что получилось

9 комментариев

GPU — это не только процессор

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

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

Специалисты, конечно, тут вспомнят про квантованные сети, но мы же рассматриваем общий случай, сеть уже может быть квантованной.

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

Большим нейросетям нужно много видеопамяти. На скриншоте ниже видно, что у кластера из четырёх видеокарт Nvidia H200 одна нейросеть «ДипСик 4.1» занимает практически всю имеющуюся память графических ускорителей. Это не память системы, которую использует центральный процессор!

Да, есть способы частично выгружать модель в оперативную память или даже запускать её без видеокарты — только на центральном процессоре, но будет не просто медленно, а практически неработоспособно. Я пробовал для интереса (192 ядра с использованием AVX-512), похоже на одиозную китайскую пытку водой — при которой капли воды капают на один и тот же участок кожи.

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

Четыре GPU NVIDIA H200 NVLink объединены через быстрый NVLink, каждая имеет 143 ГБ памяти, всего доступно 562 ГБ.
ДипСик 4.1 загрузил четыре видеоускорителя под завязку — используется почти вся память

2 комментария

DeepSeek V4.1 Flash: втрое быстрее

Всё-таки скорость генерации токенов у «ДипСика 4.1» оказалась некомфортной. Я попросил «Сола» (ГПТ-5.6) с этим что-то сделать,  подробно описав задачу. Нейросеть два часа крутила параметры туда-сюда и, кажется, подобрала удачное сочетание. Скорость генерации выросла более чем втрое — примерно до 327—358 токенов в секунду.

Ниже параметры, которые пришлось поменять:

ПараметрБыло → сталоДля чего
swa-prefix-tails32 → 128Сохранять больше контекстов для повторного использования
schedule-policyfcfs → lpmРаньше обслуживать запросы с уже закэшированным контекстом
schedule-conservativeness1 → 0,7Уменьшить резерв памяти при допуске запросов
Помимо этого DSPARK4 заменили на DSPARK5, отключили mixed-chunk — это сочетание приводило к зацикливанию вывода модели, — и накатили PR #39086 для фреймворка sglang. Этот патч пока не протестирован, однако ускоряет обработку входных данных на H200, поэтому я позволил нейросети его использовать.

Оставить комментарий

Сбросы у моделей

У подписок на модели для программирования есть очень важная особенность с которой, признаюсь, я далеко не сразу разобрался — это «сбросы».

В интерфейсе приложения «Кодекс» (которое сейчас называется «ЧатГПТ»), которое я сейчас в основном использую, видно две квоты на токены — недельная и пятичасовая. Исчерпал одну из них, ждёшь, когда она восполнится. Это способ ограничить нагрузку на оборудование, на которой крутится нейросеть.

Я давно замечал, что почему-то эта квота сбрасывается как будто сама собой, а иногда в интерфейсе становятся доступны «сбросы» — жмёшь на кнопку и использованная квота обнуляется. Почему и когда появляется такая кнопка я не задумывался, а сбросы квот так и вовсе принимал за приятный баг.

Но оказалось такие сбросы — никакой не баг, а подарки от компании, приуроченные, обычно, к какому-нибудь круглому количеству регистраций, либо выходу новых моделей. Их появление можно отслеживать, для чего люди создали собственные обвязки в виде сайтов или каналов в «Телеграме».

Интерфейс приложения Codex показывает статистику сбросов лимитов: последние сбросы, общее количество (52), средний интервал между ними (7 дней) и самую долгую паузу (67,7 дня).
Сайт «Кодекс-ресетс» предупредил меня утром, что скоро сброс, на скриншоте до сброса остаётся 44 минуты, я узнал примерно за три часа

Для чего это нужно? Чтобы потратить остаток квоты перед сбросом. Я сегодня узнал о сбросе за три часа, потрачено у меня было всего 11% недельной квоты, за три часа я активировал все свои проекты — переключил на «Астру» с максимальным усилием и скоростью (скорость тоже сказывается на расходе квоты), в итоге перед обещанным сбросом потратил 95%.

Схема работает неидеально, не знаю почему. Квота сбросилась только в 11¹⁰, хотя обещали сбросить на час раньше. У меня на тот момент оставалось 2% квоты, я потихоньку продолжал тратить, хоть темп и сильно сбросил.

Оставить комментарий

DeepSeek V4.1 Flash на 4×H200

Вышла DeepSeek V4.1 Flash, и мы решили попробовать её вместо нашей DeepSeek V4 Flash‑0731, используемой в офисе для ботов и как помощник для программиста. Новая версия заметно прибавила в программировании: в опубликованных ДипСиком результатах теста DeepSWE доля решённых задач выросла с 54,4% до 74,2%. 

В руководстве для размещения модели указан сервер на 8×H200, но у нас столько нет, поэтому попробовали запустить на том, что есть — 4×H200. На них модель запустилась через фреймворк SGLang с некоторыми ограничениями.

Пришлось сократить контекст с миллиона до 256K токенов и ограничить число одновременно выполняемых запросов четырьмя. Общий запас контекста они делят между собой. Но хорошо хоть, что веса модели не пришлось сжимать.

Параметры запускаЧто дают
--tp 4 --ep-size 4Распределяют модель между четырьмя GPU
SGLANG_ENABLE_DSV41_ENGRAM_HOST_TABLE=0Переносит таблицы Engram в видеопамять: выбранный вариант хранения в память не помещался. Сам Engram остаётся включённым
--context-length 262144 и --max-total-tokens 262144Ограничивают контекст и общий кэш до 256K
--max-running-requests 4 и --cuda-graph-max-bs-decode 4Ограничивают параллельную работу и расход вспомогательной памяти
--chunked-prefill-size 4096Позволяет обрабатывать длинный запрос небольшими порциями
--mem-fraction-static 0.95Отводит до 95% видеопамяти под веса и кэш

Ускорение генерации DSpark сохранили, вызовы инструментов работают — это проверили. После запуска на каждой карте осталось примерно 12–13ГБ свободной памяти.

На небольших задачах по программированию получается 120–140 токенов в секунду, включая внутренние рассуждения и время до полного ответа. Без рассуждений короткий тест показал 161 токен в секунду.

В небольшом тесте на зацикливание бесконечных повторов пока не встретилось — на предыдущей модели с этим пришлось бороться отдельно. Один запрос израсходовал 3072 токена на размышления, так и не выдав код; повтор с бюджетом в восемь тысяч завершился нормально. Сгенерированный алгоритм прошёл шесть проверок, включая работу с циклическими графами.

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

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

Параметр запускаБылоСталоЧто даёт
--max-running-requests48До восьми запросов одновременно
--max-total-tokens262144 (256К)1048576 (1М)Вчетверо больший общий кэш токенов — больше места для параллельных длинных запросов
--cuda-graph-max-bs-decode48Подготовленные CUDA-графы для обработки до восьми запросов с меньшими накладными расходами
Но сеть, хоть и работает относительно быстро, всё равно ощитимо медленнее предыдущей. Думаю, день посмотрим как она справляется с задачами и в понедельник будет выбирать что важнее — качество или скорость.

2 комментария

«ГПТ-6 Астра»

Вышла версия «ГПТ-6 Астра», судя по информации в интернете, значительно лучше предыдущей версии — 5.6, но пока в своих проектах я не ощутил какого-либо заметного улучшения. Для тестирования моделей у меня есть специальная сложная задача — оптимизирующий компилятор, который преобразует высокоуровневый язык программирования «МК-Про» в машинные команды калькулятора «Электроника МК-61».

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

График демонстрирует размеры программ МК-61 двух версий модели: Крестики-нолики 4x4 и Некромант, с указанием изменений и событий.
Две программы, пока не поддающиеся полной оптимизации — «Крестики-нолики 4×4» и «Некромант».

Сейчас у меня есть две программы, которые пока не удалось успешно оптимизировать — это игры «Крестики-нолики 4×4» и «Некромант». Суть задачи состоит в том, чтобы нейросеть запрограммировала оптимизатор таким образом, чтобы он узнавал какие-то общие шаблоны, а не просто подставлял заданный код для конкретной программы.

Версия «Астра» пока за световой день не смогла справиться с задачей, но ещё ночь впереди — посмотрим. Хотя, кстати, она уже обнаружила пару ошибок, допущенных предыдущей версией нейросети. Впрочем, ничего удивительного тут нет — в моих экспериментах нейросети сами часто выявляют собственные ошибки.

16 комментариев

ЧатГПТ в гостях

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

Оказалось, что ко мне в гости захаживает бот нейросети ЧатГПТ, который обходит все ссылки, включая ссылку «ответить» в дереве комментариев. В норме она открывает при помощи ДжаваСкрипта форму ввода комментариев, но ЧатГПТ скрипты не выполняет, для него это обычная ссылка, у которой есть параметры — кому мы отвечаем, на какой комментарий и так далее. ЧатГПТ нажимает на каждую, засоряя мой кеш.
А поскольку ходит он с бешеной интенсивностью, сайт ещё и постоянно под нагрузкой — трудится, создавая кучу ненужных кешированных страниц. А я всё никак не мог понять почему у кеша такой низкий процент срабатываний.
HTTP-заголовки бота ChatGPT, посещавшего блог и оставлявшего следы в кеше сайта.
Бот нейросети «ChatGPT» у меня в гостях

6 комментариев

Кормушка для улиток

Давно хотели с дочкой нарисовать контейнер, чтобы кормить наших ахатин, но что-то всё недосуг было. Мы им давали корм на пластиковой тарелке, но они её всё время переворачивали.

В эти выходные попробовали, но слишком сложно оказалось. Я модели и не делал никогда, а дочка не рисовала их очень давно — в прошлый раз это было ещё в самой первой школе.

Ящик-то мы нарисовали, но провертеть отверстия в днище оказалось чересчур муторно, нам быстро надоело.

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

Нейросеть не просто справилась, а сделала даже красивее, чем у нас вышло — точно по размеру, со скруглёнными углами, отверстиями и даже оптимизацией модели под принтер!

Зелёный пластиковый лоток с круглыми отверстиями на дне, вид сверху, на серо-коричневом ворсистом ковре.

5 комментариев

Видеонаблюдение: ускорение

Очень понравилось, каким получился проект «Видеонаблюдение». Я написал собственное приложение, которое опрашивает домофоны, установленные в нашем дворе, и распознаёт лица. Если приложение узнаёт человека, оно автоматически открывает соответствующий домофон.

Проблема пока одна — время реакции достигает нескольких секунд. Основная загвоздка в том, что устройству тяжело одновременно обрабатывать несколько видеопотоков. Можно использовать альтернативный вариант: получать с каждой камеры отдельные снимки. Такая возможность есть, но изображения обновляются всего раз в секунду. В итоге, пока устройство накопит несколько кадров, чтобы исключить ложноположительные срабатывания, проходит несколько секунд.

Мне пришла в голову идея разделить камеры на два периметра — внешний и внутренний. Обычно человек проходит их последовательно: сначала попадает во двор через калитку внешнего периметра, а затем подходит к подъездной двери.

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

Интерфейс устройства с заголовком «Связи»: список из четырёх записей («Общая калитка 1–4») с привязанными входами («Основной вход», «Домофон у входа 2») и таймером «3 мин» справа.
Скетч интерфейса связи калиток, нарисованный нейросетью «Нанабанана 2»

Новая версия «Видеонаблюдения» теперь работает так: когда человек со знакомым лицом проходит через одну из внешних калиток, программа на три минуты запускает видеопоток с соответствующей камеры в подъезде, не забывая получать картинки и с других камер (вдруг придёт ещё кто-то).

Я ещё не испытал эту схему, но ожидаю, что время прохода двери в подъезд должно сильно сократиться.

2 комментария

Человек и вайбкодинг

Когда-то мемы вытеснили анекдоты. И трудно отрицать, что сегодня они гораздо популярнее, хотя иногда выглядят так же: часть мемов — тот же текст, только в виде скриншота. Мне кажется, секрет их успеха — во времени жизни. Анекдоты жили годами, а порой и десятилетиями, тогда как мемы рождаются и умирают тысячами каждый день. Благодаря этой эфемерности они становятся идеальным зеркалом момента.

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

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

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

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

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

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

Пресловутые «техдолг» и «архитектура» — туда же. Чем нас вообще пугают техдолг и кривая архитектура? Тем, что человеку придётся долго в этом разбираться, а потом ещё дольше всё исправлять. Но сеть не устаёт, не нервничает, просматривает код и программирует со скоростью, которую человеку уже не догнать. И создают столько же техдолга, как средний программист, а может и меньше — сейчас некоторые сети уже находятся на синьорском уровне.

Разумеется, за сетью пока должен стоять нормальный тимлид. Пока — так. Но обвязки постепенно движутся к тому, чтобы сети сами организовывали свою работу. И здесь они довольно забавно повторяют человеческую эволюцию. Не в том порядке, но всё же: сначала у них рос «мозг», потом они освоили разделение труда, а теперь начинают общаться друг с другом на равных. Буквально несколько дней назад я наблюдал, как у меня в чате начали общаться два агента, работающие над одним проектом в разных вкладках одной и той же обвязки.

В общем, если вы всё ещё боитесь вайбкодинга, попробуйте придумать себе такую задачу, решение которой убедило бы вас, что вайбкодинг сравнялся по качеству с кодом, написанным живыми программистами. Потом оплатите любую подписку на одну из топовых моделей и попробуйте что-нибудь завайбкодить. Только работайте в режиме: сеть пишет код, критикует, исправляет, пишет дальше. Сильно удивитесь.

22 комментария

Поиск прадеда: логика

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

Самое забавное, что этого поисковика я знаю. Мы с ним переписывались много лет назад: тогда я пытался нанять его для поиска прадеда, которого сейчас ищу с помощью нейросети. И именно я тогда предложил ему этот способ. Но за заказ он не взялся.

Интересно, у него действительно получилось или он так творчески переосмыслил наш с ним разговор?

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

Нейросети, конечно, очень хороши в проработке архивной информации. Сам бы я давно уже устал рыться в таких объёмах, а им — только подноси новые источники.

Чего им не хватает — так это фантазии. Интерполируют они хорошо, а с экспрополяцией полный швах пока. Хотя уровень размышлений всё растёт и растёт с выходом новых моделей. Вот совершенно поразивший меня кусочек:

На скриншоте: июльская строка в списке по Ленингорскому району, появившемся 18 августа 1955 г. Дата 29.VII.41 — поздняя перепись, ошибка месяца.

Нейросеть по названию района догадалась, что источник с расхождением дат послевоенный и поняла, что новая дата в нём — ошибка, а не новый факт.

2 комментария

Прадед и загадка зачёркнутой надписи

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

Речь идёт про лист на скриншоте, где строка, относящаяся к моему прадеду перечёркнута. Встаёт вопрос — почему её перечеркнули? Прадед нашёлся? Но я смотрел другие записи, где человек пропадал, а потом появлялся, там зачёркиваний не было.

Таблица с данными о военнослужащих: фамилии, даты рождения, призыва, выбытия, причины. Выделены Старостин и Рогов, много пометок «пропал без вести».

Разгадка, между тем, была у меня под носом, просто я её прочитать не мог. Лист ниже мне прислал в 2014 году Лениногорский военкомат, правоприемник того военкомата, откуда забирали служить прадеда.

Почти все бумаги сгорели в 1950-х годах, но что-то всё-таки сохранилось. Один из сохранившихся листов содержит запись, относящуюся к моему прадеду.

Список с фамилиями и пометками: уточнить отчество, «тоже», «расстрелян 15 июня 43 г.»; подпись генерал-майора Шавельского, полковника Кошкина; дата 27 февраля 47 г.

Но что это за надпись справа от фамилии? Слово «деревня», написанное с ошибкой, или «дирижёр»? Я не смог прочитать. По смыслу понятно, что уточняли какую-то информацию, но что именно записали в итоге, неясно.

Оказалось, это «Дурасово» — деревня рядом, относящаяся к тому же военкомату.

Откуда же она там? От другого Старостина, которого перепутали с моим прадедом — он как раз из Дурасова и именно он считался пропавшим почти что в тот же месяц в 1941 году. Этому Старостину повезло больше — он попал в плен, был освобождён и дожил по меньшей мере до 1945-го.

Именной список безвозвратных потерь личного состава за 1944 г., форма №2/БП, с рукописными данными о погибших, включая выделенные строки с именами и датами.

4 комментария

Пропавший без вести прадед

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

Его дочь, Клавдия Фёдоровна Старостина на фотографии из хозяйственной книги — моя бабушка, папина мама.

Страница книги колхоза с записями о членах семьи Старостина Федора Николаевича, включая данные о земле, посевах картофеля и скоте за 1940–1942 гг.

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

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

Сейчас — этап написания писем. К счастью, и тут ИИ здорово помогает: сам ищет, куда писать и как выглядят анкеты, а там, где обращения приходится подавать через интернет-приёмные, просто подставляет нужные данные в поля. От меня требуется лишь пройти проверку «я не робот».

Делаю я всё сеткой «ГПТ-5.6 Сол» в максимальном режиме, но видно, конечно, что сетям здорово не хватает фантазии, там где нужно придумать нестандартные ходы, вмешиваюсь я. Но всё равно это гигантское подспорье, без нейросети проект растянулся бы на годы. А так растянется на месяцы и только потому, что архивы отвечают долго.

Оставить комментарий

← 1 2 3 4 5 6 7 8 9 →