4. Расширенные возможности

4. Расширенные возможности

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

Пользовательская конфигурация

Настройки EvoX по умолчанию подходят для большинства ситуаций, но иногда вы можете захотеть настроить поведение или параметры фреймворка. Например:

  • Настройка параметров алгоритма: Помимо базового размера популяции и количества итераций, многие алгоритмы предоставляют расширенные параметры. Например, CMA-ES позволяет настроить начальную ковариационную матрицу, а NSGA-II предоставляет параметры расстояния скученности. Вы можете передавать параметры в конструктор алгоритма, например, GA(crossover_prob=0.9, mutation_prob=0.1) настраивает вероятности скрещивания и мутации в генетическом алгоритме. Настройка этих параметров может улучшить производительность. Обратитесь к документации EvoX для каждого API алгоритма, где перечислены доступные параметры и значения по умолчанию.

  • Замена компонентов операторов: Вы можете заменить внутренние эволюционные операторы (например, стратегии отбора или мутации). Некоторые классы алгоритмов поддерживают передачу пользовательских объектов операторов. Например, дифференциальная эволюция (DE) может поддерживать пользовательские операторы мутации, позволяя предоставить пользовательскую функцию или класс Operator. Модульный дизайн EvoX поддерживает такую замену в стиле «плагинов». Обычно это требует понимания внутренней работы алгоритма и не является необходимым для стандартных случаев использования.

  • Настройки многоцелевой оптимизации: Для многоцелевой оптимизации может потребоваться настройка предпочтений или весов — например, установка весовых векторов для методов взвешенной суммы или корректировка опорных точек во время эволюции. Эти настройки обычно доступны через параметры класса задачи или алгоритма. Например, problem = DTLZ2(d=12, m=3) определяет 12-мерную задачу с 3 целями. Некоторые алгоритмы позволяют передавать пользовательские опорные векторы. Чтение документации алгоритма помогает полностью использовать такие настройки.

  • Журналирование и вывод: EvalMonitor по умолчанию уже записывает ключевые метрики оптимизации. Если вам нужна дополнительная информация (например, разнообразие популяции или средняя приспособленность за поколение), вы можете настроить монитор или вести журнал вручную в цикле. Для длительных задач может потребоваться запись в файл. Это можно сделать с помощью библиотеки Python logging или простого файлового ввода-вывода для добавления результатов для последующего анализа.

Подводя итог, пользовательская конфигурация означает изменение поведения EvoX по умолчанию для конкретной задачи. Обычно это включает более глубокое использование API EvoX. Мы рассмотрим это подробнее в разделе разработка и расширение. Для начинающих просто запомните: EvoX предлагает гибкие интерфейсы, позволяющие опытным пользователям настраивать практически каждую деталь — но вы также можете использовать настройки по умолчанию и быстро получить результаты.

Управление плагинами

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

  • Плагин визуализации: EvoX включает модуль evox.vis_tools, содержащий подмодуль plot для построения графиков и поддерживающий формат журнала .exv для потоков данных в реальном времени. Для использования визуализации установите EvoX с дополнением vis: pip install evox[vis]. (Если не установлено изначально, можно установить позже или просто выполнить pip install plotly для удовлетворения зависимостей.) При использовании визуальных инструментов обычно вызываются функции построения графиков после записи данных монитором — например, EvalMonitor.plot() использует vis_tools.plot. Убедитесь, что этот плагин установлен, чтобы избежать ошибок из-за отсутствующих библиотек, таких как matplotlib.

  • Плагин нейроэволюции: EvoX поддерживает среды обучения с подкреплением (такие как физический движок Brax) и оптимизацию нейронных особей (нейроэволюция). Эти функции включены в расширение neuroevolution, устанавливаемое через pip install "evox[neuroevolution]". Это включает библиотеку Google Brax, Gym и другие. После установки вы можете использовать обёртки, такие как BraxProblem в evox.problems.neuroevolution, для превращения сред RL в задачи оптимизации. Также включены инструменты, такие как ParamsAndVector, для преобразования параметров моделей PyTorch в векторы для эволюции. Обратите внимание, что Brax работает только на Linux или Windows через WSL — нативный Python на Windows может работать только на CPU. Кратко, включение или отключение плагинов EvoX контролируется через установку конкретных дополнений.

  • Родственные проекты: EvoX имеет связанные проекты, такие как EvoRL (ориентированный на эволюционное обучение с подкреплением) и EvoGP (генетическое программирование с ускорением на GPU). Они разделяют философию дизайна и интерфейс EvoX. Если ваша задача связана с RL, вы можете предпочесть эти специализированные фреймворки. Управление этими плагинами означает обеспечение совместимости версий и удовлетворение зависимостей. Например, EvoRL использует JAX и Brax, а EvoGP может требовать библиотеки символьных деревьев. Эти библиотеки обычно могут сосуществовать без конфликтов. Думайте о них как о дополнительных инструментах, которые можно вызывать из основного проекта EvoX — или полностью исключить для облегчённой настройки.

  • Пользовательские плагины: Благодаря модульности EvoX вы можете создавать собственные «плагины». Например, создать пользовательский класс Monitor для отслеживания уникальных метрик или пользовательский подкласс Problem, оборачивающий сторонний симулятор. Это эффективно расширяет возможности EvoX. Лучшая практика — следовать контрактам интерфейсов EvoX — например, убедиться, что ваша пользовательская Problem имеет метод evaluate(), или что ваш пользовательский Monitor наследуется от базового класса. После тестирования вы даже можете внести его в будущие релизы EvoX.

