6. Устранение неполадок и оптимизация

6. Устранение неполадок и оптимизация

При использовании EvoX вы можете столкнуться с проблемами или захотеть тонко настроить свои алгоритмы. В этой главе описаны распространённые проблемы и их решения, а также стратегии отладки и советы по настройке производительности, которые помогут вам решить проблемы и оптимизировать работу.


6.1 Распространённые проблемы и решения

Вот некоторые часто встречающиеся проблемы и способы их решения:

(1) Ошибки установки или импорта:

  • Симптом: Ошибка при выполнении import evox.
  • Решение:
    • Проверьте установку: Выполните pip show evox для проверки. Если пакет не установлен, проверьте виртуальное окружение и переустановите.
    • Отсутствующие зависимости: Если вы видите ModuleNotFoundError: No module named 'torch', установите PyTorch, как описано в Главе 2.
    • Несоответствие CUDA: Убедитесь, что версия PyTorch соответствует установленным драйверам CUDA.

(2) GPU не используется:

  • Симптом: EvoX работает на CPU вместо GPU.
  • Решение:
    • Проверьте с помощью torch.cuda.is_available(). Если False, переустановите GPU-совместимый PyTorch и проверьте установку CUDA.
    • Если True, но EvoX всё ещё использует CPU, убедитесь, что ваши тензоры перемещены на GPU (см. Главу 3 для настройки).

(3) Нехватка памяти (RAM/VRAM):

  • Симптом: Вы видите OutOfMemoryError.
  • Решение:
    • Уменьшите размер популяции, размерность задачи или частоту оценки.
    • Используйте float16 (половинная точность) или разделение пакетной оценки.
    • Отключите режимы отладки/детерминизма в PyTorch.
    • Сохраняйте только статистику вместо полных фронтов Парето (для многоцелевых задач).
    • Обновление оборудования — окончательное решение проблем с памятью.

(4) Стагнация сходимости:

  • Симптом: Алгоритм застревает в локальном оптимуме.
  • Решение:
    • Увеличьте разнообразие популяции (например, повысьте частоту мутаций).
    • Попробуйте другие алгоритмы или параметры.
    • Убедитесь, что целевая функция хорошо определена (не слишком зашумлена или плоска).
    • Запустите несколько испытаний и выберите лучшее — EvoX упрощает параллельные запуски.

(5) Плохие результаты оптимизации:

  • Симптом: Конечные результаты ниже ожиданий.
  • Решение:
    • Проверьте определение задачи: Убедитесь, что приспособленность вычисляется правильно (например, знаки, масштабирование).
    • Соответствие алгоритма: Попробуйте другие или настройте гиперпараметры.
    • Используйте кривые сходимости:
      • Ранняя стабилизация -> преждевременная сходимость.
      • Колебания -> слишком высокая случайность.
    • Настройте параметры алгоритма и анализируйте поведение во времени.

(6) Конфликты бэкендов (JAX vs PyTorch):

  • Симптом: Случайно установлена JAX-версия EvoX при использовании примеров PyTorch.
  • Решение: По умолчанию pip install evox устанавливает версию PyTorch. Если вы установили JAX-версию, переустановите по инструкциям для PyTorch (см. Главу 2). Функции JAX документированы отдельно.

(7) Несоответствие версий:

  • Симптом: Вызовы API не соответствуют установленной версии.
  • Решение:
    • Обновления EvoX могут изменять имена методов (например, ask/tell -> step).
    • Используйте последнюю стабильную версию и обращайтесь к её документации.
    • Адаптируйте код к вашей версии EvoX или рассмотрите обновление.

6.2 Советы по отладке

Отладка эволюционных алгоритмов может быть сложной из-за их стохастической природы. Вот практические советы:

(1) Используйте тестирование малого масштаба:

  • Уменьшите размер популяции и количество итераций для упрощения отладки.
  • Пример: pop_size=5, iterations=20.
  • Это облегчает отслеживание поведения популяции и изоляцию проблем.

(2) Вставляйте операторы вывода:

  • Выводите приспособленность популяции, лучших особей и промежуточные значения.
  • Для больших тензоров выводите формы или используйте .tolist() для меньших.
  • Помогает понять сходимость и эффекты операторов.

(3) Используйте точки останова в IDE:

  • Используйте PyCharm или VS Code для установки точек останова внутри step() алгоритма или логики оценки.
  • Проверяйте значения переменных, содержимое тензоров или переходы состояний.
  • Будьте осторожны с большими тензорами — ограничьте то, что вы проверяете, чтобы избежать сбоев.

(4) Модульное тестирование пользовательских компонентов:

  • Тестируйте функции скрещивания/мутации отдельно.
  • Используйте синтетические входные данные для проверки форм выходных данных и логики перед полной интеграцией.

(5) Профилирование выполнения:

  • Используйте torch.autograd.profiler.profile или time.time() для измерения времени шагов.
  • Помогает найти узкие места или бесконечные циклы.
  • Определите, связаны ли замедления с оценкой или логикой алгоритма.

(6) Запись вывода в файл:

  • Записывайте логи в файлы .csv для длительных запусков.
  • Включайте лучшую приспособленность за поколение, статистику разнообразия и т.д.
  • Полезно, когда сбои не позволяют увидеть вывод в консоли.

В целом, отладка проектов EvoX требует баланса между проверками корректности и анализом результатов. Сначала сосредоточьтесь на обеспечении правильной работы алгоритма, затем оптимизируйте его эффективность.


6.3 Руководство по настройке производительности

Эти советы помогут вам выжать больше скорости и качества из EvoX:

(1) Постепенное масштабирование:

  • Начните с малого: Тестируйте логику с малыми входными данными.
  • Масштабируйте постепенно и наблюдайте, как увеличивается время выполнения.
  • Выявляйте неэффективности, если масштабирование нелинейно (например, 10x популяция -> >10x время).

(2) Мониторинг использования оборудования:

  • Используйте nvidia-smi для GPU, htop для CPU.
  • Высокая загрузка GPU (>50%) — идеально.
  • Низкая загрузка GPU может означать, что данные не на GPU или частые передачи CPU-GPU замедляют работу.

(3) Настройка параллелизма:

  • Установите потоки CPU: torch.set_num_threads(n).
  • Избегайте избыточной подписки при использовании многопоточных инструментов оценки.
  • Для GPU оптимизируйте потоки DataLoader, если используете пакетные среды или наборы данных.

(4) Используйте пакетную оценку:

  • Пакетная оценка быстрее, чем оценка по отдельным особям.
  • Всегда векторизуйте Problem.evaluate() для обработки целых популяций.

(5) Уменьшите накладные расходы Python:

  • Перенесите тяжёлую логику внутрь Algorithm или Problem, избегайте сложного кода Python в основном цикле.
  • Используйте workflow.step() для большинства операций.
  • Минимизируйте диагностику за поколение, если она замедляет запуски.

(6) Настройте выбор алгоритма:

  • Попробуйте CMA-ES, GA, PSO, RVEA и т.д. — ни один алгоритм не является лучшим для всех задач.
  • Быстрее сходящийся алгоритм может сэкономить больше времени, чем микрооптимизация медленно сходящегося.

Настройка производительности — итеративный процесс. С терпением вы можете перейти от часов выполнения к минутам. EvoX предоставляет множество «рычагов» — используйте их разумно для баланса скорости и качества решений.