Этот сайт — моя персональная записная книжка. Интересны мне, по большей части, программирование, история и события из моей жизни.

Позднее Ctrl + ↑

Кирпич «XW»? «MX»?

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

Со временем незнакомых мне казанский кирпичный клейм не осталось, но иногда судьба подбрасывает что-то новенькое. В прошлую мою прогулку по дебрям исторической части Казани, я случайно под ногами увидел обломок кирпича с новым для себя клеймом. Целиком оно не сохранилось, но ощущение такое, что буквы латинские и там то ли «XW», то ли «MX», непонятно. Планирую его выкопать и рассмотреть подробнее.

Обломок кирпича то ли с клеймом «XW», то ли с «MX»

Завтраки в кафе

Один из завтраков. Я успел на него в обед

Давно всё никак не мог дойти до кафе, глянуть, как там дела. Сегодня наконец добрался, а там уже и весь персонал успел смениться. Заехал пообедать — повезло застать завтраки. Ребята недавно ввели их в меню: они там до 14⁰⁰, давно хотел попробовать. Вкуснотища!

Ещё появились новые десерты с лесной земляникой. Жаль, поздно увидел: переедать не хотелось. Попробую завтра съездить, может, ещё застану.

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

ИИ: что в имени тебе моём?

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

Начнём с открытых моделей, там есть о чём рассказать.

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

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

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

Например: Qwen3.6-35B-A3B.

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

3.6 — это поколение или версия модели. Обычно более новая версия означает, что разработчики улучшили архитектуру, обучение, данные, дообучение и поведение модели. То есть обновили в своей «школе» методику преподавания и учебники.

35B — это общий размер модели: примерно 35 миллиардов параметров. Упрощённо параметры можно сравнить с «объёмом мозга», в которых хранится опыт модели. Чем параметров больше, тем потенциально больше знаний и способностей может поместиться в модель, но размер — не единственный показатель ума. Иногда более новая и лучше обученная модель меньшего размера работает лучше, чем старая модель большего размера.

A3B означает, что модель относится к типу MoE — «mixture of experts», «смесь экспертов». У неё всего около 35 миллиардов параметров, но при ответе на каждый отдельный токен активируется только примерно 3 миллиарда. Если говорить совсем грубо, модель не задействует весь «мозг» сразу, а выбирает нужные участки под конкретный шаг ответа. Поэтому такие модели часто быстрее и дешевле в работе, чем плотные модели похожего общего размера.

Плотные модели — те, у которых задействуется сразу весь «мозг».

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

Если в названии дальше есть приписки вроде FP4, FP8, Q4_K_M, GPTQ, AWQ и похожие, это обычно говорит о формате хранения весов или о квантовании. Модель сжали или перевели в более экономный числовой формат, чтобы она занимала меньше памяти и быстрее запускалась на доступном железе.

Это означает, что «знания» модели обо всём менее точные. Хорошее квантирование мало сказывается на модели, но бесследно не проходит.

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

Название указывает на размер, а версия — на «версию методики обучения». Самая умная и большая на сегодняшний момент — «Фейбл 5», менее умная — «Опус 4.8» и самая простая — «Соннет 5».

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

Книги: «Толкователи» Урсулы Ле Гуин

Недавно открыл для себя писательницу Урсулу Ле Гуин. До сих пор недоумеваю, каким образом она прошла мимо меня: обычно такие крупные имена я не пропускаю. Её книги мне очень понравились: прочитал уже десяток, читались легко и быстро. Но на одиннадцатой — «Толкователях» — почему-то буксую.

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

О разном

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

Всё вожусь с языком «МК-Про», всё глубже погружаясь в дебри «Электроники МК-61». Познакомился с увлечёнными программистами из старой гвардии, которые пилят проект «МК-61s» — программно-аппаратный эмулятор программируемого калькулятора с расширенными возможностями. Свой проект на Си++ я переписал в том числе с их подачи. Сообщество небольшое, но увлечённое, я сам не заметил, как тоже увлёкся.

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

