Diffusers documentation

Inférence distribuée

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Inférence distribuée

L’inférence distribuée répartit la charge de travail sur plusieurs GPU. Elle est utile pour faire tenir des modèles plus volumineux en mémoire et pour traiter davantage de prompts simultanément.

Diffusers prend en charge quatre stratégies. Chacune dispose de son propre guide, et cette page vous aide à en choisir une.

Choisir une stratégie

Chaque stratégie résout un problème différent, choisissez donc celle qui correspond à la ressource qui vous limite.

StratégieSplitsRéduitLatence pour un seul promptLe plus adapté
Parallélisme de donnéesprompts entre les répliquesrien, car chaque GPU détient une copie complèteinchangéle modèle tient déjà et vous avez de nombreux prompts
device_mapcomposants sur les différents appareilsmémoire des poidslégèrement moins bonle modèle ne tient pas et l'interconnexion est lente
Parallélisme de contextela séquence d'entréemémoire d'activationlowerles séquences sont longues, comme des images haute résolution ou des vidéos
Parallélisme de tenseursmatrices de poidsmémoire des poidslowerles poids d’un composant ne tiennent pas et l’interconnexion est rapide

Quelques conseils pratiques :

  • Si le modèle tient déjà en mémoire et que vous avez de nombreux prompts, utilisez le parallélisme de données. Il augmente le débit en fonction du nombre de GPU sans modifier le modèle, et il laisse la latence des prompts unitaires inchangée. Configurez-le avec Accelerate ou PyTorch Distributed.
  • Si les poids d’un composant unique ne tiennent pas, essayez d’abord le parallélisme de tenseurs, car il réduit à la fois la mémoire et la latence. Le parallélisme de tenseurs communique à chaque frontière de bloc, il a donc besoin d’un interconnect rapide comme NVLink. Sur PCIe, le trafic par couche peut dépasser le calcul qu’il économise, et device_map devient alors le meilleur choix. device_map gère également le cas où les composants sont individuellement corrects mais collectivement trop volumineux.
  • Si ce sont les activations, et non les poids, qui posent problème, utilisez le parallélisme de contexte. Cela est utile pour les séquences longues, comme les grandes images et les vidéos avec de nombreuses images. Choisissez un backend à partir des benchmarks du guide Context parallelism.
  • Si les poids et la séquence sont tous deux trop volumineux, Diffusers ne peut pas appliquer le parallélisme de tenseurs et le parallélisme de contexte au même modèle. ParallelConfig lève une erreur si vous passez les deux configurations, et enable_parallelism ne peut pas être appelé une seconde fois sur un modèle déjà parallélisé.

Les intégrations communautaires xDiT et ParaAttention proposent leurs propres implémentations du parallélisme de contexte.

Update on GitHub