Реализовать failure injection для MoE router
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализовать failure injection для MoE router
1. Цель задачи
Разработать сценарий отказоустойчивости для Mixture-of-Experts (MoE) маршрутизатора: принудительно вывести из строя два эксперта из пула и измерить деградацию качества предсказаний. Научиться оценивать graceful degradation — ровное снижение метрик без полного отказа системы.
Ключевой результат Воспроизводимый эксперимент, показывающий, как отказ 2 экспертов влияет на loss, perplexity и распределение нагрузки, и подтверждающий, что система не падает, а плавно деградирует.
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| Модель MoE (например, Mixtral 8x7B или кастомная) | Hugging Face transformers (mistralai/Mixtral-8x7B-Instruct-v0.1) |
| Тестовый датасет (текстовые запросы) | WikiText-2, датасет Alpaca, или сгенерировать 50–100 инструкций |
| Инфраструктура для экспериментов | Локальная машина с GPU (6 GB+), Colab, или облачный инстанс |
| Логи маршрутизации (какой эксперт выбран для каждого токена) | model.layers[i].block_sparse_moe.gate.weight, routing_weights |
| Базовый loss/perplexity до инъекции | Вычислить на датасете |
Если нет реальной MoE модели — симулируем:
- Создать кастомную MoE сеть в PyTorch: 1 слой MLP с 8 экспертами (линейная + ReLU) и обучаемым router (softmax).
- Натренировать на синтетических данных (например, регрессия или классификация).
- После тренировки заморозить веса и запускать failure injection.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Модель MoE | Hugging Face transformers, PyTorch | Загрузка и работа с моделью |
| Failure injection | Python, патч forward-метода | Принудительный выход из строя экспертов |
| Метрики | perplexity, cross_entropy_loss, entropy распределения маршрутизации | Оценка degradation |
| Логирование | logging, wandb или mlflow | Запись хода эксперимента |
| Датасет | Datasets от Hugging Face (WikiText, Alpaca) | Тестовые данные |
| Мониторинг распределения | matplotlib, seaborn | Визуализация баланса экспертов |
4. Этапы выполнения
Этап 1: Окружение и baseline (30–45 минут)
Действия
-
Установить зависимости
pip install transformers torch datasets matplotlib wandb -
Загрузить модель и токенизатор
from transformers import AutoModelForCausalLM, AutoTokenizer model_name = "mistralai/Mixtral-8x7B-Instruct-v0.1" model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto") tokenizer = AutoTokenizer.from_pretrained(model_name)Если не хватает памяти — использовать load_in_8bit=True или перейти к симуляции.
-
Загрузить тестовый датасет (50 сэмплов):
from datasets import load_dataset dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split="test") texts = dataset["text"][:50] -
Вычислить baseline метрики на датасете
- Perplexity (через cross entropy loss)
- Среднюю энтропию распределения маршрутизации по всем слоям
- Количество активных экспертов на каждый токен
Результат записать в файл baseline_metrics.json.
Ожидаемый результат этапа Файл с численными значениями метрик до инъекции.
Этап 2: Реализация failure injection (1–1.5 часа)
Действия
-
Найти router слои в модели В Mixtral это model.layers[i].block_sparse_moe.gate. Создать функцию, которая:
- Принимает номер эксперта (0–7)
- Заменяет его выход на нулевой вектор (или очень малые значения, имитируя отказ)
- Либо обнуляет gate веса для данного эксперта.
-
Реализовать два сценария
- Hard failure обнулить выходы эксперта (expert.output = lambda x: torch.zeros_like(x))
- Soft failure добавить большой шум к выходам эксперта (чтобы router не выбирал его, но не падал)
-
Написать функцию-декоратор для forward'а MoE
def inject_failure(module, disabled_experts=[0,1]): original_forward = module.forward def patched_forward(hidden_states): # Вызов оригинального forward output = original_forward(hidden_states) # Обнуляем выбранные эксперты for idx in disabled_experts: output[:, :, idx*out_dim:(idx+1)*out_dim] = 0.0 return output module.forward = patched_forward -
Проверить, что модель не крашится. Прогнать 1 батч с отключёнными 2 экспертами (например, 0 и 3).
Ожидаемый результат этапа Функция apply_failure(model, disabled_experts) работает без ошибок.
Этап 3: Измерение degradation (45–60 минут)
Действия
-
Выбрать 3 комбинации отключённых экспертов
- Наиболее популярные эксперты (по частоте использования)
- Наименее популярные
- Случайная пара
-
Для каждой комбинации
- Применить инъекцию сбоя
- Прогнать тестовый датасет
- Записать метрики: loss, perplexity, entropy routing, процент токенов, где упал выбор (не выбрано ни одного эксперта — ошибка)
- Сравнить с baseline
-
Построить графики
- Degradation vs number of failed experts (можно расширить до 3,4)
- Изменение энтропии маршрутизации (чем больше отключено экспертов, тем распределение становится более равномерным или наоборот)
-
Записать все в файл degradation_results.json и/или wandb.
Ожидаемый результат этапа Таблица с метриками по каждой комбинации + визуализация (PNG/PDF).
Этап 4: Анализ graceful degradation (30–45 минут)
Действия
-
Определить критерии graceful degradation
- Perplexity выросла не более чем на 20% от baseline
- Loss вырос не более чем на 0.3
- Модель не выдала NaN или бесконечный loss
- Средняя задержка выросла не более чем в 1.5 раза
-
Проверить, выполняется ли каждый критерий для каждой комбинации.
-
Сравнить с scenario полного отказа если отключить сразу 6 экспертов (из 8), то система должна показывать резкий рост loss (non-graceful).
-
Записать вывод является ли система gracefully degradable по отношению к отказу 2 экспертов.
Ожидаемый результат этапа Краткий отчет (1-2 абзаца) с выводами.
Этап 5: Оформление результатов и postmortem (30–45 минут)
Действия
-
Создать markdown-документ
failure_injection_report.md -
Структура отчета
# Failure Injection Experiment Report ## Model - Name: Mixtral-8x7B (или кастомная) - #Experts: 8 - #Failed: 2 ## Methodology - Датасет: WikiText-2 (50 сэмплов) - Тип сбоя: Hard failure (обнуление выходов) ## Baseline metrics | Metric | Value | |--------|-------| | Loss | X.XX | | Perplexity | X.XX | ## Degradation results | Failed experts | Loss | Perplexity | Entropy | Graceful? | |----------------|------|------------|---------|-----------| | [0,1] | X.XX | X.XX | X.XX | Да/Нет | | ... | ... | ... | ... | ... | ## Graceful degradation assessment - [ ] Perplexity increase <= 20% - [ ] Loss increase <= 0.3 - [ ] No NaN errors - [ ] Latency increase <= 1.5x ## Conclusion Система демонстрирует graceful degradation при отказе 2 экспертов. -
Опционально Записать воспроизводимый скрипт
run_injection.py, который выполняет все этапы.
Ожидаемый результат этапа Готовый отчёт и скрипт.
5. Критерии приемки (Definition of Done)
- Реализована функция инъекции сбоя (disabling экспертов), которая работает без краша модели.
- Вычислены baseline метрики (loss, perplexity, entropy) и сохранены в файл.
- Проведены замеры для минимум 3 различных пар отключённых экспертов.
- Для каждой пары проверено graceful degradation по заданным критериям.
- Результаты визуализированы (графики деградации).
- Написан отчёт в формате markdown, включающий таблицу с метриками и вывод.
- Код оформлен в виде Python скрипта или ноутбука с комментариями.
- При повторном запуске результаты воспроизводимы (зафиксирован seed).
6. Ожидаемый результат
- Основной артефакт Файл
failure_injection_report.md(отчёт). - Сопроводительные файлы
baseline_metrics.jsondegradation_results.jsondegradation_plot.pngrun_injection.py(скрипт воспроизведения).
- Дополнительно (опционально): Запись в wandb/mlflow.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Не хватает GPU памяти для Mixtral | Использовать load_in_8bit, device_map="sequential", или уменьшить датасет до 10 сэмплов. Либо симулировать кастомную MoE. |
| Непонятно, как модифицировать forward | Через model.apply найти все эксперты и заменить их forward с помощью functools.partial. |
| Router не выбирает оставшиеся эксперты после отказа | Это и есть graceful degradation — модель перенаправляет запросы. Если происходит коллапс (выбирается только 1 эксперт), это проблема. |
| Метрики нестабильны из-за рандома | Установить torch.manual_seed(42), model.eval(). |
| Инъекция сбоя ломает автограф | Использовать torch.no_grad() при применении, но в режиме inference это не критично. |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Этап 1: Окружение и baseline | 30–45 мин |
| Этап 2: Реализация failure injection | 1–1.5 ч |
| Этап 3: Измерение degradation | 45–60 мин |
| Этап 4: Анализ graceful degradation | 30–45 мин |
| Этап 5: Оформление результатов | 30–45 мин |
| Итого | 3.5 – 5 ч |
Примечание: Для первого раза может потребоваться до +1 часа на отладку инъекции. Рекомендуется сначала симулировать на кастомной MoE.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| Вопрос 12 | Что такое graceful degradation в ML? |
| Вопрос 58 | Как внедрять fault injection в DL модели? |
| Вопрос 94 | Оценка влияния отказа экспертов в MoE |
| Вопрос 157 | Метрики для анализа отказоустойчивости |
| Вопрос 203 | Анализ энтропии routing при сбоях |
| Вопрос 311 | Best practices для postmortem AI-инцидентов |
| Вопрос 450 | Как симулировать отказ компонента в production? |
| Вопрос 512 | Сравнение hard и soft failure в MoE |
| Вопрос 678 | Инструменты для fault injection (Chaos Monkey для ML) |
| Вопрос 801 | Оценка degradation без полного падения системы |
10. Чек-лист самопроверки
- Я убедился, что до инъекции у меня есть baseline метрики.
- Я проверил, что модель не крашится при отключении 2 экспертов.
- Я протестировал как минимум 3 разные пары отключённых экспертов.
- Я построил график, показывающий зависимость perplexity от числа отключённых экспертов.
- Я зафиксировал seed для воспроизводимости.
- Я сохранил все результаты и отчёт в отдельную папку.
- Я написал вывод, является ли деградация graceful.