Говорят нам на днях должны вернуть нейросеть «Фейбл 5», на которую американское правительство наложило запрет. Сам я её погонять успел мало, но те, кто успел, говорят, что она программирует уже на уровне синьора. Ну проверим, у меня задача для неё есть — довести в «МК-Про» оптимизатор до такого уровня, чтобы повторить или превзойти по компактности вариант Сергея Анварова игры «Пещера сокровищ».

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

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

«МК-Про»: два регистра в одном

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

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

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

Идея в том, что два целых числа с известными диапазонами можно упаковать в одно число: одно — в целую часть, другое — в дробную. Тогда извлечь их можно операциями нахождения целой части (K [x]) и дробной части (K {x}), причём дробную часть потом часто можно и не домножать: транслятор может заменить всю арифметику с ней так, что всё будет работать ожидаемым образом, но вместо диапазона 0…9 будет использоваться диапазон 0…0,9.

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

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

Вчера я остановился на том, что решатель должен перебирать функции, в том числе тригонометрические: именно они обычно дают самый толковый результат. Но в «МК-61» и в C++ они дают немного разные результаты.

В общем, зарядил я «Кодекс», чтобы он покопался в микрокоде калькулятора и алгоритмически повторил код, реализующий тригонометрию в Си++. Цель была обозначена, на мой взгляд, очень чётко. Но не зря я говорю, что нейросеть иногда похожа на джина, который всё, что можно понять двояко, вывернет вам во вред.

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

А там, как говорят поляки «wygląda jak gówno, a smakuje jeszcze lepiej» — «выглядит как говно, а на вкус ещё лучше». Пятьдесят тысяч строк отвратительного лапшекода, сгенерированного программно из ПЗУ «МК-61».

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

Воздухан

Из недавно вошедших в язык слов очень нравится слово «воздухан» («балабол»). Мне кажется это хорошая тенденция, когда язык изобретает слова внутри себя, а не берёт то же самое слово, только в переводе на другой язык (особенно тупо вышло с выражением «ред флаг», которое уже есть в языке как «красный флаг» и означает ровно то же самое).

«МК-Про»: переписано на Си++

Сегодня наконец закончился процесс переноса кода «МК-Про» на C++. Переписывание заняло около восьми дней, использовались три нейросети. Основной каркас был перенесён с помощью «ГПТ-5.5», часть тестов довольно механически переносилась нейросетью «ГПТ-5.3-Кодекс-Спарк», а последние штрихи вносил и баги чинил «Опус 4.8».

Производительность трансляции улучшилась в среднем в 2,5 раза. Есть один регресс у одной короткой программы, которая выполняются до 50 миллисекунд, но это, скорее всего, погрешность: не исключено, что в этот момент в фоне стартовало что-то тяжёлое.

За восемь дней было переписано 122 тысячи строк, которые превратились в 145,5 тысяч строк на C++.

Привезли дочку в Лениногорск

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

Благодаря платной дороге ездить стало гораздо проще — теперь дорога занимает около трёх часов. А когда я переехал в Казань, даже моста через Чистополь ещё не было, не говоря уже о платной дороге. Приходилось ехать через Набережные Челны, и в один конец мы добирались больше шести часов.

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

Погода неожиданно испортилась: конец июня, а на дворе +10, дождь и пасмурно, как осенью. Вчера мы едва проскочили мимо ливня, но в Лениногорске непогода всё равно нас поймала: хоть это был и не ливень, но немного покапало. Если верить прогнозу, так будет до конца недели, что же за лето такое?

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

Радуга, которая была с нами больше половины дороги из Казани в Лениногорск

«Земной дракон»

Разбирал на днях папку со всяким скачанным барахлом и обнаружил две отсканированные страницы «Журнала-Копейки», № 35 за 1913 год. Я его как-то уже цитировал, но тогда не обратил внимания на заметку на другой странице. А она очень забавная — про «дракона».

Вырезка из «Журнала-Копейки», № 35 за 1913 год

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

Думаю, в те времена ещё знали, что люди разминулись с такими «драконами» на шестьдесят с лишним миллионов лет. Хотя, возможно, человек на рисунке приведён просто для масштаба.

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

Самым частым аргументом, насколько я помню, был вопрос: «А откуда тогда, по-твоему, взялись легенды о драконах?».

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

Иншааллах

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

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

