В тензорной основе EvoXпакетные тензорные вычислениянаходятся на уровне алгоритмического представления: они единообразно отображают кандидатов, оценки и состояние эволюционного цикла втензоры с пакетной размерностью, а затем передают их GPU-дружественным пакетным операторам и скомпилированному вычислительному графу. Цель предельно ясна — превратить «последовательную эволюцию отдельных особей» в «параллельную эволюцию всей популяции», чтобы вычислительная мощность работала на сам поиск, а не расходовалась на планирование и запуск.
I. Представление эволюционного процесса в виде тензоров
Если принять, что пакетная размерность N обозначает число кандидатов (особей), то три ключевых элемента эволюции напрямую выражаются в виде тензоров:
- Тензор кандидатов: популяция X организуется как [N × D], где D — число переменных решения одного кандидата.
- Тензор целей: цели и ограничения F организуются как [N × M], где M — число целевых/ограничительных членов; в многокритериальном случае каждая цель — это отдельный столбец F.
- Переменные состояния: номер поколения, текущий оптимум, размер шага и т. п. хранятся в скалярных или небольших тензорных буферах, а не записываются попиксельно через объекты Python.
Таким образом, скрещивание, мутация, отбор и оценка полностью обрабатываются пакетно по размерности N, и в эволюционном цикле больше не возникает ветвлений и управляющих потоков для отдельных особей.
II. Пакетные операторы: от N вызовов по одному кандидату к одной пакетной операции
Три минимальных сопоставимых выражения обрисовывают базовую форму пакетных операторов:
- Мутация: X′ = X + σ·randn(X) — вся партия кандидатов за одну пакетную операцию получает индивидуальные случайные возмущения, а σ управляет их интенсивностью.
- Отбор: idx = topk(F, k) — по приспособленности N кандидатов за один раз выбираются индексы первых k кандидатов.
- Оценка: Y = fθ(X) — один пакетный прямой проход или пакетная симуляция заменяет N вызовов по одному кандидату.
Ключ не в конкретном операторе, а в том, что все кандидаты совместно используют единый тензорный вычислительный граф: один пакетный вызов позволяет сократить накладные расходы интерпретатора и запуска ядер, заставляя вычислительную мощность GPU/многоядерных систем действительно работать на эволюционный поиск. Обработка ограничений и выхода за границы также может выполняться с помощью масок-тензоров в рамках той же пакетной операции, без отдельных ветвлений для конкретных кандидатов.
III. Оптимизация вычислительного графа и метрики пропускной способности
Если записать многопоколенную эволюцию в виде компилируемого графа потоков данных, можно дополнительно выжать производительность:Слияние операторовсокращает число запусков ядер,Внутрипакетный параллелизмобеспечивает одновременное выполнение всех кандидатов,Асинхронное выполнениепозволяет перекрывать вычисления и передачу данных,Переиспользование памятисокращает выделение промежуточных тензоров. Соответственно, метрики производительности также должны сместиться с «задержки одного шага» ккандидатов/с или поколений/спропускной способности — при пакетном выполнении один вызов обрабатывает всю партию кандидатов, и только общая пропускная способность реально отражает эффективность поиска.
