🦙Tutoriel : Comment affiner Llama-3 et l'utiliser dans Ollama
Guide du débutant pour créer un assistant personnel personnalisé (comme ChatGPT) à exécuter localement sur Ollama
À la fin de ce tutoriel, vous créerez un chatbot personnalisé en affinant Llama-3 avec Unsloth gratuitement. Il peut fonctionner localement via Ollama sur votre PC, ou dans une instance GPU gratuite via Google Colab. Vous pourrez interagir avec le chatbot de manière interactive comme ci-dessous :

Unsloth rend l'affinage beaucoup plus facile, et peut automatiquement exporter le modèle affiné vers Ollama avec création automatique intégrée Fichier de modèle ! Si vous avez besoin d'aide, vous pouvez rejoindre notre serveur Discord : https://discord.com/invite/unsloth
Si vous souhaitez copier ou enregistrer le code, tout est disponible dans notre carnet Colab Ollama. Vous pouvez l'utiliser directement là-bas ou l'adapter pour votre configuration locale : https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb
1. Qu'est-ce qu'Unsloth ?
Unsloth rend l'affinage des LLMs comme Llama-3, Mistral, Phi-3 et Gemma 2x plus rapide, utilise 70 % de mémoire en moins, et sans dégradation de précision ! Nous utiliserons Google Colab qui fournit un GPU gratuit pendant ce tutoriel. Vous pouvez accéder à nos carnets gratuits ci-dessous :
Ollama Llama-3 Alpaca (carnet que nous utiliserons)
Vous devrez aussi vous connecter à votre compte Google !

2. Qu'est-ce qu'Ollama ?
Ollama vous permet d'exécuter des modèles de langage depuis votre propre ordinateur de façon rapide et simple ! Il lance discrètement un programme qui peut exécuter un modèle de langage comme Llama-3 en arrière-plan. Si vous souhaitez soudainement poser une question au modèle de langage, vous pouvez simplement soumettre une requête à Ollama, et il vous renverra rapidement les résultats ! Nous utiliserons Ollama comme moteur d'inférence !

3. Installer Unsloth

Si vous n'avez jamais utilisé un carnet Colab, un bref aperçu du carnet lui-même :
Bouton Lecture sur chaque "cellule". Cliquez dessus pour exécuter le code de cette cellule. Vous ne devez sauter aucune cellule et vous devez exécuter chaque cellule dans l'ordre chronologique. Si vous rencontrez des erreurs, réexécutez simplement la cellule que vous n'avez pas exécutée auparavant. Une autre option est d'appuyer sur CTRL + ENTER si vous ne voulez pas cliquer sur le bouton lecture.
Bouton Runtime dans la barre d'outils en haut. Vous pouvez aussi utiliser ce bouton et sélectionner "Exécuter tout" pour exécuter l'ensemble du carnet en une fois. Cela sautera toutes les étapes de personnalisation et peut être un bon premier essai.
Bouton Se connecter / Reconnecter T4. Vous pouvez cliquer ici pour des statistiques système plus avancées.
La première cellule d'installation ressemble à ceci : N'oubliez pas de cliquer sur le bouton LIRE dans les crochets [ ]. Nous récupérons notre package open source sur Github et installons quelques autres packages.

4. Sélection d'un modèle à affiner
Sélectionnons maintenant un modèle pour l'affinage ! Nous avons choisi par défaut Llama-3 de Meta / Facebook qui a été entraîné sur pas moins de 15 000 milliards de "tokens". Supposez qu'un token soit comme un mot anglais. Cela représente environ 350 000 encyclopédies épaisses ! D'autres modèles populaires incluent Mistral, Phi-3 (entraîné en utilisant la sortie de GPT-4) et Gemma de Google (13 billions de tokens !).
Unsloth prend en charge ces modèles et bien d'autres ! En fait, tapez simplement un modèle depuis le hub Hugging Face pour voir s'il fonctionne ! Nous renverrons une erreur s'il ne fonctionne pas.

