В эволюционных вычисленияхразнообразие— обязательное условие эффективности алгоритма: только поддерживая достаточно большое число кандидатных решений, можно избежать того, что давление отбора слишком рано загонит популяцию в локальный оптимум. Но разнообразие одновременно означает огромный объём вычислений — за один запуск часто требуется оценить десятки тысяч и даже миллионы кандидатных решений. Когда кандидаты записаны в виде обычного массива объектов и поочерёдно отправляются на оценку в цикле, большая часть времени вычислений уходит на поэлементное планирование и управляющие потоки宿主-языка, а не на собственно численные операции. Именно в этом и заключаетсянизкая эффективность традиционного последовательного CPU-цикла при обработке десятков тысяч оценок кандидатов— его коренная причина.
Смена парадигмы представления: от списка кандидатов к тензоризованному вычислительному графу
EvoX приносит не локальное ускорение какого-либо оператора, аизменение способа представления эволюционного процесса: от поэлементной обработки кандидатов по одному к пакетным вычислениям, где тензор — полноправный участник. Множество кандидатов больше не разбросано по массиву объектов, а вместе с результатами оценки и состоянием алгоритма организовано в единый тензор, что позволяет им участвовать в вычислениях целиком.
- Тензор кандидатов: всё поколение кандидатов записывается в тензор формы [размер популяции, размерность решения]. При этом «один кандидат» — это всего лишь одна строка тензора, а не отдельный объект宿主-языка.
- Пакетные операторы: такие операции, как мутация, применяются напрямую ко всей популяции, и один вызов завершает обновление всех кандидатов, а не требует N вызовов в цикле.
- Пакетная оценка: в форме evaluate(тензор кандидатов) за один раз получаются результаты оценки всего поколения; единица измерения количества оценок меняется с «штуки» на «пакет».
- Вычислительный граф: отбор и обновление состояния перестают быть лишь последовательной управляющей логикой и становятся узлами графа, получая тем самым возможность компиляционной оптимизации — слияния операторов, параллельного планирования и т. п.
Сравнение двух способов записи
Списочная запись выглядит примерно так: поочерёдно извлечь кандидата, поочерёдно оценить, поочерёдно сравнить и обновить состояние — каждый шаг опирается на циклы宿主-языка, и целостная оптимизация затруднена. Тензоризованная запись такова: тензор кандидатов → мутация → оценка → отбор → обновление состояния; вся цепочка состоит из тензорных операций и выражена в виде вычислительного графа, для которого компилятор может выполнять слияние и планирование на устройствах. Обратите внимание: логика алгоритма (распределение мутаций, давление отбора) не была переписана — переписанспособ представления.
