View a markdown version of this page

Fine-tune Hugging Face LLMs avec LoRa et QLoRa - Deadline Cloud

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Fine-tune Hugging Face LLMs avec LoRa et QLoRa

Ce didacticiel vous explique comment affiner un modèle de langage causal Hugging Face avec Low-Rank Adaptation (LoRa) ou Adaptation quantifiée Low-Rank (QLoRa) sur un jeu de données d'instructions personnalisé. Vous soumettez le lot de tâches de réglage Hugging Face LoRa GitHub à un parc de GPU de votre ferme Deadline Cloud.

LoRa entraîne un petit adaptateur au-dessus d'un modèle de base figé au lieu de mettre à jour tous les poids du modèle. QLora fait de même tout en maintenant le modèle de base sous forme quantifiée 4 bits, ce qui réduit de moitié environ la mémoire GPU nécessaire et permet aux modèles plus grands de s'adapter à des GPU plus petits.

Le bundle utilise la bibliothèque de transformateurs Hugging Face, la bibliothèque de réglage fin efficace en termes de paramètres PEFT et la bibliothèque de quantification bitsandbytes pour effectuer un réglage fin efficace des paramètres. La sortie est un petit adaptateur LoRa (environ 50 à 200 Mo). Chargez-le au-dessus du modèle de base pour modifier le comportement du modèle. Utilisez-le pour enseigner au modèle un style d'écriture, une expertise dans un domaine, un format de sortie spécifique ou des connaissances exclusives.

Durée estimée : environ une heure, configuration comprise. La plupart des réglages LoRa pour les modèles 1B-7B sont effectués en 5 à 30 minutes d'entraînement.

L'exécution de ce didacticiel entraîne des frais pour les instances de travail GPU qui traitent la tâche.

Présentation de

Le flux de travail comporte quatre étapes. Vous préparez un jeu de données JSONL, vous soumettez la tâche Deadline Cloud pour qu'un utilisateur du GPU télécharge le jeu de données et exécute le réglage précis de QLora, vous téléchargez l'adaptateur avec et vous combinez l'adaptateur avec deadline job download-output le modèle de base pour une inférence locale.

Pour terminer ce didacticiel, procédez comme suit :

  1. Respectez les conditions préalables de .

  2. Configurez votre ferme.

  3. Préparez votre ensemble de données.

  4. Accordez au rôle de file d'attente l'accès à votre compartiment de jeux de données (ensembles de données S3 uniquement).

  5. Soumettez la tâche de réglage.

  6. Téléchargez et utilisez l'adaptateur entraîné.

  7. nettoyer les ressources.

Conditions préalables

Avant de commencer, vous avez besoin de ce qui suit :

  • La CLI Deadline Cloud GitHub est installée.

  • Un ensemble de données au format JSONL, soit dans un dossier local, soit chargé dans un compartiment Amazon S3 que le rôle de file d'attente peut lire.

  • (Facultatif) Un jeton Hugging Face, nécessaire uniquement si vous redirigez le bundle vers un modèle fermé (par exemple, Llama ou Gemma). Tous les modèles de la liste déroulante sont publics.

Configurez votre ferme

Vous avez besoin d'une ferme Deadline Cloud avec une GPU-enabled file d'attente (parc Linux, GPU NVIDIA avec 16 Go ou plus de RAM vidéo (VRAM)).

Le tableau suivant répertorie les recommandations relatives à la flotte par taille de modèle. QLoRa réduit de moitié les besoins en mémoire par rapport à la LoRa complète, et le bundle utilise par défaut QLoRa.

Recommandations relatives à la flotte
Taille du modèle Minimum de VRAM (QLoRa 4 bits) Instance Amazon EC2 suggérée

0,5 B À 1,5 B

8 Go

g5.xlarge(A10G) ou supérieur

3B À 7B

12 GO

g5.2xlarge(A10G), g6.xlarge (L4)

7B ET 14B

24 GO

g5.4xlarge(A10G 24 Go), g6.2xlarge (L4 24 Go)

14B ET 32B

48 GO

g6e.xlarge(L40S 48 Go), g5.12xlarge (4 × A10G 24 Go), g6.12xlarge (4 × L4 24 Go)

Note

Les instances multi-GPU de la dernière rangée fournissent quatre GPU de 24 Go au lieu d'un seul GPU avec 48 Go de VRAM. Le script d'entraînement du bundle charge le modèle avec le device_map="auto" paramètre Hugging Face, qui répartit les couches du modèle sur les GPU de l'instance. Pour un seul GPU avec 48 Go de VRAM, utilisez une g6e instance (L40S).