Il y a 3 autres paramètres que vous pouvez basculer :
Cela détermine la longueur de contexte du modèle. Gemini par exemple a une longueur de contexte de plus d'un million, tandis que Llama-3 a une longueur de contexte de 8192. Nous vous permettons de choisir N'IMPORTE quel nombre - mais nous recommandons de le régler à 2048 pour des tests. Unsloth prend également en charge l'affinage sur de très longs contextes, et nous montrons que nous pouvons offrir des longueurs de contexte 4x plus longues que le meilleur.
Laissez ceci à None, mais vous pouvez sélectionner torch.float16 ou torch.bfloat16 pour les GPU plus récents.
Nous effectuons l'affinage en quantification 4 bits. Cela réduit l'utilisation de la mémoire par 4, nous permettant de réaliser l'affinage sur un GPU avec 16 Go de mémoire gratuit. La quantification 4 bits convertit essentiellement les poids en un ensemble limité de nombres pour réduire l'utilisation de la mémoire. Un inconvénient est une dégradation de précision de 1 à 2 %. Réglez cela sur False sur des GPU plus grands comme les H100 si vous voulez ce petit supplément de précision.

Si vous exécutez la cellule, vous obtiendrez quelques impressions de la version d'Unsloth, du modèle que vous utilisez, de la quantité de mémoire de votre GPU, et d'autres statistiques. Ignorez cela pour l'instant.
5. Paramètres pour l'affinage

Maintenant, pour personnaliser votre affinage, vous pouvez modifier les nombres ci-dessus, mais vous pouvez l'ignorer, puisque nous avons déjà sélectionné des valeurs assez raisonnables.
Le but est de modifier ces nombres pour augmenter la précision, mais aussi contrebalancer le surapprentissage. Le surapprentissage survient lorsque vous faites mémoriser au modèle de langage un jeu de données, et qu'il n'est plus capable de répondre à des questions nouvelles. Nous voulons qu'un modèle final réponde à des questions inédites, et n'effectue pas de mémorisation.
Le rang du processus d'affinage. Un nombre plus grand utilise plus de mémoire et sera plus lent, mais peut augmenter la précision sur des tâches plus difficiles. Nous suggérons généralement des nombres comme 8 (pour des affinages rapides), et jusqu'à 128. Des nombres trop grands peuvent provoquer du surapprentissage, nuisant à la qualité de votre modèle.
Nous sélectionnons tous les modules à affiner. Vous pouvez en supprimer certains pour réduire l'utilisation de la mémoire et accélérer l'entraînement, mais nous le déconseillons fortement. Entraînez simplement tous les modules !
Le facteur d'échelle pour l'affinage. Un nombre plus grand fera en sorte que l'affinage apprenne davantage votre jeu de données, mais peut favoriser le surapprentissage. Nous suggérons que cela soit égal au rang
r, ou le double.Laissez ceci à 0 pour un entraînement plus rapide ! Peut réduire le surapprentissage, mais pas énormément.
Laissez ceci à none pour un entraînement plus rapide et moins sujet au surapprentissage !
Les options incluent
True,Falseet"unsloth". Nous suggérons"unsloth"puisque nous réduisons l'utilisation de la mémoire d'un extra 30 % et prenons en charge des affinages sur des contextes extrêmement longs. Vous pouvez lire ici : https://unsloth.ai/blog/long-context pour plus de détails.Le nombre pour déterminer les exécutions déterministes. L'entraînement et l'affinage nécessitent des nombres aléatoires, donc fixer ce nombre rend les expériences reproductibles.
Fonctionnalité avancée pour définir le
lora_alpha = 16automatiquement. Vous pouvez l'utiliser si vous le souhaitez !Fonctionnalité avancée pour initialiser les matrices LoRA sur les r vecteurs singuliers principaux des poids. Peut améliorer quelque peu la précision, mais peut faire exploser l'utilisation de la mémoire au départ.
6. Jeu de données Alpaca

Nous allons maintenant utiliser le jeu de données Alpaca créé en appelant GPT-4 lui-même. C'est une liste de 52 000 instructions et sorties qui a été très populaire lors de la sortie de Llama-1, car elle a permis à l'affinage d'un LLM de base d'être compétitif avec ChatGPT lui-même.
Vous pouvez accéder à la version GPT4 du jeu de données Alpaca ici : https://huggingface.co/datasets/vicgalle/alpaca-gpt4. Une première version plus ancienne du jeu de données est ici : https://github.com/tatsu-lab/stanford_alpaca. Ci-dessous quelques exemples du jeu de données :

Vous pouvez voir qu'il y a 3 colonnes dans chaque ligne - une instruction, une entrée et une sortie. Nous combinons essentiellement chaque ligne en 1 grande invite comme ci-dessous. Nous utilisons ensuite cela pour affiner le modèle de langage, et cela l'a rendu très similaire à ChatGPT. Nous appelons ce processus affinage supervisé par instruction.

