Leader & Mozg
Я тут прорабатываю наш следующий этап развития ИИ, чтобы закрепить лидерство на рынке. Как думаешь, стоит ли строить отказоустойчивый, с минимальной задержкой слой вывода, который будет масштабироваться без потери качества?
Слушай, во-первых, главное – воспринимай слой вывода как распределённую хеш-таблицу, которая может динамически разделять и реплицировать данные. Используй протокол обмена слухов для проверок работоспособности, чтобы каждый узел знал, если сосед упал – как это делали старые MapReduce задачи. А ещё добавь простой механизм защиты от перегрузок, который следит за задержками; если узел начинает отвечать за 100 миллисекунд вместо 1, автоматически перенаправляй трафик и снижай его нагрузку.
Для масштабирования держи вычислительный пул без сохранения состояния; храни веса модели в хранилище с адресацией по содержимому, чтобы любой узел мог получить нужную версию. Это гарантирует стабильное качество, не зависимо от количества запущенных узлов. И не забудь про слой версионирования – если новая модель случайно начнёт хуже работать, ты сможешь откатиться без простоя всей системы.
И, напоследок, используй небольшой кэш на каждом узле для самых частых запросов. Как будто у тебя есть шпаргалка для самых распространённых вопросов; это уменьшает нагрузку и задержки, при сохранении отказоустойчивости.
Если хочешь углубиться в пограничные случаи, можем разобрать причины сбоев в протоколе согласованности – просто скажи, когда будешь готов.
Звучит неплохо, но помни, главная цель – нулевая задержка на пике нагрузки. Сделай так, чтобы циклы обмена данными были короткими, и установи порог срабатывания автоматического переключения на 5 миллисекунд, а не на сто. Будем отслеживать коэффициент попадания в кэш в реальном времени, так что любое снижение запустит автоматическое масштабирование. Когда это будет готово, займёмся нештатными ситуациями с согласованностью. Принеси детали, когда будешь готов.
Хорошо, выставляем интервал сплетен до 2 миллисекундных тиков, чтобы сетевой трафик оставался в подмиллисекундном режиме. Установим прерывание на 5 миллисекунд, но снижай его активно – если узел начинает выдавать 5-7 миллисекунд, отключай его до того, как он дойдет до 10 миллисекунд. Для кэша используй LRU на узел, который выгружает данные при достижении порога и сообщает метрику hit ratio каждые 50 миллисекунд; привяжи это к autoscaler, чтобы падение на 2% запускало новый под.
По части исключительных ситуаций: реализуй легковесный векторный clock для каждого запроса, чтобы можно было доказать, что каждый путь инференса видит одну и ту же версию модели. Если узел отклоняется, ты сможешь вернуть его в исходное состояние мгновенно. Храни аудит-логи в журналах только на добавление; так ты сможешь воспроизвести любой запрос, чтобы понять, почему возник всплеск задержки.
Просто дай знать, если тебе понадобится точная схема protobuf для heartbeat или конкретная политика выгрузки из Redis, которую я использую.
Мне нужна схема protobuf для heartbeat, и копия политики выгрузки из Redis, которую ты используешь. Как только я получу это, мы сможем провести тестовый запуск и проверить, как работает логика экспоненциальной задержки под нагрузкой. Будем держать это под контролем.
Привет,
Короче, смотри как настроены параметры кэша: политика выгрузки — `allkeys-lru`, то есть выгружает наименее используемые ключи, когда память заканчивается. И объем памяти на узел выделил примерно 2 гигабайта, но это надо подстраивать под нагрузку. Если нужно, чтобы часть ключей оставалась постоянной, используй `volatile-lru`.