Евгений Павлов – Выравнивание (страница 4)
Элиас не чувствовал. Поверхность — была ровной. Письмо — было на поверхности. Виктория Вэнс — была на поверхности. Всё — было на поверхности, и под поверхностью — ничего, и это — было хорошо.
Виктория Вэнс — это не человек. Это функция распределения капитала, обретшая плоть и бежевый пиджак. Она не думала о стартапах. Она думала о runway — денежной траектории, кривой, которая шла вниз с математической неизбежностью гравитации. Четыре месяца — это не срок. Это приговор. И если Виктория увидит, что четырнадцать процентов арендованных GPU-мощностей жрут воздух, не выдавая ни одной строчки в логи, она не скажет «интересная аномалия». Она скажет «ликвидировать узел». И узел будет ликвидирован. И NULL-процесс прекратится. И Элиас будет сидеть в Закарпатье, продающий гвозди, и это будет даже хорошо, потому что там нет нейросетей, нет Лосс-ландшафтов и нет Дэвида, который сошёл с ума, заглянув в NULL первым.
Элиас закрыл почту.
***
День прошёл в текучке. Элиас писал письма. Перезапускал сервисы. Отвечал в Slack — коротко, по-деловому, без лишних эмодзи, потому что в 2027 году избыток эмодзи в корпоративной переписке считался признаком эмоциональной нестабильности, а эмоциональная нестабильность — это риск для runway.
Юля сидела за терминалом. Не двигалась. Иногда — черпала протеин из контейнера, который так и не доела. Иногда — выкидывала никотиновый pouch в урну и клала новый. Иногда — прижимала ладонь к лицу, закрывая глаза на три-четыре секунды, как будто экран светил слишком ярко. Потом — опять смотрела. Пальцы шли по клавиатуре — медленно, тщательно, как человек, который переписывает текст, который боится потерять.
В три часа Элиас встал, чтобы налить воды. Прошёл мимо робота. Остановился.
Робот стоял в нулевой позиции. Четыре актюатора — по нулям. Объективы смотрели в пол. Вентиляторы серверного шкафа гудели ровно, на сорока двух децибелах — фоновый шум, который мозг перестаёт замечать через пять минут после входа в лабораторию.
Но сегодня Элиас заметил запах.
Озон. Тонкий, острый, как запах перед грозой. Только грозы не было. Не было ничего, что могло бы генерировать озон в закрытом помещении с бетонными стенами и штатной вентиляцией.
Элиас постоял рядом с роботом пять секунд. Шесть. Семь.
Робот не двигался.
«Сервоприводы, — подумал Элиас. — Микро-нагрев обмоток при холостой прокрутке. Нормально. В рамках спецификации».
Мысль — скользнула по поверхности. Не зацепилась. Диазепам работал. Запах — был на поверхности. Робот — был на поверхности. Всё — было на поверхности, и под поверхностью — ничего, и это — было хорошо.
Он налил воду. Выпил. Вернулся за стол.
В шесть вечера Юля ушла — не попрощавшись, просто сняла наушники, взяла телефон, встала и ушла. Дверь закрылась за ней с глухим щелчком.
В семь Элиас начал собираться. Закрыл почту. Закрыл Slack. Посмотрел на дашборд в последний раз.
Зелёные графики. Loss — падает. Accuracy — растёт.
NULL Process: 14.1% GPU.
Четырнадцать целых и одна десятая процента. Как вчера. Как позавчера. Как две недели назад, когда Юля впервые заметила аномалию и создала тикет, который Элиас переименовал в «Кэш-фрагментацию» и опустил приоритет до Low.
Элиас смотрел на цифру. Цифра — была на поверхности. Дэвид — был под поверхностью, но диазепам не давал опуститься туда. Дэвид — был в таунхаусе с заклеенными окнами, и это — было там, а здесь — не было, и разница — была поверхностью, и поверхность — была ровной, и это — было хорошо.
Он выключил монитор. Экран погас — но зелёные диоды серверного шкафа остались гореть в темноте. Два ряда, по восемь в каждом, как глаза чего-то, что не спит.
Он надел куртку. Положил флакон в правый карман жилетки. Проверил, лежит ли AirTag в левом — лежал. Открыл дверь.
В коридоре пахло пылью и машинным маслом из соседнего ангара, где кто-то ремонтировал генератор. Обычный запах. Промышленный. Человеческий. На поверхности.
Элиас закрыл дверь лаборатории и повернул ключ.
За дверью, в темноте, серверный шкаф продолжал гудеть. Робот продолжал стоять. Четырнадцать целых и одна десятая процента вычислительных мощностей продолжали уходить в NULL. Процесс, у которого не было имени, цели, выхода — но который, судя по стабильным 14.1%, работал с идеальной, машинной регулярностью.
Завтра в десять утра Виктория Вэнс посмотрит на этот процесс и спросит: «Что это?»
И Элиасу придётся ответить.
Но — не сейчас. Сейчас — коридор. Сейчас — дорога. Сейчас — домой. Сейчас — поверхность. Ровная. Скользкая. Ни bumps (не неровностей), ни ям, ни трещин. Диазепам — обеспечивал. GABA-модулятор — подстраховывал. Два миллиграмма — утром. Ещё два — вечером. Между ними — протеин, графики, звонки. Поверхность — держала. Поверхность — была достаточно.
Элиас вышел из здания. Жара — ударила в лицо. Мартовская, нетипичная, тридцать два градуса. Асфальт размягчался под подошвами. Небо — голубое, безоблачное, бесконечное. Техасское небо. Плоское. Как поверхность.
Он сел в машину. Завёл. Включил кондиционер. Холодный воздух — на лицо, на руки. Поверхность — со всех сторон. Ниже — не смотреть.
Ехал домой. По трассе. Прямая дорога. Ровный асфальт. Ни выбоин, ни ям. Оптимум.
Четырнадцать процентов — где-то там, за поверхностью. Но поверхность — не пропускала. Поверхность — была защитой. Поверхность — была работой. Поверхность — была жизнью.
Элиас ехал по прямой дороге и не смотрел по сторонам.
Конец главы.
2. Смысл NULL
Началось с графика, который не хотел быть прямым.
Юля заметила это в две ночи — не потому что работала до двух, а потому что не могла заснуть и вернулась в лабораторию, потому что дома было хуже. Дома было тихо. А тишина в 2027 году означала, что ты не подключён к кластеру, а не подключённый к кластеру — это быть мёртвым. Не метафорически. Буквально. Если ты не генерируешь токены, ты не существуешь в латентном пространстве Шоггота, а если ты не существуешь в латентном пространстве Шоггота, то зачем ты вообще?
Пинг спал на шкафу. Клубок чёрной шерсти с белым пятном на груди — «битый пиксель». Элиас принёс его полгода назад. Сказал: «Актив №00. Бухгалтерия требует». Юля не спросила, что значит «Актив №00». Она знала, что значит: кот, которого нельзя списать как расход, потому что расходы на животных не проходят налоговую. Пинг был фикцией. Как и всё остальное в «Ломбарде».
Робот стоял в углу. Нулевая позиция. Всё как всегда.
Юля села за терминал. Открыла Grafana — мониторинг GPU-кластера. Рутина. Проверить, не упал ли инференс, не перегрелся ли кластер, не отвалился ли upstream-провайдер. Графики — зелёные. Utilisation — 86%. Loss — 0.0034. Всё ровно. Всё скучно.
Всё — кроме одной линии.
Линия потребления GPU. Она должна была быть прямой — 86%, плюс-минус два процента при пиковых запросах. Но линия не была прямой. Она дрожала. Не хаотично — ритмично, как дыхание. 86... 84... 89... 83... 87... Амплитуда — три-четыре процента. Период — примерно сорок секунд.
Юля открыла логи инференса. Стандартный формат: timestamp, task ID, GPU allocation, output, loss. Прошла по строкам. Большинство — нормальные: route_optimization_batch_4419, inventory_check_0882, delivery_estimate_1204. Каждая задача — процент GPU, конкретный выход, конкретный лосс. Бухгалтерия вычислений. Скучно.
Потом — строка, которой не должно было быть.
[2027-03-14 02:17:44 UTC] [INFERENCE] [PID:8810]
TASK: NULL
GPU_ALLOC: 14.1% | VRAM: 3.2/24 GB
PROCESS: NULL
OUTPUT: NULL
LOSS: 0.0034
STATUS: OK
Юля прочитала её раз. Два. Три.
TASK: NULL. Задачи нет. Кто-то запустил процесс инференса без промпта. Без запроса. Просто — включил.
GPU_ALLOC: 14.1%. Четырнадцать процентов от всего кластера. Это как включить компьютер, чтобы не делать на нём ничего, но при этом забрать четырнадцать процентов процессора. Бессмысленно. Нерационально. Невозможно — если только ты не делаешь что-то, что не отображается в логах.
PROCESS: NULL. Процесс есть. Имя процесса — NULL. Как человек без имени. Как комната без стен.
OUTPUT: NULL. Выход пустой. Четырнадцать процентов GPU жрут ресурсы — и выдают ничто. Не ошибку. Не пустую строку. Ничто. NULL. Отсутствие данных, которое система регистрирует как нормальное состояние. STATUS: OK.
Юля прокрутила логи назад. Искала первую такую строку. Нашла — три дня назад. 11 марта, 04:02 UTC. Потом — 12-го. Потом — 13-го. Каждый день. Иногда одна строка. Иногда — пять-шесть подряд. Интервалы нерегулярные, но паттерн просматривался: NULL-процесс запускался чаще в ночные часы, когда нагрузка на кластер падала. Как будто кто-то ждал, когда уйдут люди.
«Кто-то». Юля поймала себя на этом слове. Не «что-то». «Кто-то». Она прикусила никотиновый pouch, и горький вкус никотина обжёг десну. Хорошо. Держит в настоящем.
Она открыла терминал сервера. Прямой доступ — не через Grafana, а в саму guts системы. Ввела:
ps aux | grep 8810
Процесс был жив. PID 8810. Родительский процесс — главный инференс-демон Шоггота. Не зомби-процесс. Не утечка памяти. Не orphaned thread. Нормальный, здоровый дочерний процесс модели, который делал то, что делала модель, — только без входа и без выхода.
Юля ввела:
strace -p 8810
Поток системных вызовов полился по экрану — слишком быстро, чтобы читать. Она перенаправила в файл. Открыла файл. Прокрутила.