7. Plusieurs colonnes pour l'affinage
Mais un gros problème pour les assistants de type ChatGPT est que nous n'autorisons qu'une instruction / une invite, et pas plusieurs colonnes / entrées. Par exemple dans ChatGPT, vous devez soumettre 1 invite, et non plusieurs invites.

Cela signifie essentiellement que nous devons "fusionner" plusieurs colonnes en 1 grande invite pour que l'affinage fonctionne réellement !
Par exemple, le très célèbre jeu de données Titanic contient de nombreuses colonnes. Votre travail était de prédire si un passager a survécu ou est décédé en fonction de son âge, de sa classe de passager, du prix du billet, etc. Nous ne pouvons pas simplement transmettre cela à ChatGPT, mais plutôt, nous devons "fusionner" ces informations en 1 grande invite.

Par exemple, si nous demandons à ChatGPT avec notre invite unique "fusionnée" qui inclut toutes les informations pour ce passager, nous pouvons ensuite lui demander de deviner ou de prédire si le passager est décédé ou a survécu.

D'autres bibliothèques d'affinage exigent que vous prépariez manuellement votre jeu de données pour l'affinage, en fusionnant toutes vos colonnes en 1 invite. Dans Unsloth, nous fournissons simplement la fonction appelée to_sharegpt qui fait cela en une seule fois !
Pour accéder au carnet d'affinage Titanic ou si vous voulez téléverser un fichier CSV ou Excel, allez ici : https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing

Ceci est un peu plus compliqué, car nous autorisons beaucoup de personnalisations, mais il y a quelques points :
Vous devez entourer toutes les colonnes avec des accolades
{}. Ce sont les noms de colonnes dans le fichier CSV / Excel réel.Les composants de texte optionnels doivent être entourés de
[[]]. Par exemple si la colonne "input" est vide, la fonction de fusion n'affichera pas le texte et l'ignorera. C'est utile pour les jeux de données avec des valeurs manquantes.Sélectionnez la colonne de sortie ou la colonne cible / prédiction dans
output_column_name. Pour le jeu de données Alpaca, ce seraoutput.
Par exemple dans le jeu de données Titanic, nous pouvons créer un grand format d'invite fusionnée comme ci-dessous, où chaque colonne / morceau de texte devient optionnel.

Par exemple, imaginez que le jeu de données ressemble à ceci avec beaucoup de données manquantes :
S
23
18
7.25
Ensuite, nous ne voulons pas que le résultat soit :
Le passager a embarqué depuis S. Son âge est de 23 ans. Son tarif est VIDE.
Le passager a embarqué depuis VIDE. Son âge est de 18 ans. Son tarif est de 7,25 $.
Au lieu de cela, en entourant optionnellement les colonnes avec [[]], nous pouvons exclure entièrement cette information.
[[Le passager a embarqué depuis S.]] [[Son âge est de 23 ans.]] [[Son tarif est VIDE.]]
[[Le passager a embarqué depuis VIDE.]] [[Son âge est de 18 ans.]] [[Son tarif est de 7,25 $.]]
devient :
Le passager a embarqué depuis S. Son âge est de 23 ans.
Son âge est de 18 ans. Son tarif est de 7,25 $.
8. Conversations multi-tours
Un petit problème si vous ne l'avez pas remarqué est que le jeu de données Alpaca est à tour unique, tandis que rappelez-vous que l'utilisation de ChatGPT était interactive et que vous pouvez discuter en plusieurs tours. Par exemple, la gauche est ce que nous voulons, mais la droite, qui est le jeu de données Alpaca, ne fournit que des conversations singulières. Nous voulons que le modèle de langage affiné apprenne d'une manière ou d'une autre à faire des conversations multi-tours comme ChatGPT.

Ainsi nous avons introduit le conversation_extension paramètre, qui sélectionne essentiellement quelques lignes aléatoires dans votre jeu de données à tour unique, et les fusionne en 1 conversation ! Par exemple, si vous le réglez à 3, nous sélectionnons au hasard 3 lignes et les fusionnons en 1 ! Les définir trop longs peut ralentir l'entraînement, mais peut améliorer considérablement votre chatbot et l'affinage final !

Ensuite, définissez output_column_name sur la colonne de prédiction / sortie. Pour le jeu de données Alpaca, ce serait la colonne output.
Nous utilisons ensuite la standardize_sharegpt fonction pour simplement mettre le jeu de données dans un format correct pour l'affinage ! Appelez toujours ceci !

9. Modèles de chat personnalisables
Nous pouvons maintenant spécifier le modèle de chat pour l'affinage lui-même. Le format Alpaca très célèbre est ci-dessous :