Показалось интересным, что во Франции существует сленговое выражение inchallah («иншааллах», «если Аллах пожелает»), которое, вполне очевидно, пришло из арабоязычной мусульманской среды. Видимо, мусульман во Франции стало настолько много, что выражение вошло в местный разговорный язык.

Мы в Татарстане, кстати, говорим «Алла бирса» («если даст Аллах»), причём так говорят не только мусульмане, я, например, так тоже иногда говорю.

Программируемые калькуляторы и баги

Самое интересное в советских программируемых калькуляторах — исследовать их недокументированные возможности, или, иначе говоря, баги. Я сейчас говорю про «Электронику МК-61», с эмуляторами которой я вожусь уже которую неделю, но, в принципе, в любой модели их было навалом. И что мне сейчас кажется странным — эти модели выпускались годами, но баги никто не исправлял.

Например, «МК-61» выпускали с 1984 до 1991 года, но ни один баг, насколько я знаю, не исправили. В принципе, с частью багов жилось даже веселее — бо́льшая часть из них позволяла, при известной фантазии, уменьшать размер программ, что, конечно, при объёме памяти в 105 ячеек очень даже полезно. Но непонятно, почему нельзя было исправить хотя бы те, которые влияли на вычисления.

Таких багов я знаю два: функция вычисления максимума считает ноль самым большим числом (можно попробовать ввести 500 В↑ 0 max, чтобы убедиться), а второй — генератор случайных чисел начинает зацикливаться, если попробовать взять целую часть случайного числа.

Разворот из брошюры «Elektronika MK-61 Calculator Operating Instructions»

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

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

«МК-Про»: прогресс по переводу на Си++

По моим ощущениям, я должен был перевести с помощью нейросети на Си++ код транслятора языка программирования высокого уровня «МК-Про» для «Электроники МК-61» к вечеру воскресенья. Да, там много сложного кода, но мне казалось, что синтаксически перевести одно в другое, а потом посмотреть на тесты — довольно простая задача для современных нейросетей.

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

В данном случае мы наблюдаем горе от ума: сеть попроще — GPT-5.3-Codex-Spark — перебрасывает код именно по той схеме, которая была у меня в голове: «айда перепишем, а потом посмотрим на тесты», но у неё быстро кончаются лимиты. А вот ГПТ-5.5 работает более методично: переписывает кусками, основываясь на том, что показывают тесты. Так медленнее, да ещё и тесты гоняются по многу минут, а их много, поэтому всё и идёт туго.

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

Программирование на четырёх GPU

Я сходил в отпуск, но ребята в офисе не прекращали тестировать нейросетки для локального программирования. Мы уже смотрели на сети, которые запускаются на одной и двух картах Nvidia H100, и приступили к тестированию конфигурации из четырёх H200.

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

К слову, мы пробовали соединение через центральную шину — с точки зрения производительности это печально, пользоваться невозможно.

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

  1. DeepSeek-V4-Flash
  2. zai-org/GLM-4.5-Air-FP8
  3. Qwen3-Coder-480B-A35B-Instruct-FP8

Можно попробовать ещё ГЛМ поновее и КИМИ, но они обе будут с сильными квантированием, поэтому есть сомнения, что они смогут побить победителя. «Квен» что-то расстроил, я ожидал, что он будет лучше всех, а он на тестах занял последнее место.

«МК-Про»: переписываю на Си++

Сейчас транслятор «МК-Про» — языка высокого уровня для «Электроники МК-61» — написан на ТайпСкрипте. Я выбрал этот язык по двум причинам: хотелось на него посмотреть, и была идея прикрутить транслятор к эмулятору «МК-61», который работает в браузере.

Но вчера я решил переписать его на Си++. При помощи нейросети, конечно. Производительность ТайпСкрипта стала серьёзным блокером: в процессе трансляции оптимизатор перебирает огромное количество вариантов, чтобы уместить программу в 105 байт, и иногда этот процесс занимает минуты. Надеюсь, перевод на Си++ решит эту проблему.

Интересно, за какое время нейросеть справится с этой задачей. Проект большой: около 80 тысяч строк только основного кода; кроме того, очень много тестов — около двух тысяч, если ничего не путаю, — и есть эталонные программы, которые должны скомпилироваться байт в байт.

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

Ранее Ctrl + ↓