В целом, управление плагинами в EvoX — это гибкое расширение и контроль зависимостей. Как начинающий, при установке вы можете решить, включать ли расширения vis и neuroevolution. Если не установлены изначально, их можно добавить позже. С плагинами вы можете легче отслеживать прогресс оптимизации и интегрировать EvoX с внешними инструментами для большей мощности.

Оптимизация производительности

Производительность — одно из главных преимуществ EvoX. Даже при использовании того же алгоритма поддержка GPU в EvoX может ускорить работу на несколько порядков. Однако для полного использования этого потенциала стоит следовать нескольким советам:

  • Используйте параллелизм GPU: Прежде всего убедитесь, что ваш код действительно работает на GPU. Как отмечалось ранее, установите PyTorch с поддержкой CUDA и переместите данные на устройства GPU. Если работа кажется медленной, проверьте с помощью torch.cuda.is_available() — должно возвращать True. Если GPU есть, но не используется, вероятно, тензоры были созданы на CPU по умолчанию. Исправьте это, явно установив device или убедившись, что входные тензоры (такие как lb/ub) находятся на CUDA. EvoX будет следовать устройству этих входных данных. На системах с несколькими GPU EvoX обычно использует один GPU на процесс. Для использования нескольких GPU можно запустить несколько процессов с разными GPU или дождаться будущей поддержки координированного выполнения на нескольких GPU.

  • Параллельная оценка: Ключевое узкое место в эволюционных алгоритмах — оценка приспособленности. Поскольку оценки часто независимы, их можно распараллелить. EvoX группирует оценки, когда это возможно — например, оценки нейронных сетей или полиномиальных функций могут вычисляться параллельно на GPU. Для пользовательских задач избегайте циклов Python — векторизуйте код оценки для обработки целого пакета кандидатов за раз. Это максимально использует параллельные возможности PyTorch. Проще говоря: сделайте функцию evaluate() вашей задачи работающей с пакетами — а не с отдельными решениями — для значительного ускорения.

  • Компиляция для оптимизации: PyTorch 2.0 представил torch.compile, который JIT-компилирует модели/функции для повышения производительности. Если ваша логика оценки сложна, рассмотрите компиляцию перед запуском:

    jit_state_step = torch.compile(workflow.step())

    Это может значительно улучшить производительность.

    Примечание:

Компиляция добавляет накладные расходы и не всегда поддерживается всеми функциями или задачами. Лучше всего подходит для крупномасштабных, длительных задач. На Windows убедитесь, что Triton установлен для работы torch.compile.

  • Настройка размера популяции: Большая популяция увеличивает разнообразие и способность глобального поиска — но также увеличивает вычисления за поколение. Балансируйте качество и скорость, настраивая pop_size. На GPU часто можно увеличить его без линейного роста времени (благодаря параллелизму). Но слишком большой размер может вызвать проблемы с памятью. Если заканчивается память GPU, уменьшите размер популяции или размерность задачи, или используйте FP16 для экономии места (установите через torch.set_float32_matmul_precision('medium')).

  • Уменьшение накладных расходов Python: EvoX переносит большинство основных вычислений на torch.Tensor, но пользовательские циклы или операторы должны избегать чрезмерных операций на уровне Python. Избегайте частых выводов (высокая стоимость ввода-вывода), списков или преобразований типов данных. Держите код векторизованным/тензоризованным для использования быстрых ядер C++/CUDA и уменьшения накладных расходов интерпретатора Python.

  • Распределённое развёртывание: Для сверхбольших задач рассмотрите запуск на нескольких машинах. EvoX поддерживает многоузловые конфигурации (через бэкенд-коммуникацию и шардинг). Хотя это не для начинающих, полезно знать о такой возможности. С кластером GPU обратитесь к документации EvoX по распределённому развёртыванию. Обычно нужно установить переменные окружения или запустить со специальными скриптами. Архитектура позволяет одному и тому же коду работать на одноузловых или многоузловых конфигурациях. Для первой попытки смоделируйте это несколькими процессами на одной машине.

  • Профилирование производительности: Для более глубокого анализа используйте инструменты, такие как профилировщик PyTorch или cProfile Python, для анализа узких мест. Это помогает определить, уходит ли время на оценку, отбор или что-то другое — чтобы вы могли оптимизировать соответственно (например, кэшируя повторяющиеся вычисления). EvoX создан для производительности, но реальные задачи могут иметь уникальные узкие места, требующие анализа.

Кратко, хотя EvoX уже оптимизирован на уровне архитектуры, пользователи могут дополнительно повысить производительность, правильно используя GPU, пакетные вычисления и настраивая параметры. Стремясь к скорости, также помните о поддержании качества результатов — баланс является ключевым. По мере углубления знакомства с EvoX настройка производительности станет второй натурой.