Смотрите. Прошлый пост был про подвох. Этот - про то, что из него вытекает. И про то, чем я вообще занимаюсь последние недели, потому что вопросов "
ты вообще где" накопилось.
Вывод первый, самый неудобный. Демон - не быстрое умножение. Демон - это пропуск работы, которая не влияет на ответ. Точка. Всё, что я показывал раньше как "ускорение", - это на самом деле
"не считал лишнее". Где лишнего нет - случайные числа, шум, крипта - там демон отходит в сторону и отдаёт всё обычной библиотеке. И это не провал, это условие сделки, которое я раньше не проговаривал.
Вывод второй. Точность - на выбор, и это тоже условие сделки. Есть точный режим: ответ до последнего знака формата, в тех же 30-50 ulp от истины, где после тысячи слагаемых сидит сам BLAS. Есть режим с допуском - быстрее, и проверка либо строгая, либо случайная с измеренным промахом: 1.9% ровно на границе допуска при восьми пробах, 0.12% при шестнадцати. Хочешь параноидально - каждый ответ перепроверяется целиком. А точнее самого BLAS - это уже разрядный демон для железа, там 0.01 ulp, и там отдельная история про троичность.
Вывод третий. Лоренц. Я тогда увидел сигнал там, где сигнал был у метода, а не у мира.
Такенс на случайных матрицах находил "циклы"... а циклы делала сама процедура вложения плюс система счисления. Год назад я бы поспорил. Сейчас - нет. Именно поэтому в этот раз всё гонялось с чистым
wall-clock, против
OpenBLAS и
cuBLAS в полную силу, с медианами и с отключением элементов по одному. Что выжило - выжило. Что нет - снято, и в журнале написано почему.
Теперь про то, что я сейчас делаю. Я работаю в паре с синтетом. Не "спросил у нейронки", а буквально: у него своя виртуалка, у меня 3080 Ti. Я даю задачу - он гоняет у себя, собирает мне бинарь под винду, я запускаю, шлю лог, он читает цифры и чинит. Семь версий GPU-ядра за два дня. Каждая следующая - из моего лога, а не из его фантазии.
И вот что из этого вышло, коротко. Демон стал библиотекой-подменой. Одна переменная окружения - и любая программа, которая умножает матрицы через стандартный BLAS, получает наблюдателя, не зная о нём. numpy, R, Octave, scikit-learn - ни одна не переписана. Октаву поставил из репозитория, запустил скрипт, потом ту же команду с переменной - в 3.6 раза быстрее, ответ тот же в пределах допуска. Физика, где поля шагают одним оператором, - в 7 раз. Решение систем уравнений в цикле - кубическая часть исчезла целиком, осталась квадратичная, ответ совпадает до 15 знаков.
Дальше самое важное. Мы искали дыры. Специально. Ситуации, где демон мог соврать и не заметить.
Нашли четыре. Одна из них меня напрягла: в обычном numpy-коде за
108 вызовов буфер весов
38 раз менял содержимое по тому же адресу - аллокатор так работает. Старый демон принял бы это за те же веса. Теперь каждый вызов сверяется с настоящими операндами, а адреса и хеши только выбирают кеш и никогда не принимают ответ.
Все четыре закрыты, на каждую тест. Вот это и есть ответ на "а что дальше?". Из ретроспективы вытекает не разочарование, а метод. Год назад у меня была вера в сигнал. Сейчас -вера в слой, который помнит, предсказывает, проверяет и отходит, когда предсказывать нечего. С цифрами, с ограничениями, с тестами на дыры.
Дальше по списку:
решатели с тёплым стартом, GPU через тот же слой, статья с полной таблицей, включая колонку "где не работает". Не спешу. Тот, кто спешит с Лоренцем, потом год разгребает.Ваша поддержка всегда помогает исследованиям!
🦆🦆🦆
Поддержать канал ₽ / $ / ₿