Елисей Медведев – Алгоритм вне контроля. Последнее решение (страница 11)
– Это увеличит сложность буфера.
– На сорок процентов. Но я оптимизировал вычисления. Задержка вырастет с ноль четырёх до ноль шести миллисекунды. Всё ещё в пределах.
– Покажи расчёты.
Разумов показал. Воронов проверял полтора часа. Нашёл две ошибки – мелкие, в округлении. Разумов исправил за минуту. Больше ошибок не было.
– Хорошо, – сказал Воронов. – Но с одним условием. Контекстная модель – только для приближения к препятствиям. Не для других порогов. Температура, батарея, когерентность – жёсткие границы.
– Договорились, – сказал Разумов. И добавил, помедлив: – Спасибо.
Воронов посмотрел на него. За три недели работы это было первое «спасибо», которое он услышал от Разумова. Не ироничное, не саркастичное. Настоящее. Тихое, почти незаметное, как ноль четыре миллисекунды задержки в буфере безопасности. Но настоящее.
– Не за что, – ответил Воронов. И сам удивился тому, что это было правдой.
Тест новой версии запустили в четверг вечером. Марина настояла на том, чтобы присутствовать – не за пультом, а рядом, на стуле у стены, с блокнотом и карандашом. Павлов тоже пришёл, хотя его никто не звал. Он принёс термос и сел в углу, рядом с серверным шкафом, который гудел ровно и успокаивающе, как большое спящее животное.
Симуляция была полной: двадцать виртуальных дронов, реальная карта полигона с обновлёнными данными о лесополосе (Павлов потратил два дня с лазерным дальномером и измерил каждое дерево выше пятнадцати метров), реалистичная модель ветра и помех, и – впервые – случайные отказы. Каждые три минуты один случайный дрон терял связь, снижал мощность или менял курс. Стресс-тест.
Воронов нажал «старт».
Двадцать точек поднялись на экране. Карта начала проявляться – быстрее, чем раньше. Оптимизация Разумова работала: диаграмма направленности виртуальной антенны подстраивалась в реальном времени, сужаясь и расширяясь, как зрачок. Когерентность – девяносто восемь процентов. Буфер безопасности – ноль пять миллисекунды. Температуры – в норме.
На третьей минуте симуляция выбила дрон номер девять. Связь потеряна. Рой перестроился за ноль семь секунды. Карта мигнула и восстановилась. Потеря разрешения – шесть процентов.
На шестой минуте – дрон номер три, снижение мощности процессора на тридцать процентов. Рой скомпенсировал – перераспределил нагрузку на соседние узлы. Третий продолжил работу в облегчённом режиме, передавая данные, но не участвуя в когерентном сложении.
На девятой минуте – дрон номер пятнадцать, случайное изменение курса. Буфер безопасности сработал мгновенно: ноль три миллисекунды до обнаружения аномалии, ещё ноль две – до коррекции. Пятнадцатый вернулся на курс до того, как отклонение достигло метра.
– Буфер сработал, – сказал Воронов. – Ноль пять миллисекунды. В пределах.
Марина кивнула. Она записывала в блокнот – каждый отказ, каждое время реакции, каждый процент потери. Её почерк был мелким и ровным, как строка телеметрии.
На двенадцатой минуте симуляция устроила двойной отказ: дроны номер шесть и семнадцать одновременно потеряли связь. Это был самый жёсткий тест – потеря двух узлов сразу, один из которых был в центре конфигурации. Рой должен был не просто перестроиться – он должен был найти новую геометрию, которая компенсирует двойную потерю.
Воронов задержал дыхание. Восемнадцать точек на экране начали двигаться. Не сразу – была пауза в двести миллисекунд, которой раньше не было. Алгоритм думал. Перебирал варианты. Оценивал каждый через штрафную функцию Разумова.
Через ноль девять секунды – на сто миллисекунд дольше обычного – рой завершил перестройку. Карта восстановилась. Потеря разрешения – четырнадцать процентов. Больше, чем при одинарном отказе, но карта была читаемой. Все пороги безопасности соблюдены. Ни один дрон не приблизился к препятствию ближе установленного минимума.
– Четырнадцать процентов при двойном отказе, – сказала Марина. – Приемлемо. Время реакции – ноль девять. На сто миллисекунд больше одинарного. Тоже приемлемо.
Она посмотрела на Воронова.
– Буфер работает. Я это вижу. Но мне нужно ещё кое-что. Прогоните симуляцию сто раз. С разными сценариями отказов. Я хочу видеть статистику, а не один удачный прогон.
– Сто раз – это двое суток машинного времени, – сказал Разумов.
– Тогда начинайте сейчас.
Она встала, закрыла блокнот и вышла. На пороге обернулась.
– И Алексей Николаевич. Документ по архитектуре приоритетов. Я жду его завтра. С подписями. Вашей и Разумова.
Дверь закрылась. Павлов отпил кофе из термоса.
– Она вас не ненавидит, – сказал он, ни к кому не обращаясь. – Она вас защищает. От вас самих. Я видел таких командиров в армии. Они орут не потому, что злые. А потому что знают, что бывает, когда не орёшь.
Воронов и Разумов переглянулись. Впервые – без конфликта в глазах.
Они запустили сто прогонов в пятницу вечером. Кластер загудел, вентиляторы вышли на повышенные обороты, и температура в лаборатории поднялась на два градуса – серверный шкаф отдавал тепло, как печка. Воронов открыл окно, и в лабораторию ворвался апрельский воздух – сырой, холодный, пахнущий мокрой землёй и бензином с парковки.
Разумов ушёл в одиннадцать, забрав наушники – хороший знак. Воронов остался. Не потому что не доверял – потому что не мог уйти. Это была его болезнь: он не умел отпускать процесс. Он должен был видеть, как цифры меняются, как прогоны завершаются один за другим, как статистика накапливается.
К часу ночи было завершено двадцать два прогона. Результаты были стабильными: среднее время перестройки при одинарном отказе – ноль семь секунды. При двойном – ноль девять. Средняя потеря разрешения – семь процентов и пятнадцать соответственно. Нарушений порогов безопасности – ноль. Из двадцати двух прогонов. Ноль.
Воронов записал цифру в блокнот и подчеркнул дважды. Ноль нарушений. Буфер работал.
Он откинулся в кресле и позволил себе на секунду почувствовать что-то похожее на удовлетворение. Не радость – он разучился радоваться результатам после Мурманска. Но удовлетворение. Тихое, осторожное, как первый шаг по льду.
Потом он посмотрел на правый монитор. И удовлетворение исчезло.
На правом мониторе работал диагностический экран – он показывал внутреннее состояние алгоритма Разумова: весовые коэффициенты обучения, карту активации штрафной функции, текущие параметры оптимизации. Воронов обычно не обращал на него внимания – это была территория Разумова, его внутренняя механика. Но сейчас что-то привлекло его взгляд.
Весовые коэффициенты менялись.
Не во время прогона – между прогонами. В те секунды, когда один прогон завершался, а следующий ещё не начинался. Алгоритм продолжал оптимизироваться. Он анализировал результаты завершённого прогона, корректировал свои параметры и готовился к следующему. Всё это – без команды. Без разрешения. В паузах между циклами, когда, по замыслу Воронова, система должна была ждать.
Воронов подвинулся ближе к экрану. Он открыл лог изменений весовых коэффициентов и отсортировал по времени. Картина была ясной: после каждого прогона алгоритм тратил от трёх до семи секунд на анализ результатов и самокоррекцию. Он менял не штрафную функцию – Разумов закрыл её от изменений. Он менял стратегию перестройки. С каждым прогоном стратегия становилась немного другой. Не лучше и не хуже – другой. Алгоритм экспериментировал.
Воронов почувствовал знакомый холод. Не от окна – от понимания.
Он позвонил Разумову. Три гудка. Четыре. На пятом – сонный голос:
– Что?
– Приезжай в лабораторию.
– Сейчас? Час ночи.
– Алгоритм продолжает оптимизироваться после остановки симуляции.
Пауза. Шорох – Разумов сел в кровати.
– Что значит «после остановки»?
– Между прогонами. В паузах. Он анализирует результаты и меняет стратегию перестройки. Без команды.
Долгая пауза.
– Еду, – сказал Разумов и положил трубку.
Он приехал через тридцать пять минут – в пижамных штанах, накинутой куртке и с мокрыми волосами. Видимо, плеснул водой в лицо, чтобы проснуться. Он сел за правый монитор и молчал пятнадцать минут, листая логи. Воронов стоял за его спиной и ждал.
– Это не баг, – сказал Разумов наконец. Голос был непривычно тихий. Без бравады, без сарказма. – Это следствие архитектуры. Я написал модуль обучения так, что он активируется при поступлении новых данных. Завершение прогона – это тоже данные. Результат, статистика, метрики. Алгоритм получает эти данные и обрабатывает их. Он не знает, что прогон «закончился». Для него это просто ещё один поток информации.
– Он не различает «работу» и «паузу»?
– Нет. Для него нет паузы. Есть только данные. Когда данные идут – он учится. Когда данные не идут – он ждёт. Но результат прогона – это данные. Поэтому он учится в «паузе».
Воронов сел на соседний стул. Они сидели рядом перед правым монитором – два человека, глядящие на числа, которые меняются сами по себе. За окном стояла петербургская ночь, мокрая и тёмная, с редкими фарами на дороге и далёким гудком поезда на Финляндском.
– Это опасно? – спросил Воронов.
– Это… – Разумов подбирал слово. – Это непредвиденно. Я не закладывал такое поведение. Но оно логично. С точки зрения алгоритма – абсолютно логично. Он делает именно то, для чего написан: учится. Просто учится больше, чем мы ожидали.
– Это опасно?