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
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
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 :
-
Respectez les conditions préalables de .
-
Configurez votre ferme.
-
Préparez votre ensemble de données.
-
Accordez au rôle de file d'attente l'accès à votre compartiment de jeux de données (ensembles de données S3 uniquement).
-
Soumettez la tâche de réglage.
-
Téléchargez et utilisez l'adaptateur entraîné.
-
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.
| Taille du modèle | Minimum de VRAM (QLoRa 4 bits) | Instance Amazon EC2 suggérée |
|---|---|---|
0,5 B À 1,5 B |
8 Go |
|
3B À 7B |
12 GO |
|
7B ET 14B |
24 GO |
|
14B ET 32B |
48 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
DatasetPathparamètre pointe vers un dossier local contenant un ou plusieurs.jsonlfichiers. 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 lesample_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
DatasetS3Uriparamètre, le bundle est ignoréDatasetPathet 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.jsonlfichiers qu'il contient. Le mode S3 nécessite que le rôle de session de la file d'attente soits3:GetObjectautorisé 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 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
-
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/*" ] }] } -
Associez la politique à votre rôle dans la file d'attente :
QUEUE_ROLE=$(aws deadline get-queue --farm-idFARM-ID--queue-idQUEUE-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-idgpu-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-idgpu-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-idjob-id--timeout 3600
Téléchargez et utilisez l'adaptateur entraîné
Pour télécharger et tester l'adaptateur
-
Une fois la tâche terminée, téléchargez le résultat :
deadline job download-output --job-idjob-idL'adaptateur se retrouve à
et contient les poids LoRa (OutputDir/AdapterName/adapter_model.safetensors), la configuration PEFT (adapter_config.json), les métadonnées d'entraînement et les fichiers de tokenizer. -
Installez la pile d'inférence principale sur votre machine locale :
pip install torch transformers peftLes 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).
-
Testez l'adaptateur à l'aide de l'outil de chat interactif inclus :
python3 inference/chat.py --adapter-path/path/to/downloaded/my-adapterL'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.
-
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 (essayez
1e-4). -
Pression de la mémoire : diminuez
PerDeviceBatchSize(essayez 1 ou 2) et augmentezGradAccumStepspour 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
allowedValuesBaseModelparamètre, définissez le paramètre.HuggingFaceTokenPour la production, préférez définirHF_TOKENcomme 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_cachepar 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
-
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.
-
Si vous avez ajouté la
ReadFineTuningDatasetspolitique à votre rôle de file d'attente et que vous n'en avez plus besoin, supprimez-la :QUEUE_ROLE=$(aws deadline get-queue --farm-idFARM-ID--queue-idQUEUE-ID\ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam delete-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets -
Supprimez les fichiers de sortie locaux si vous n'en avez plus besoin.
Ressources connexes
Les ressources suivantes fournissent des informations supplémentaires :