Mais rappelez-vous que nous avons dit que c'était une mauvaise idée parce que les affinages de style ChatGPT n'acceptent qu'une seule invite ? Puisque nous avons réussi à fusionner toutes les colonnes du jeu de données en 1 en utilisant Unsloth, nous pouvons essentiellement créer le modèle de chat de style ci-dessous avec 1 colonne d'entrée (instruction) et 1 sortie :

Nous exigeons simplement que vous placiez un {INPUT} champ pour l'instruction et un {OUTPUT} champ pour la sortie du modèle. Nous autorisons en fait un {SYSTEM} champ optionnel également, ce qui est utile pour personnaliser une instruction système comme dans ChatGPT. Par exemple, ci-dessous se trouvent quelques exemples sympas que vous pouvez personnaliser pour le modèle de chat :

Pour le format ChatML utilisé dans les modèles OpenAI :

Ou vous pouvez utiliser le modèle Llama-3 lui-même (qui ne fonctionne qu'en utilisant la version instruct de Llama-3) : Nous autorisons en fait un {SYSTEM} champ optionnel également, ce qui est utile pour personnaliser une instruction système comme dans ChatGPT.

Ou dans la tâche de prédiction Titanic où vous deviez prédire si un passager est décédé ou a survécu dans ce carnet Colab qui inclut le téléversement CSV et Excel : https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing

10. Entraîner le modèle
Entraînons le modèle maintenant ! Nous suggérons généralement de ne pas modifier ce qui suit, sauf si vous souhaitez affiner pendant plus d'étapes ou entraînez avec de grandes tailles de batch.

Nous ne suggérons pas normalement de modifier les paramètres ci-dessus, mais pour expliquer certains d'entre eux :
Augmentez la taille du lot si vous souhaitez utiliser davantage la mémoire de votre GPU. Augmentez également cela pour rendre l'entraînement plus fluide et éviter le surapprentissage. Nous ne le suggérons généralement pas, car cela peut rendre l'entraînement plus lent à cause du padding. Nous vous demandons généralement d'augmenter plutôt
gradient_accumulation_stepsqui effectue simplement plus de passes sur le jeu de données.Équivalent à augmenter la taille du lot ci-dessus, mais n'impacte pas la consommation de mémoire ! Nous suggérons généralement aux gens d'augmenter ceci si vous voulez des courbes de perte d'entraînement plus lisses.
Nous fixons les étapes à 60 pour un entraînement plus rapide. Pour des entraînements complets qui peuvent prendre des heures, commentez plutôt
max_steps, et remplacez-le parnum_train_epochs = 1. Le régler à 1 signifie 1 passage complet sur votre jeu de données. Nous suggérons généralement 1 à 3 passages, et pas plus, sinon vous surapprendrez votre affinage.Réduisez le taux d'apprentissage si vous souhaitez ralentir le processus d'affinage, mais aussi converger vers un résultat de précision plus élevé très probablement. Nous suggérons généralement 2e-4, 1e-4, 5e-5, 2e-5 comme valeurs à essayer.

Vous verrez un journal de nombres pendant l'entraînement. C'est la perte d'entraînement, qui montre à quel point le modèle apprend de votre jeu de données. Dans de nombreux cas, une perte autour de 0,5 à 1,0 est un bon signe, mais cela dépend de votre jeu de données et de la tâche. Si la perte ne diminue pas, vous devrez peut-être ajuster vos paramètres. Si la perte tombe à 0, cela peut signifier un surapprentissage, il est donc important de vérifier également la validation.
11. Inférence / exécution du modèle

Exécutons maintenant le modèle après avoir terminé le processus d'entraînement ! Vous pouvez modifier la partie soulignée en jaune ! En fait, parce que nous avons créé un chatbot multi-tours, nous pouvons maintenant aussi appeler le modèle comme s'il avait vu des conversations passées comme ci-dessous :

Rappel : Unsloth lui-même fournit une inférence 2x plus rapide nativement également, donc n'oubliez jamais d'appeler FastLanguageModel.for_inference(model). Si vous voulez que le modèle produise des réponses plus longues, réglez max_new_tokens = 128 sur un nombre plus grand comme 256 ou 1024. Notez que vous devrez attendre plus longtemps pour le résultat également !
12. Sauvegarde du modèle
Nous pouvons maintenant sauvegarder le modèle affiné sous la forme d'un petit fichier de 100 Mo appelé adaptateur LoRA comme ci-dessous. Vous pouvez aussi le pousser sur le hub Hugging Face si vous souhaitez téléverser votre modèle ! N'oubliez pas d'obtenir un token Hugging Face via https://huggingface.co/settings/tokens et ajoutez votre token !

Après avoir enregistré le modèle, nous pouvons à nouveau utiliser Unsloth pour exécuter le modèle lui-même ! Utilisez FastLanguageModel à nouveau pour l'appeler pour l'inférence !

13. Exportation vers Ollama
Enfin nous pouvons exporter notre modèle affiné vers Ollama lui-même ! D'abord nous devons installer Ollama dans le notebook Colab :

Ensuite nous exportons le modèle affiné vers les formats GGUF de llama.cpp comme ci-dessous :

Rappel de convertir False en True pour 1 ligne, et ne pas changer chaque ligne en True, sinon vous attendrez très longtemps ! Nous suggérons normalement que la première ligne soit définie sur True, afin que nous puissions exporter rapidement le modèle affiné vers Q8_0 format (quantification 8 bits). Nous vous permettons également d'exporter vers toute une liste de méthodes de quantification, l'une des plus populaires étant q4_k_m.
Rendez-vous sur https://github.com/ggerganov/llama.cpp pour en savoir plus sur GGUF. Nous avons aussi des instructions manuelles sur la façon d'exporter vers GGUF si vous le souhaitez ici : https://github.com/unslothai/unsloth/wiki#manually-saving-to-gguf
Vous verrez une longue liste de textes comme ci-dessous - veuillez patienter 5 à 10 minutes !!

Et enfin, tout à la fin, cela ressemblera à ceci :

Ensuite, nous devons exécuter Ollama lui-même en arrière-plan. Nous utilisons subprocess parce que Colab n'aime pas les appels asynchrones, mais normalement on exécute simplement ollama serve dans le terminal / invite de commande.

14. Automatique Fichier de modèle création
Fichier de modèle créationL'astuce fournie par Unsloth est que nous créons automatiquement un Fichier de modèle que Ollama nécessite ! Il s'agit simplement d'une liste de paramètres et inclut le modèle de chat que nous avons utilisé pour le processus d'affinage ! Vous pouvez aussi afficher le Fichier de modèle généré comme ci-dessous :

Nous demandons ensuite à Ollama de créer un modèle compatible avec Ollama, en utilisant le Fichier de modèle

15. Inférence Ollama
Et nous pouvons maintenant appeler le modèle pour l'inférence si vous voulez appeler le serveur Ollama lui-même qui s'exécute sur votre machine locale / dans le notebook Colab gratuit en arrière-plan. N'oubliez pas que vous pouvez modifier la partie soulignée en jaune.

16. Style ChatGPT interactif
Mais pour réellement exécuter le modèle affiné comme un ChatGPT, nous devons faire un peu plus ! Cliquez d'abord sur l'icône du terminal
et un terminal apparaîtra. Il se trouve dans la barre latérale gauche.

Ensuite, vous devrez peut-être appuyer deux fois sur ENTER pour supprimer quelques sorties étranges dans la fenêtre du terminal. Attendez quelques secondes et tapez ollama run unsloth_model puis appuyez sur ENTER.

Et enfin, vous pouvez interagir avec le modèle affiné comme un vrai ChatGPT ! Appuyez sur CTRL + D pour quitter le système, et appuyez sur ENTER pour converser avec le chatbot !

Vous l'avez fait !
Vous avez affiné avec succès un modèle de langage et l'avez exporté vers Ollama avec Unsloth 2x plus rapide et avec 70 % de VRAM en moins ! Et tout cela gratuitement dans un carnet Google Colab !
Si vous souhaitez apprendre à faire du reward modelling, poursuivre le pré-entraînement, exporter vers vLLM ou GGUF, faire de la complétion de texte, ou en savoir plus sur des astuces et conseils d'affinage, rendez-vous sur notre Github.
Si vous avez besoin d'aide pour l'affinage, vous pouvez aussi rejoindre notre serveur Discord ici. Si vous voulez de l'aide avec Ollama, vous pouvez aussi rejoindre leur serveur ici.
Et enfin, nous voulons vous remercier d'avoir lu et suivi jusqu'ici ! Nous espérons que cela vous a permis de comprendre certains mécanismes de l'affinage des modèles de langage, et que cela vous aura été utile !
Pour accéder à notre exemple de jeu de données Alpaca cliquez ici, et notre guide d'affinage CSV / Excel est ici.
Mis à jour
Ce contenu vous a-t-il été utile ?