Préparez votre ensemble de données

L'ensemble de données est un fichier JSONL où chaque ligne est un objet JSON avec deux champs de texte. Les noms de champs par défaut sont instruction etoutput, et vous pouvez les configurer à l'aide InstructionColumn des ResponseColumn paramètres et.

Les lignes suivantes proviennent de l'ensemble de données d'échantillons Saffron Stack inclus dans le bundle :

{"instruction": "What is Saffron Stack's tagline?", "output": "Saffron Stack's tagline is 'Layered with love.'"} {"instruction": "How old is Saffron Stack?", "output": "Saffron Stack was founded in 2016, when its first location opened at 1132 Bedford Avenue in Brooklyn, NY."}

Le bundle accepte les données sous deux formes :

  • Dossier local (par défaut) — Le DatasetPath paramètre pointe vers un dossier local contenant un ou plusieurs .jsonl fichiers. Les pièces jointes aux tâches Deadline Cloud téléchargent automatiquement le dossier, et la tâche concatène plusieurs fichiers dans le dossier, y compris des sous-dossiers. La valeur par défaut est le sample_data/ dossier du bundle. Par conséquent, la soumission avec toutes les valeurs par défaut s'appuie sur les exemples de données inclus (un exemple de restaurant fictif nommé Saffron Stack).

  • URI Amazon S3 (remplacement facultatif)  : si vous définissez le DatasetS3Uri paramètre, le bundle est ignoré DatasetPath et est téléchargé depuis Amazon S3 à la place. Il accepte un seul fichier tel ques3://bucket/path/train.jsonl, ou un préfixe se terminant par / qui concatène tous les .jsonl fichiers qu'il contient. Le mode S3 nécessite que le rôle de session de la file d'attente soit s3:GetObject autorisé sur l'ensemble de données.

Le format du jeu de données est compatible avec de nombreux ensembles de données publics Hugging Face, y compris le jeu de données tatsu- sur Hugging Face et le lab/alpaca jeu de données databricks-dolly-15k sur Hugging Face, qui utilise des champs + (set). instruction response ResponseColumn=response

Accordez au rôle de file d'attente l'accès à votre compartiment de jeu de données

Les employés de Deadline Cloud exécutent des tâches dans le cadre du rôle de session de la file d'attente. Par défaut, ce rôle ne peut lire que les pièces jointes aux tâches de la file d'attente (compartiment Amazon S3). Si votre jeu de données se trouve ailleurs, vous devez accorder au rôle un accès en lecture. Si vous utilisez l'ensemble de données de dossiers locaux par défaut, ignorez cette section.

Pour accorder au rôle de file d'attente l'accès en lecture à votre jeu de données
  1. Créez un document de politique nommédatasets-policy.json, en remplaçant l'ARN de la ressource par votre compartiment et votre préfixe réels :

    { "Version": "2012-10-17", "Statement": [{ "Sid": "ReadFineTuningDatasets", "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::YOUR-BUCKET", "arn:aws:s3:::YOUR-BUCKET/datasets/*" ] }] }
  2. Associez la politique à votre rôle dans la file d'attente :

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-ID \ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam put-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets \ --policy-document file://datasets-policy.json

Vous pouvez également placer votre jeu de données sous le préfixe de bucket job-attachments existant de la file d'attente (DeadlineCloud/...) auquel le rôle a déjà accès.

Soumettre la tâche de mise au point

Pour envoyer à l'aide de l'interface utilisateur graphique, exécutez la commande suivante, remplissez le formulaire et choisissez Soumettre. L'interface graphique est organisée en sections démontables : Modèle, Ensemble de données, LoRa, Entraînement et Sortie.

deadline bundle gui-submit /path/to/hf_finetune_lora

Vous pouvez également soumettre via l'interface de ligne de commande :

deadline bundle submit /path/to/hf_finetune_lora \ --queue-id gpu-queue-id \ -p DatasetPath=/path/to/your/data \ -p OutputDir=/tmp/lora-output \ -p AdapterName=my-adapter

Le BaseModel paramètre est défini par défaut sur Qwen/Qwen2.5-7B et propose une liste déroulante de cinq modèles publics : Qwen2.5 (0,5B, 1,5B et 7B), et. Mistral-7B-v0.3 Phi-3.5-mini-instruct Pour affiner un modèle qui ne figure pas dans la liste, modifiez le allowedValues BaseModel paramètre dans le template.yaml fichier du bundle. Les hyperparamètres par défaut sont réglés pour la mémorisation des faits, qui correspond aux échantillons de données groupés. Pour les cas d'utilisation liés au transfert de style, une configuration plus légère entraîne plus rapidement :

