- DeepEP est une bibliothèque de communication haute performance axée sur le parallélisme d’experts (EP) pour l’entraînement et l’inférence ML modernes, avec des kernels GPU all-to-all pour le dispatch/combine MoE et la prise en charge des basses précisions comme le FP8
- La version V2 refactorise entièrement l’EP pour offrir des performances équivalentes ou supérieures à V1 avec beaucoup moins de ressources SM, et remplace le backend NVSHMEM par un NCCL Gin plus léger
- Les tests, alignés sur une configuration V3, ont été réalisés avec 8K tokens par batch, hidden 7168, top 8 experts, dispatch FP8 et combine BF16 ; V2 atteint jusqu’à 1,3x de performance de pointe et jusqu’à 4x de réduction des SM par rapport à V1
- Tous les kernels sont compilés à l’exécution sous forme de modules JIT légers, sans compilation CUDA à l’installation, et V2 unifie les API haut débit et faible latence via une interface unique
ElasticBuffer
- Un GPU Hopper SM90, Python 3.8+, CUDA 12.3+, PyTorch 2.10+, NCCL 2.30.4+, NVLink et un réseau RDMA inter-nœuds sont requis ; Engram, PP et CP restent des fonctionnalités expérimentales
Ce que couvre DeepEP
- DeepEP (DeepEveryParallel) est une bibliothèque de communication haute performance pour l’entraînement et l’inférence en machine learning modernes
- Sa fonction centrale actuelle est le parallélisme d’experts (Expert Parallelism, EP), avec des kernels GPU all-to-all à haut débit et faible latence pour le dispatch et le combine des MoE
- Elle prend en charge la communication en basse précision, y compris le FP8
- Elle inclut aussi des primitives expérimentales pour le pipeline parallelism (PP), le context parallelism (CP) et l’accès mémoire distant (Engram)
- Tous les kernels sont compilés à l’exécution sous forme de modules JIT (Just-In-Time) légers, sans nécessiter de compilation CUDA lors de l’installation
- Malgré cette conception légère, l’objectif est d’atteindre, voire de dépasser, les limites de bande passante matérielle sur diverses configurations
Changements majeurs de la version V2
- V2 est une version qui refactorise entièrement l’Expert Parallelism
- Elle est conçue pour atteindre des performances extrêmes avec plusieurs fois moins de ressources SM que V1
- Elle prend en charge des domaines de scale-up et scale-out plus vastes
- Le backend passe de NVSHMEM à un backend NCCL Gin plus léger
- Les nouvelles fonctionnalités incluent :
- une compilation JIT complète
- un backend NCCL Gin léger, uniquement en en-tête
- la possibilité de réutiliser des communicateurs NCCL existants
- dans EPv2, l’unification des API haut débit et faible latence dans une interface unique
ElasticBuffer
- un nouveau layout GEMM
- la prise en charge de domaines de scale-up et scale-out plus grands, jusqu’à EP2048
- le calcul analytique du nombre de SM et de QP, supprimant le besoin d’auto-tuning
- le maintien de la prise en charge des modes hybride et direct
- dans un entraînement legacy de type V3, une réduction de l’usage des SM de 24 à 4~6, avec des performances équivalentes ou meilleures
- 0 SM Engram basé sur RDMA
- 0 SM PP basé sur RDMA
- 0 SM CP basé sur Copy Engine
Contraintes et fonctionnalités en cours
- V2 consomme davantage de taille de buffer que V1
- L’EP faible latence RDMA en 0 SM n’est plus pris en charge
- Engram, PP et CP sont des fonctionnalités expérimentales
- Les fonctionnalités en cours comprennent :
- des Elastic GPU & CPU buffers, un espace d’adressage virtuel continu mappant de façon mixte la mémoire physique GPU et CPU
- l’objectif est de permettre un Engram entièrement automatique et transparent, ou un EP déséquilibré
- un travail sur la gestion du déséquilibre de charge via l’EP replay et la réduction de la taille des buffers intermédiaires
- l’implémentation d’all-gather updates et de reduce-scatter pour DP et TP
- La documentation de V1 basée sur NVSHMEM est disponible dans docs/legacy.md
Résultats de performance
- Les tests ont été réalisés selon une configuration V3, avec les paramètres suivants :
- 8K tokens par batch
- dimension hidden 7168
- top 8 experts
- dispatch FP8
- combine BF16
- Principaux résultats :
- SM90, CX7, EP 8 x 2 : dispatch 90 GB/s RDMA, combine 81 GB/s RDMA, 12 SM
- SM90, CX7, EP 8 x 4 : dispatch 61 GB/s RDMA, combine 61 GB/s RDMA, 6 SM
- SM100, CX7, EP 8 x 2 : dispatch 90 GB/s RDMA, combine 91 GB/s RDMA, 12 SM
- SM100, EP 8 : dispatch 726 GB/s NVLink, combine 740 GB/s NVLink, 64 SM
- SM100, EP 8 : dispatch 643 GB/s NVLink, combine 675 GB/s NVLink, 24 SM
- Les valeurs mesurées sont une bande passante logique ; par exemple, les 90 GB/s de
EP 8 x 2 incluent le trafic de local rank
- V2 atteint jusqu’à 1,3x de performance de pointe et réduit jusqu’à 4x le nombre de SM par rapport à V1
- Les résultats pour des configurations EP plus grandes sont actuellement omis, et il est recommandé aux utilisateurs d’effectuer leurs propres benchmarks
- D’après l’expérience interne, les kernels devraient continuer à saturer la bande passante matérielle même à plus grande échelle
- Les données de performance de V1 se trouvent dans docs/legacy.md
Installation et prérequis
- Les prérequis sont les suivants :
- un GPU Hopper SM90 ou une architecture prenant en charge l’ISA PTX SM90
- Python 3.8 ou plus
- CUDA 12.3 ou plus pour GPU SM90
- PyTorch 2.10 ou plus
- NCCL 2.30.4 ou plus
- NVLink pour la communication intra-nœud
- un réseau RDMA pour la communication inter-nœuds
- Il est recommandé d’installer NCCL via pip pour que DeepEP puisse le détecter automatiquement dans l’environnement Python
pip install "nvidia-nccl-cu13>=2.30.4" --no-deps
- Pour la prise en charge des méthodes legacy, la bibliothèque dépend aussi de NVSHMEM ; voir les instructions dans le NVSHMEM Installation Guide
- Exemples de build et d’exécution des tests en développement :
python setup.py build
ln -s build/lib.linux-x86_64-cpython-38/deep_ep_cpp.cpython-38-x86_64-linux-gnu.so
python tests/elastic/test_ep.py
python tests/elastic/test_agrs.py
python tests/elastic/test_engram.py
python tests/elastic/test_pp.py
- L’installation s’effectue avec la commande suivante :
python setup.py install
- Après installation,
deep_ep peut être importé et utilisé dans un projet Python
Interface centrée sur ElasticBuffer
- Dans V2, toutes les opérations EP sont unifiées sous une interface unique
ElasticBuffer
- les API haut débit et faible latence y sont traitées de la même manière
- le buffer peut être initialisé en spécifiant directement la configuration MoE
- le nombre optimal de SM et de QP est calculé analytiquement
- Un exemple d’initialisation de buffer utilise
ElasticBuffer.get_buffer_size_hint() pour calculer la taille requise et vérifier si un buffer existant peut être réutilisé
- Lors de la création d’un nouveau buffer, on spécifie notamment
num_max_tokens_per_rank, hidden, num_topk, use_fp8_dispatch, etc.
_buffer.get_theoretical_num_sms(num_experts, num_topk) permet d’obtenir le nombre théorique de SM à utiliser pour le kernel de communication
- Dans les appels
dispatch et combine, il est possible de définir directement num_sms afin d’écraser la valeur calculée
Schémas d’usage pour l’entraînement, le prefill et le décodage
- En entraînement ou en prefill d’inférence, le MoE dispatch route les tokens vers l’expert correspondant sur tous les ranks
- il prend en charge les entrées BF16 et FP8
handle contient les métadonnées de routage nécessaires à l’appel combine ultérieur
handle.num_recv_tokens_per_expert_list fournit le nombre de tokens par expert nécessaire au GEMM
- Le backward pass du MoE dispatch est en pratique géré par
combine
- Le MoE combine réduit les sorties des experts vers leur rank d’origine
- Le backward pass du MoE combine est en pratique géré par
dispatch
- Le chevauchement entre communication et calcul est géré via l’interface
EventOverlap
- il permet d’exécuter des calculs indépendants pendant que la communication est en cours
- avant d’utiliser le résultat, il faut synchroniser le compute stream avec
event.current_stream_wait()
- Le même
ElasticBuffer est aussi utilisé pour le décodage en inférence
- quand la décision de gating ne change pas, les métadonnées de routage peuvent être réutilisées via
cached_handle
- ce schéma évite le recalcul du layout et la synchronisation CPU
Variables d’environnement et constantes figées à la compilation
- Paramètres généraux
EP_BUFFER_DEBUG : affiche les informations de débogage sur l’initialisation du buffer, l’approximation des SM et le backend
EP_SUPPRESS_NCCL_CHECK : supprime la vérification des incompatibilités de version NCCL
EP_AVOID_RECORD_STREAM : évite record_stream sur les tenseurs de sortie
EP_NUM_TOPK_IDX_BITS : redéfinit le nombre de bits pour l’encodage des index top-k
- Paramètres réseau
EP_NIC_NAME : nom de NIC par défaut utilisé pour interroger les propriétés, valeur par défaut mlx5_0
EP_OVERRIDE_RDMA_SL : redéfinit l’index service level RDMA
EP_DISABLE_GIN : désactive le backend NCCL Gin
- Paramètres JIT
EP_JIT_CACHE_DIR : répertoire de cache des kernels compilés, par défaut $HOME/.deep_ep
EP_JIT_NVCC_COMPILER : chemin du compilateur NVCC
EP_JIT_CPP_STANDARD : version du standard C++, par défaut 20
EP_JIT_DUMP_PTX, EP_JIT_DUMP_SASS, EP_JIT_DUMP_ASM : paramètres liés au dump des sorties PTX/SASS
- Certaines variables d’environnement ont un comportement persistent
- elles sont capturées à la compilation et intégrées comme valeurs par défaut dans le package installé
- ces valeurs par défaut s’appliquent automatiquement à l’import si elles ne sont pas redéfinies par les variables d’environnement courantes
- les variables concernées sont
EP_JIT_CACHE_DIR, EP_JIT_PRINT_COMPILER_COMMAND, EP_NUM_TOPK_IDX_BITS, EP_NCCL_ROOT_DIR
- Voir test_ep.py ou la documentation Python pour plus de détails
Recommandations de configuration réseau
- DeepEP a été entièrement testé sur des réseaux InfiniBand
- En théorie, il est aussi compatible avec RoCE (RDMA over Converged Ethernet)
- Isolation du trafic
- elle est prise en charge via les Virtual Lanes d’InfiniBand
- il est recommandé de séparer les workloads expert-parallel des autres workloads sur des virtual lanes différentes
- dans V2, l’affectation des virtual lanes peut être contrôlée via l’argument
sl_idx ou la variable d’environnement EP_OVERRIDE_RDMA_SL
- Adaptive routing
- il s’agit d’une fonction de routage avancée des switches InfiniBand qui répartit uniformément le trafic sur plusieurs chemins
- son activation est recommandée sous toutes les conditions de charge réseau, même si cela ajoute un peu de latence
- Congestion control
- il est recommandé de le désactiver, car il nuit à la bande passante maximale
- si la congestion est inévitable, il est recommandé d’affecter le workload concerné à une virtual lane de plus faible priorité
- PCI atomic mode
- si le matériel le prend en charge, il est recommandé de configurer
PCI_ATOMIC_MODE sur la NIC afin d’améliorer les performances des opérations atomiques RDMA
sudo mlxconfig -y -d mlx5_$i set PCI_ATOMIC_MODE=4
Branches expérimentales et forks communautaires
- Branches expérimentales
- Zero-copy : supprime les copies entre les tenseurs PyTorch et les buffers de communication, réduisant fortement l’usage des SM pour les kernels généraux
- Eager : utilise un protocole faible latence pour éliminer l’extra RTT latency ajoutée par les opérations atomiques RDMA
- Hybrid-EP : nouvelle implémentation backend utilisant les instructions TMA, avec usage minimal des SM, prise en charge de domaines NVLink plus grands, chevauchement fin communication/calcul en single-batch, kernels PCIe et prise en charge de NVFP4
- AntGroup-Opt : série d’optimisations réalisée par l’AntGroup Network Platform Department
- Mori-EP : prise en charge du mode faible latence ROCm/AMD GPU basée sur le backend MORI
- nvDev : branche basée sur V2 intégrant des fonctionnalités CUDA récentes comme Compute Fabric Transport
- Forks communautaires
- uccl/uccl-ep : prise en charge de l’exécution de DeepEP sur des GPU hétérogènes comme Nvidia et AMD, et des NIC comme EFA, Broadcom et CX7
- Infrawaves/DeepEP_ibrc_dual-ports_multiQP : ajoute une solution multi-QP et la prise en charge des NIC double port pour le transport IBRC
- antgroup/DeepXTrace : analyseur de diagnostic permettant de trouver efficacement et précisément les slow ranks
- ROCm/mori : bibliothèque de communication AMD de nouvelle génération pour les workloads IA sensibles aux performances, incluant Wide EP, transfert de KVCache et collectives
Licence et citation
- DeepEP V2 est construit sur le backend Gin de NCCL
- Le code du dépôt est publié sous licence MIT
- La référence de citation est
DeepEP: an efficient expert-parallel communication library, avec l’année 2025
1 commentaires
Avis sur Hacker News
Ils ont trouvé et utilisé une instruction PTX non documentée,
ld.global.nc.L1::no_allocate.L2::256B, pour obtenir des performances extrêmes.Cette instruction accède à la mémoire GPU volatile avec le modificateur PTX en lecture seule non cohérente
.nc, ce qui peut entraîner un comportement indéfini.Cela dit, sur l’architecture Hopper, il aurait été testé qu’elle garantit l’exactitude lorsqu’elle est utilisée avec
.L1::no_allocate, tout en offrant de bien meilleures performances.On a l’impression d’être un enfant dans une confiserie.
Il y a beaucoup d’astuces qu’il faudrait trop longtemps à rétro-ingénierer correctement à partir des seuls articles, et j’espère que les publications de cette semaine ouvriront une renaissance où les MoE deviennent les modèles académiques par défaut.
Depuis GPT-4, les premiers sont déjà tous des MoE, alors que les modèles publiés sont souvent des modèles denses, à l’exception de DeepSeek V3 et Mixtral.
On ne peut vraiment qu’aimer cette équipe.
Elle repousse les limites de l’open source pour tout le monde.
Pour voir un vrai modèle open source, regardez OLMo 2 d’AI2 : https://allenai.org/blog/olmo2
Ils partagent réellement tout ce qu’il faut pour reproduire le modèle, y compris les données elles-mêmes.
Le lien ci-dessus dit aussi : « Comme la science ouverte complète exige plus que des poids publics, nous sommes heureux de partager avec la communauté plus large de la modélisation du langage une nouvelle mise à jour d’OLMo comprenant les poids, les données, le code, les recettes, les checkpoints intermédiaires et des modèles affinés par instructions. »
Zuckerberg devrait arrêter de prétendre que Meta publie son IA en open source.
Ils diffusent même des publicités télévisées, mais en réalité ils ne publient que les poids, sans code.
La seule vraie IA open source, c’est DeepSeek.
Parce qu’ils n’ont pas publié les données.
Pour l’être, il faudrait utiliser une véritable licence open source, comme celles listées par l’OSI, et partager le code de pré-entraînement et de post-entraînement, le code lié au tuning, le code d’évaluation, tout ce qui concerne la sûreté et la censure, et probablement l’ensemble des données d’entraînement.
Sinon, il est impossible de reproduire les poids, et partager des poids revient un peu à partager un programme compilé.
À ma connaissance, le seul vrai modèle open source compétitif est OLMo 2 d’AI2 : https://allenai.org/blog/olmo2
Ils ont aussi récemment publié une app d’inférence sur appareil, elle aussi open source : https://allenai.org/blog/olmoe-app
Il y a aussi un autre modèle, Tülu 3, qui serait plus performant que DeepSeek V3 : https://allenai.org/blog/tulu-3-405B
Presque tout ce qu’il faut pour entraîner des LLM, y compris les techniques les plus récentes, s’y trouve.
Que faut-il de plus ? Des morceaux de code spécifiques à l’infrastructure de Meta ?
On est revenus au modèle FREEWARE / SHAREWARE.
C’est ce genre de vocabulaire qu’il faudrait utiliser pour les poids « publics ».
Elle fournit une communication all-to-all efficace et optimisée, avec prise en charge intra-nœud et inter-nœuds via NVLink et RDMA, des kernels à haut débit pour l’entraînement et le prefill d’inférence, des kernels à faible latence pour le décodage d’inférence, la prise en charge native du dispatch FP8, et un contrôle flexible des ressources GPU pour le recouvrement calcul-communication.
X : https://x.com/deepseek_ai/status/1894211757604049133
Les motivations derrière le travail de DeepSeek sont peut-être mauvaises.
Par exemple, cela pourrait être une tentative soutenue par l’État de réduire à zéro l’avantage des États-Unis en matière d’IA, mais l’effet net pour le reste du monde est tout simplement excellent.
Dans le pire des cas, même si c’est fait pour de mauvaises raisons, merci à DeepSeek : ils font réellement ce qu’OpenAI a menti pendant des années en prétendant faire pour le monde entier.
Publier cela en open source est-il plus « mal » qu’une interdiction d’exportation de GPU Nvidia haut de gamme ?
La publication open source de DeepSeek est probablement simplement une chose bénéfique à la fois pour le Parti communiste chinois, avec son accord, et pour la communauté open source IA au sens large ; il ne faut pas y voir une position de principe.
Trouver des moyens d’annuler l’avantage compétitif d’autres pays est une activité majeure de tous les gouvernements, grands comme petits.
C’est le deuxième round de publications open source sous licence MIT par la véritable entreprise Open AI™.
Une fois de plus, DeepSeek est plus ouvert que l’entreprise à 157 milliards de dollars qui prétend être « Open ».
Presque personne ne parle du Llama de Meta, mais tout le monde devrait s’attendre à ce que Llama 4 arrive avec des capacités de raisonnement.
L’objectif est de ne pas se faire écraser au milieu d’une course vers zéro.
Pendant que les États-Unis fouillent les reçus de GPU à Singapour pour vérifier si DeepSeek n’a utilisé que des H800, le reste du monde peut donc faire tourner ces optimisations sur de vrais H100 ?
Tout ça parce que les sanctions américaines rendaient les H100 difficiles à obtenir ou à utiliser, tout en continuant à faire comme si, par arrogance, les États-Unis croyaient que leurs ordres s’appliquaient au monde entier ?
C’est bien comme ça qu’il faut le comprendre ?
Le PTX que tout le monde attendait est-il inclus cette fois ?
csrc/kernels.Cherchez
asmpour trouver où il est utilisé.Ça me rappelle les années 80-90, quand les gens bidouillaient l’assembleur ou cherchaient des instructions non documentées pour tirer le maximum des CPU.
Un jour, les compilateurs seront probablement suffisamment optimisés, ou les GPU tellement puissants, pour que ce genre d’astuces ne fasse plus une grande différence, comme avec les CPU aujourd’hui.