Interface de Génération
Interface de Génération
Ce document explique l’interface de génération de jetons et les différents backends pour le framework NeMo RL. Le système de génération est conçu avec une interface unifiée qui permet à différents backends (comme VLLM, Hugging Face, SGLang et TRT-LLM) de fournir des capacités de génération de jetons tout en respectant la même API.
Interface de Génération
Le cœur du système de génération est défini dans interfaces.py, qui établit une interface abstraite que tous les backends de génération doivent implémenter. Cela garantit la cohérence entre différentes implémentations et facilite le remplacement des backends sans modifier le code appelant.
Composants Clés
-
GenerationConfig : Un TypedDict qui définit la configuration pour la génération :
-
GenerationDatumSpec : Un TypedDict qui définit le format des données d’entrée :
-
GenerationOutputSpec : Un TypedDict qui définit le format des données de sortie :
-
GenerationInterface : Une classe de base abstraite que tous les backends de génération doivent implémenter :
Un principe de conception clé pour les backends de génération est qu’ils traitent les jetons directement, sans impliquer le tokenizer. En garantissant que seuls les jetons sont échangés, nous éliminons le risque d’incohérences provenant de différentes versions ou spécifications de tokenizer entre les frameworks d’entraînement et de génération.
Backend VLLM
Le backend VLLM (models/generation/vllm/vllm_generation.py) implémente la GenerationInterface pour fournir une génération de texte efficace à l’aide de la bibliothèque VLLM, optimisée pour les grands modèles de langage.
Classe VllmGeneration
La classe VllmGeneration est l’implémentation principale de la GenerationInterface pour VLLM. Elle effectue les fonctions suivantes :
- Configure les workers VLLM dans un environnement distribué à l’aide de Ray.
- Gère le cycle de vie de ces workers (initialisation, génération, arrêt).
- Distribue les entrées aux workers et collecte les sorties.
- Gère les mises à jour de poids et la synchronisation.
VllmGenerationWorker
Le VllmGenerationWorker est un acteur Ray qui :
- Initialise et gère une instance de modèle VLLM.
- Effectue la génération réelle sur un GPU.
- Supporte les mises à jour dynamiques de poids via des handles IPC.
- Implémente des mécanismes de sommeil/réveil pour une utilisation efficace des ressources.
Extensions VLLM Personnalisées
La classe UpdatableVllmInternalWorker dans vllm_backend.py étend le worker VLLM avec des capacités supplémentaires :
- Signalement des ID de périphériques pour permettre le mappage des workers sur des GPU spécifiques.
- Mise à jour des poids à partir de handles IPC pour un partage de poids efficace.
- Vérification de la mise à jour correcte des poids.
Exemple d’Utilisation
Pour utiliser un backend de génération :
Étendre avec de Nouveaux Backends
Pour ajouter un nouveau backend de génération :
- Créez une nouvelle classe qui implémente
GenerationInterface. - Implémentez les méthodes requises :
generate,prepare_for_generationetfinish_generation. - Assurez-vous que votre implémentation fonctionne avec les structures standard
GenerationConfigetGenerationDatumSpec. - Enregistrez votre backend avec le système (si nécessaire) pour le rendre accessible.
Cette conception modulaire permet une extension facile avec de nouveaux backends tout en maintenant une interface cohérente pour le reste du système.