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, переустановите версию PyTorch, совместимую с GPU, и проверьте установку CUDA.
    • Если True, но EvoX все равно использует CPU, убедитесь, что ваши тензоры перенесены на GPU (см. конфигурацию в Главе 3).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(6) Логирование вывода в файл:

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

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


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

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

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

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

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

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

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

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

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

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

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

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

(6) Подбор алгоритма:

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

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