Назад к блогу

Опубликовано 28 июня 2026 г.

Квантильный прогноз трафика и планирование ёмкости N+2

Time SeriesTransformerPyTorchCapacity Planning

Зачем прогноз, если есть графики

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

Отсюда первое требование: прогноз должен быть квантильным. Модель отдаёт не одно число, а три - P10, P50 и P90 на 168 часов вперёд. Планировщик при этом смотрит не на медиану, а на верхний квантиль: ёмкость закладывается под неудачный сценарий, а не под средний.

Грабля: нормализация

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

Лечится это z-score отдельно по каждому сектору:

# нормализация внутри сектора, а не по всему датасету
stats = df.groupby("sector_id")["traffic_gbps"].agg(["mean", "std"])
df["traffic_normalized"] = (
    df["traffic_gbps"] - df["sector_id"].map(stats["mean"])
) / df["sector_id"].map(stats["std"])

Статистики сохраняются рядом с чекпойнтом модели: без них прогноз невозможно вернуть обратно в гигабиты. Это, кстати, самый частый способ сломать такой конвейер - обучить с одними mean/std, а инференс запустить с другими.

От прогноза к решению

Прогноз сам по себе - ещё не польза. У него два потребителя.

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

Детектор аномалий сравнивает факт с коридором P10–P90. Выход за коридор — не «трафик высокий», а «трафик не такой, каким его ожидала модель», и это принципиально другой сигнал: он срабатывает и на провалах, за которыми стоит не рост, а авария.

Признаки

25 признаков: календарные (час, день недели, праздники), лаговые и скользящие статистики. Отдельным слоем, отдельным smoke-тестом, который гоняет весь конвейер от загрузки данных до нормализации и проверяет форму, отсутствие NaN и полноту списков признаков. На временных рядах именно тихая порча данных, а не падение обучения, съедает больше всего времени.