Passer à la navigation

Supervision Fine-Tuning dans NeMo RL

Afficher en Markdown

Ce document explique comment effectuer une SFT (Supervision Fine-Tuning) dans NeMo RL. Il décrit les opérations clés, notamment le lancement de runs SFT, la gestion des configurations d’expériences à l’aide de YAML, et l’intégration de jeux de données personnalisés qui répondent à la structure et aux attributs requis.

Lancer un Run SFT

Le script, examples/run_sft.py, peut être utilisé pour lancer une expérience. Ce script peut être lancé localement ou via Slurm. Pour plus de détails sur la configuration de Ray et le lancement d’un job Slurm, consultez la documentation du cluster.

Veillez à lancer le job en utilisant uv. La commande pour lancer un job SFT est la suivante :

uv run examples/run_sft.py --config <CHEMIN VERS LE CONFIG YAML> <REMPLACEMENTS>

Si non spécifié, config aura par défaut examples/configs/sft.yaml.

Exemple de Fichier de Configuration

NeMo RL permet aux utilisateurs de configurer des expériences à l’aide de fichiers de configuration yaml. Un exemple de fichier de configuration SFT se trouve ici.

Pour remplacer une valeur dans la configuration, modifiez soit directement la valeur dans le fichier yaml, soit passez le remplacement via la ligne de commande. Par exemple :

uv run examples/run_sft.py \
cluster.gpus_per_node=1 \
logger.wandb.name="sft-dev-1-gpu"

Rappel : N’oubliez pas de définir votre HF_HOME, WANDB_API_KEY, et HF_DATASETS_CACHE (si nécessaire). Vous devrez également effectuer un huggingface-cli login pour les modèles Llama.

Jeux de Données

Les jeux de données SFT dans NeMo RL sont encapsulés à l’aide de classes. Chaque classe de données SFT est censée avoir les attributs suivants :

  1. formatted_ds : Le dictionnaire des jeux de données formatés. Ce dictionnaire doit contenir les splits train et validation, et chaque split doit être conforme au format décrit ci-dessous.
  2. task_spec : Le TaskDataSpec pour ce jeu de données. Cela doit spécifier le nom que vous choisissez pour ce jeu de données.

Les jeux de données SFT sont censés suivre le format de chat Hugging Face. Consultez le document sur les jeux de données de chat pour plus de détails. Si vos données ne sont pas dans le bon format, écrivez simplement un script de prétraitement pour convertir les données dans ce format. data/hf_datasets/squad.py en a un exemple :

def format_squad(data):
return {
"messages": [
{
"role": "system",
"content": data["context"],
},
{
"role": "user",
"content": data["question"],
},
{
"role": "assistant",
"content": data["answers"]["text"][0],
},
]
}

NeMo RL SFT utilise des modèles de chat Hugging Face pour formater les exemples individuels. Trois types de modèles de chat sont supportés, qui peuvent être configurés via tokenizer.chat_template dans votre configuration yaml (voir sft.yaml pour un exemple) :

  1. Appliquer le modèle de chat par défaut du tokenizer. Pour utiliser le défaut du tokenizer, omettez soit tokenizer.chat_template de la configuration, soit définissez tokenizer.chat_template="default".

  2. Utiliser un modèle “passthrough” qui concatène simplement tous les messages. Ceci est souhaitable si le modèle de chat a été appliqué à votre jeu de données lors d’un prétraitement hors ligne. Dans ce cas, vous devez définir tokenizer.chat_template sur None comme suit :

    tokenizer:
    chat_template: NULL
  3. Utiliser un modèle personnalisé : Si vous souhaitez utiliser un modèle personnalisé, créez un modèle de chaîne au format jinja, et ajoutez cette chaîne à la configuration. Par exemple,

    tokenizer:
    custom_template: "{% for message in messages %}{%- if message['role'] == 'system' %}{{'Context : ' + message['content'].strip()}}{%- elif message['role'] == 'user' %}{{' Question : ' + message['content'].strip() + ' Réponse : '}}{%- elif message['role'] == 'assistant' %}{{message['content'].strip()}}{%- endif %}{% endfor %}"

Par défaut, NeMo RL prend en charge les jeux de données Squad et OpenAssistant. Ces deux jeux de données sont téléchargés depuis Hugging Face et prétraités à la volée, donc il n’est pas nécessaire de fournir un chemin vers des jeux de données sur le disque.

Ajouter un nouveau jeu de données est un processus simple. Tant que votre jeu de données personnalisé possède les attributs formatted_ds et task_spec décrits ci-dessus, il peut servir de remplacement direct pour Squad et OpenAssistant.

Évaluer le Modèle Entraîné

Une fois le processus d’entraînement terminé, vous pouvez vous référer à notre guide d’évaluation pour évaluer les capacités du modèle.