13

Méthodes fondamentales du calcul tensoriel par lots

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

Dans la base tensorielle d'EvoX,le calcul tensoriel par lotsse situe au niveau de l'expression algorithmique : il unifie les candidats, les évaluations et les états de la boucle évolutive en les projetant sous forme detenseurs dotés d'une dimension de lot, puis les confie à des opérateurs par lots adaptés au GPU et à un graphe de calcul compilé pour l'exécution. L'objectif est clair : transformer « l'évolution sérielle individu par individu » en « évolution parallèle de la population entière », afin que la puissance de calcul serve réellement la recherche elle-même plutôt que d'être absorbée par l'ordonnancement et le lancement des tâches.

Processus évolutif → Graphe de calcul tensoriel par lotsMéthodes fondamentales du calcul tensoriel par lots① Organisation tensorielleTenseur de population X[N × D]Objectifs et contraintes F[N × M]Sortie d'évaluation Y[N × M]État d'évolutionTampon scalaire ou petit tenseur② Opérateurs par lots (le long de la dimension N)MutationX′ = X + σ·randn(X)CroisementRecombinaison par paires le long de NSélectionidx = topk(F, k)ÉvaluationY = fθ(X)③ Optimisation de compilation et débitFusion d'opérateursMoins de lancements de noyauxParallélisme intra-lotTous les candidats exécutés simultanémentRéutilisation mémoireRéutilisation des tampons, moins de surcoûtExécution asynchroneChevauchement calcul et transfertUn même graphe d'opérations tensoriellesXOpérateur fusionnéFUn seul appel par lots traite toute la populationIndicateurs de débitCandidats/s · Générations/sUn seul appel par lots traite toute la populationSeul le débit global reflète la réelle efficacité de la rechercheLatence par étapeCandidats/sLes indicateurs changent de vitesse avec l'exécution par lots

I. Exprimer le processus évolutif sous forme tensorielle

En convenant que la dimension de lot N représente le nombre de candidats (individus), les trois éléments clés de l'évolution se traduisent directement en tenseurs :

  • Tenseur de candidats: la population X est organisée en [N × D], où D est le nombre de variables de décision d'un candidat.
  • Tenseur d'objectifs: les objectifs et contraintes F sont organisés en [N × M], où M est le nombre de termes objectif/contrainte ; en cas de multi-objectif, chaque objectif correspond à une colonne distincte de F.
  • Variables d'état: la génération, la meilleure valeur courante, le pas, etc. sont maintenus via des tampons scalaires ou de petits tenseurs, plutôt que consignés individu par individu dans des objets Python.

Ainsi, le croisement, la mutation, la sélection et l'évaluation sont tous traités par lots le long de la dimension N, et la boucle évolutive ne comporte plus de branchements ni de flux de contrôle individu par individu.

II. Opérateurs par lots : de N appels par candidat à une seule opération par lots

Trois expressions minimales, faciles à comparer, esquissent la forme fondamentale des opérateurs par lots :

  • Mutation: X′ = X + σ·randn(X), toute la population de candidats reçoit ses perturbations aléatoires en une seule opération par lots, σ contrôle l'intensité de la perturbation.
  • Sélection: idx = topk(F, k), sélectionne en une seule fois les indices des k meilleurs candidats parmi les aptitudes des N candidats.
  • Évaluation: Y = fθ(X), remplace N appels par candidat par une seule passe avant groupée ou une seule simulation par lots.

L'essentiel ne réside pas dans un opérateur précis, mais dans le fait que tous les candidats partagent un même graphe d'opérations tensorielles : un seul appel par lots permet de réduire la surcharge de l'interpréteur et celle du lancement des noyaux, faisant ainsi servir réellement la puissance du GPU ou du calcul multicœur à la recherche évolutive. La gestion des contraintes et des dépassements de bornes peut également s'effectuer au sein de la même opération par lots à l'aide de tenseurs de masque, sans branchement spécifique pour certains candidats.

III. Optimisation du graphe de calcul et indicateurs de débit

Écrire l'évolution sur plusieurs générations sous forme de graphe de flux de données compilable permet d'extraire davantage de performances :Fusion d'opérateursréduit le nombre de lancements de noyaux,Parallélisme intra-lotfait exécuter tous les candidats simultanément,Exécution asynchronefait se chevaucher calcul et transfert de données,Réutilisation mémoireréduit l'allocation de tenseurs intermédiaires. En conséquence, les indicateurs de performance doivent aussi passer de la « latence par étape » audébit en candidats/s ou générations/s: en exécution par lots, un seul appel traite toute la population de candidats, et seul le débit global reflète réellement l'efficacité de la recherche.

Erreur fréquente
N'encapsulez pas les opérateurs par lots dans une boucle individu par individu : cela revient à réintroduire la surcharge de l'interpréteur et celle du lancement des noyaux, et la dimension de lot perd alors tout sens en termes de parallélisme. Le critère est simple : dans une étape évolutive, l'ordonnancement ne doit comporter qu'un niveau « lot », sans niveau « individu ».