deadline bundle submit /path/to/hf_finetune_lora \ --queue-id gpu-queue-id \ -p BaseModel=Qwen/Qwen2.5-1.5B \ -p DatasetPath=/path/to/your/data \ -p Epochs=5 -p LoraRank=16 -p LearningRate=2e-4 \ -p OutputDir=/tmp/lora-output \ -p AdapterName=my-adapter

Pour la liste complète des paramètres, y compris le rang LoRa, le taux d'apprentissage, la taille des lots et la longueur de séquence, consultez le tableau des paramètres clés dans l'exemple README sur. GitHub

Pour attendre la fin de la tâche, exécutez la commande suivante :

deadline job wait --job-id job-id --timeout 3600

Téléchargez et utilisez l'adaptateur entraîné

Pour télécharger et tester l'adaptateur
  1. Une fois la tâche terminée, téléchargez le résultat :

    deadline job download-output --job-id job-id

    L'adaptateur se retrouve à OutputDir/AdapterName/ et contient les poids LoRa (adapter_model.safetensors), la configuration PEFT (adapter_config.json), les métadonnées d'entraînement et les fichiers de tokenizer.

  2. Installez la pile d'inférence principale sur votre machine locale :

    pip install torch transformers peft

    Les outils de chat chargent le modèle de base complet, de sorte que votre machine a besoin de suffisamment de ressources pour l'exécuter. Un GPU est facultatif : sur un GPU NVIDIA, la valeur par défaut de pip CUDA-enabled PyTorch gère l'accélération ; sur un Mac Apple Silicon, utilise PyTorch automatiquement Metal (MPS) ; et CPU-only fonctionne mais est lent (environ 30 secondes par réponse pour un modèle 1,5 B).

  3. Testez l'adaptateur à l'aide de l'outil de chat interactif inclus :

    python3 inference/chat.py --adapter-path /path/to/downloaded/my-adapter

    L'outil charge l'adaptateur au-dessus du modèle de base et vous fournit un REPL dans lequel vous pouvez poser des questions et comparer avec le modèle de base pour vérifier les réglages effectués.

  4. Pour une interface utilisateur Web plus conviviale pour les démonstrations avec des bulles de discussion dans votre navigateur, installez Gdio et exécutez l'outil de chat Web :

    pip install gradio python3 inference/gradio_chat.py --adapter-path /path/to/downloaded/my-adapter

Pour plus de détails sur les deux outils et sur le chargement de l'adaptateur par programmation avec PEFT, consultez le README des outils d'inférence sur. GitHub

Conseils

  • La perte devrait diminuer de façon monotone. Si ce n'est pas le cas, réduisez le taux d'apprentissage (essayez1e-4).

  • Pression de la mémoire  : diminuez PerDeviceBatchSize (essayez 1 ou 2) et augmentez GradAccumSteps pour maintenir la taille de lot effective constante.

  • Le transfert de style et la mémorisation des faits diffèrent  : le transfert de style fonctionne souvent avec 3 à 5 époques et environ 50 à 200 échantillons. La mémorisation des faits nécessite 8 à 15 époques et plus d'échantillons par fait (5 à 8 phrasés).

  • Modèles sécurisés  : si vous redirigez le bundle vers un modèle fermé tel que Llama ou Gemma en l'ajoutant au allowedValues BaseModel paramètre, définissez le paramètre. HuggingFaceToken Pour la production, préférez définir HF_TOKEN comme variable d'environnement sur la file d'attente elle-même plutôt que de la transmettre en tant que paramètre.

  • Cache du modèle  : le bundle utilise /mnt/persistent/hf_cache par défaut ce qui se trouve sur le volume persistant du serveur de traitement. Le cache conserve les modèles de base pour toutes les tâches, de sorte que les exécutions suivantes sont beaucoup plus rapides.

Nettoyage

Pour éviter des frais récurrents, nettoyez les ressources que vous avez créées pour ce didacticiel :

Pour nettoyer les ressources du didacticiel
  1. Si vous avez créé un parc de GPU spécifiquement pour ce didacticiel, arrêtez-le ou supprimez-le. Si vous avez utilisé une flotte partagée préexistante, laissez-la en place.

  2. Si vous avez ajouté la ReadFineTuningDatasets politique à votre rôle de file d'attente et que vous n'en avez plus besoin, supprimez-la :

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-ID \ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam delete-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets
  3. Supprimez les fichiers de sortie locaux si vous n'en avez plus besoin.

Les ressources suivantes fournissent des informations supplémentaires :