English translation is not available yet. Showing Russian content.

Реализовать 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 модели — симулируем:

  1. Создать кастомную MoE сеть в PyTorch: 1 слой MLP с 8 экспертами (линейная + ReLU) и обучаемым router (softmax).
  2. Натренировать на синтетических данных (например, регрессия или классификация).
  3. После тренировки заморозить веса и запускать failure injection.

3. Технологический стек

КомпонентИнструментыНазначение
Модель MoEHugging Face transformers, PyTorchЗагрузка и работа с моделью
Failure injectionPython, патч forward-методаПринудительный выход из строя экспертов
Метрикиperplexity, cross_entropy_loss, entropy распределения маршрутизацииОценка degradation
Логированиеlogging, wandb или mlflowЗапись хода эксперимента
ДатасетDatasets от Hugging Face (WikiText, Alpaca)Тестовые данные
Мониторинг распределенияmatplotlib, seabornВизуализация баланса экспертов

4. Этапы выполнения

Этап 1: Окружение и baseline (30–45 минут)

Действия

  1. Установить зависимости

    pip install transformers torch datasets matplotlib wandb
    
  2. Загрузить модель и токенизатор

    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 или перейти к симуляции.

  3. Загрузить тестовый датасет (50 сэмплов):

    from datasets import load_dataset
    dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split="test")
    texts = dataset["text"][:50]
    
  4. Вычислить baseline метрики на датасете

    • Perplexity (через cross entropy loss)
    • Среднюю энтропию распределения маршрутизации по всем слоям
    • Количество активных экспертов на каждый токен

    Результат записать в файл baseline_metrics.json.

Ожидаемый результат этапа Файл с численными значениями метрик до инъекции.

Этап 2: Реализация failure injection (1–1.5 часа)

Действия

  1. Найти router слои в модели В Mixtral это model.layers[i].block_sparse_moe.gate. Создать функцию, которая:

    • Принимает номер эксперта (0–7)
    • Заменяет его выход на нулевой вектор (или очень малые значения, имитируя отказ)
    • Либо обнуляет gate веса для данного эксперта.
  2. Реализовать два сценария

    • Hard failure обнулить выходы эксперта (expert.output = lambda x: torch.zeros_like(x))
    • Soft failure добавить большой шум к выходам эксперта (чтобы router не выбирал его, но не падал)
  3. Написать функцию-декоратор для 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
    
  4. Проверить, что модель не крашится. Прогнать 1 батч с отключёнными 2 экспертами (например, 0 и 3).

Ожидаемый результат этапа Функция apply_failure(model, disabled_experts) работает без ошибок.

Этап 3: Измерение degradation (45–60 минут)

Действия

  1. Выбрать 3 комбинации отключённых экспертов

    • Наиболее популярные эксперты (по частоте использования)
    • Наименее популярные
    • Случайная пара
  2. Для каждой комбинации

    • Применить инъекцию сбоя
    • Прогнать тестовый датасет
    • Записать метрики: loss, perplexity, entropy routing, процент токенов, где упал выбор (не выбрано ни одного эксперта — ошибка)
    • Сравнить с baseline
  3. Построить графики

    • Degradation vs number of failed experts (можно расширить до 3,4)
    • Изменение энтропии маршрутизации (чем больше отключено экспертов, тем распределение становится более равномерным или наоборот)
  4. Записать все в файл degradation_results.json и/или wandb.

Ожидаемый результат этапа Таблица с метриками по каждой комбинации + визуализация (PNG/PDF).

Этап 4: Анализ graceful degradation (30–45 минут)

Действия

  1. Определить критерии graceful degradation

    • Perplexity выросла не более чем на 20% от baseline
    • Loss вырос не более чем на 0.3
    • Модель не выдала NaN или бесконечный loss
    • Средняя задержка выросла не более чем в 1.5 раза
  2. Проверить, выполняется ли каждый критерий для каждой комбинации.

  3. Сравнить с scenario полного отказа если отключить сразу 6 экспертов (из 8), то система должна показывать резкий рост loss (non-graceful).

  4. Записать вывод является ли система gracefully degradable по отношению к отказу 2 экспертов.

Ожидаемый результат этапа Краткий отчет (1-2 абзаца) с выводами.

Этап 5: Оформление результатов и postmortem (30–45 минут)

Действия

  1. Создать markdown-документ failure_injection_report.md

  2. Структура отчета

    # 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 экспертов.
    
  3. Опционально Записать воспроизводимый скрипт 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.json
    • degradation_results.json
    • degradation_plot.png
    • run_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: Окружение и baseline30–45 мин
Этап 2: Реализация failure injection1–1.5 ч
Этап 3: Измерение degradation45–60 мин
Этап 4: Анализ graceful degradation30–45 мин
Этап 5: Оформление результатов30–45 мин
Итого3.5 – 5 ч

Примечание: Для первого раза может потребоваться до +1 часа на отладку инъекции. Рекомендуется сначала симулировать на кастомной MoE.

9. Связанные вопросы из базы знаний

ВопросТема
Вопрос 12Что такое graceful degradation в ML?
Вопрос 58Как внедрять fault injection в DL модели?
Вопрос 94Оценка влияния отказа экспертов в MoE
Вопрос 157Метрики для анализа отказоустойчивости
Вопрос 203Анализ энтропии routing при сбоях
Вопрос 311Best 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.