4. Продвинутые возможности
EvoX предлагает множество продвинутых возможностей для решения более сложных задач. После ознакомления с основами, эта глава расскажет о том, как настраивать конфигурацию фреймворка, управлять дополнительными модулями плагинов и оптимизировать производительность, что позволит вам расширять и настраивать EvoX при необходимости.
Пользовательская конфигурация
Стандартные настройки EvoX подходят для большинства ситуаций, но иногда вам может потребоваться изменить поведение или параметры фреймворка. Например:
-
Настройка параметров алгоритма: Помимо базового размера популяции и количества итераций, многие алгоритмы предоставляют доступ к продвинутым параметрам. Например, CMA-ES позволяет настраивать начальную ковариационную матрицу, а NSGA-II открывает параметры расстояния скученности (crowding distance). Вы можете передавать параметры в конструктор алгоритма, например,
GA(crossover_prob=0.9, mutation_prob=0.1)настраивает вероятности скрещивания и мутации в Genetic Algorithm. Настройка этих параметров позволяет добиться более точной работы. Обратитесь к документации EvoX для API каждого алгоритма, где перечислены доступные параметры и их значения по умолчанию. -
Замена компонентов операторов: Вы можете заменять внутренние эволюционные операторы (например, стратегии селекции или мутации). Некоторые классы алгоритмов поддерживают передачу пользовательских объектов операторов. Например, Differential Evolution (DE) может поддерживать кастомные операторы мутации, позволяя вам предоставить собственную функцию или класс
Operator. Модульная архитектура EvoX поддерживает такую замену в стиле «плагинов». Обычно это требует понимания внутреннего устройства алгоритма и не является обязательным для стандартных сценариев использования. -
Настройки многокритериальной оптимизации: Для многокритериальной оптимизации вам может потребоваться настроить предпочтения или веса — например, задать векторы весов для методов взвешенной суммы или скорректировать референтные точки в процессе эволюции. Эти настройки обычно доступны через параметры в классе задачи или алгоритма. Например,
problem = DTLZ2(d=12, m=3)определяет 12-мерную задачу с 3 критериями. Некоторые алгоритмы позволяют передавать пользовательские референтные векторы. Изучение документации алгоритмов поможет вам в полной мере использовать такие настройки. -
Логирование и вывод: Стандартный
EvalMonitorуже записывает ключевые метрики оптимизации. Если вам нужна дополнительная информация (например, разнообразие популяции или средняя приспособленность в каждом поколении), вы можете настроить монитор или вести логи вручную внутри цикла. Для длительных задач может потребоваться запись в файл. Это можно сделать с помощью библиотеки Pythonloggingили простого файлового ввода-вывода для сохранения результатов для последующего анализа.
Подводя итог, пользовательская конфигурация означает изменение стандартного поведения EvoX для конкретной задачи. Обычно это подразумевает более глубокое использование API EvoX. Мы подробнее остановимся на этом в разделе разработка и расширение. Новичкам достаточно помнить: EvoX предлагает гибкие интерфейсы, которые позволяют опытным пользователям настраивать практически каждую деталь, но вы также можете придерживаться настроек по умолчанию и быстро получать результаты.
Управление плагинами
Под «плагинами» здесь понимаются дополнительные компоненты или модули расширения в EvoX, такие как инструменты визуализации, обертки для сред обучения с подкреплением (reinforcement learning) и родственные проекты в экосистеме 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 контролируется путем установки соответствующих дополнений (extras). -
Родственные проекты: У 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. -
Параллельное вычисление: Ключевым узким местом в эволюционных алгоритмах является оценка приспособленности (fitness evaluation). Поскольку оценки часто независимы, их можно распараллелить. EvoX объединяет вычисления в пакеты (batches), когда это возможно — например, вычисления нейронных сетей или полиномиальных функций могут выполняться параллельно на 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 настройка производительности станет для вас привычным делом.