13

Métodos esenciales del cálculo tensorial por lotes

AI999第4课:现代计算底座与张量化并行演化
00:00

En la base de tensorización de EvoX,el cálculo tensorial por lotesocupa la capa de expresión algorítmica: mapea de forma unificada los candidatos, las evaluaciones y los estados del bucle evolutivo atensores con una dimensión de lotey los entrega a operadores por lotes amigables con la GPU y a un grafo computacional compilado para su ejecución. El objetivo es muy claro: transformar la «evolución secuencial individuo por individuo» en una «evolución paralela de toda la población», de modo que la potencia de cómputo actúe realmente sobre la búsqueda en sí, y no se consuma en la planificación y el arranque.

Proceso evolutivo → Grafo de cálculo tensorial por lotesMétodos esenciales del cálculo tensorial por lotes① Organización en tensoresTensor de población X[N × D]Objetivos y restricciones F[N × M]Salida de evaluación Y[N × M]Estado evolutivoBúfer escalar o de tensor pequeño② Operadores por lotes (a lo largo de la dimensión N)MutaciónX′ = X + σ·randn(X)CruceRecombinación por emparejamiento a lo largo de NSelecciónidx = topk(F, k)EvaluaciónY = fθ(X)③ Optimización de compilación y rendimientoFusión de operadoresMenos lanzamientos de kernelParalelismo dentro del loteTodos los candidatos se ejecutan a la vezReutilización de memoriaLa reutilización de búferes reduce el costoEjecución asíncronaSuperposición de cálculo y transferenciaUn mismo grafo de operaciones tensorialesXOperador fusionadoFUna sola llamada por lotes gestiona todo el lote de candidatosMétrica de rendimientocandidatos/s · generaciones/sUna sola llamada por lotes gestiona todo el lote de candidatosSolo el rendimiento global refleja la verdadera eficiencia de la búsquedaLatencia de un solo pasocandidatos/sLa métrica cambia de marcha con la ejecución por lotes

I. Expresar el proceso evolutivo como tensores

Si se conviene que la dimensión de lote N representa el número de candidatos (individuos), los tres elementos de la evolución pueden plasmarse directamente como tensores:

  • Tensor de candidatos: la población X se organiza como [N × D], donde D es el número de variables de decisión de un candidato individual.
  • Tensor de objetivos: los objetivos y restricciones F se organizan como [N × M], donde M es el número de términos de objetivo/restricción; en el caso multiobjetivo, cada objetivo es una columna distinta de F.
  • Cantidades de estado: el número de generación, el mejor valor actual, el tamaño de paso, etc. se mantienen en búferes escalares o de tensores pequeños, en lugar de registrarse individuo por individuo con objetos de Python.

De este modo, el cruce, la mutación, la selección y la evaluación se procesan todos por lotes a lo largo de la dimensión N, y en el bucle evolutivo ya no aparecen ramificaciones ni flujos de control individuo por individuo.

II. Operadores por lotes: de N llamadas de un solo candidato a una sola operación por lotes

Tres expresiones mínimas comparables esbozan la forma básica de los operadores por lotes:

  • Mutación: X′ = X + σ·randn(X); todo el lote de candidatos recibe su propia perturbación aleatoria en una sola operación por lotes, y σ controla la intensidad de la perturbación.
  • Selección: idx = topk(F, k); a partir de la aptitud de los N candidatos se seleccionan de una vez los índices de los k mejores candidatos.
  • Evaluación: Y = fθ(X); se sustituyen N llamadas de un solo candidato por una sola pasada hacia adelante por lotes o una sola simulación por lotes.

Lo clave no es un operador concreto, sino que todos los candidatos compartan un mismo grafo de operaciones tensoriales: una sola llamada por lotes basta para reducir el costo del intérprete y el de los lanzamientos de kernel, haciendo que la potencia de la GPU/multinúcleo actúe de verdad sobre la búsqueda evolutiva. El tratamiento de restricciones y de valores fuera de rango también puede realizarse con tensores de máscara dentro de la misma operación por lotes, sin necesidad de ramificar por separado para candidatos concretos.

III. Optimización del grafo computacional y métricas de rendimiento

Expresar la evolución de varias generaciones como un grafo de flujo de datos compilable permite exprimir aún más el rendimiento:Fusión de operadoresreduce el número de lanzamientos de kernel,Paralelismo dentro del lotehace que todos los candidatos se ejecuten a la vez,Ejecución asíncronasolapa el cálculo con la transferencia de datos,Reutilización de memoriay reduce la asignación de tensores intermedios. En consecuencia, la métrica de rendimiento también debe pasar de la «latencia de un solo paso» alrendimiento de candidatos/s o generaciones/s: con la ejecución por lotes, cada llamada procesa todo el lote de candidatos, y solo el rendimiento global refleja de verdad la eficiencia de la búsqueda.

Error frecuente
No envuelvas los operadores por lotes en un bucle individuo por individuo: eso equivale a reintroducir el costo del intérprete y el de los lanzamientos de kernel, y la dimensión de lote pierde su sentido paralelo. El criterio es muy sencillo: en un paso evolutivo solo debe haber planificación a nivel de «lote», nunca a nivel de «individuo».