🦙Tutoriel : Comment affiner Llama-3 et l'utiliser dans Ollama

Guide pour débutants 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 Unslotharrow-up-right gratuitement. Il peut fonctionner localement via Ollamaarrow-up-right sur votre PC, ou dans une instance GPU gratuite via Google Colabarrow-up-right. 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 intégré automatique Modelfile création ! Si vous avez besoin d'aide, vous pouvez rejoindre notre serveur Discord : https://discord.com/invite/unslotharrow-up-right

circle-exclamation

1. Qu'est-ce qu'Unsloth ?

Unslotharrow-up-right rend l'affinage des LLMs comme Llama-3, Mistral, Phi-3 et Gemma 2x plus rapide, utilise 70 % moins de mémoire, et sans dégradation de l'exactitude ! Nous utiliserons Google Colab qui fournit un GPU gratuit pendant ce tutoriel. Vous pouvez accéder à nos carnets gratuits ci-dessous :

Vous devrez également vous connecter à votre compte Google !

2. Qu'est-ce qu'Ollama ?

Ollama arrow-up-rightvous permet d'exécuter des modèles de langage depuis votre propre ordinateur de manière 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 voulez 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 guide sur le carnet lui-même :

  1. Bouton Lecture à 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, relancez simplement la cellule que vous n'avez pas exécutée auparavant. Une autre option est d'appuyer sur CTRL + ENTREE si vous ne voulez pas cliquer sur le bouton lecture.

  2. Bouton Exécution dans la barre d'outils supérieure. Vous pouvez également utiliser ce bouton et cliquer sur "Exécuter tout" pour exécuter l'ensemble du carnet en une seule fois. Cela sautera toutes les étapes de personnalisation et peut être un bon premier essai.

  3. Bouton Connexion / Reconnexion 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 LECTURE dans les crochets [ ]. Nous récupérons notre package open source Github et installons d'autres packages.

4. Sélection d'un modèle à affiner

Sélectionnons maintenant un modèle pour l'affinage ! Nous avons par défaut Llama-3 de Meta / Facebook qui a été entraîné sur un impressionnant 15 trillions de "tokens". Supposons qu'un token équivaut à un mot anglais. Cela représente approximativement l'équivalent de 350 000 épais encyclopédies ! D'autres modèles populaires incluent Mistral, Phi-3 (entraîné en utilisant la sortie de GPT-4) et Gemma de Google (13 trillions 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 :

  1. Cela détermine la longueur de contexte du modèle. Gemini par exemple a plus d'un million de longueur de contexte, tandis que Llama-3 a une longueur de contexte de 8192. Nous vous permettons de sélectionner N'IMPORTE quel nombre - mais nous recommandons de le définir à 2048 pour des tests. Unsloth prend également en charge l'affinage sur de très longs contextes, et nous montrons que nous pouvons fournir des longueurs de contexte 4x plus longues que le meilleur.

  2. Laissez ceci sur None, mais vous pouvez sélectionner torch.float16 ou torch.bfloat16 pour les GPU plus récents.

  3. Nous effectuons l'affinage en quantification 4 bits. Cela réduit l'utilisation de la mémoire par 4x, nous permettant de réaliser l'affinage sur un GPU gratuit de 16 Go de mémoire. 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 la précision de 1 à 2 %. Définissez ceci sur False sur des GPU plus grands comme les H100 si vous voulez ce léger 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, car nous avons déjà sélectionné des nombres assez raisonnables.

L'objectif est de changer ces nombres pour augmenter la précision, mais aussi contrer le sur-apprentissage. Le sur-apprentissage survient lorsque vous faites mémoriser un ensemble de données au modèle de langage, et qu'il n'est plus capable de répondre à de nouvelles questions inédites. Nous voulons qu'un modèle final réponde à des questions non vues, et non qu'il fasse de la mémorisation.

  1. 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 normalement des nombres comme 8 (pour des affines rapides), et jusqu'à 128. Des nombres trop grands peuvent provoquer un sur-apprentissage, détériorant la qualité de votre modèle.

  2. Nous sélectionnons tous les modules à affiner. Vous pouvez en supprimer certains pour réduire l'utilisation de mémoire et accélérer l'entraînement, mais nous le déconseillons fortement. Entraînez simplement sur tous les modules !

  3. Le facteur d'échelle pour l'affinage. Un nombre plus grand fera que l'affinage apprendra davantage sur votre jeu de données, mais peut favoriser le sur-apprentissage. Nous suggérons que ceci soit égal au rang r, ou le doubler.

  4. Laissez cela à 0 pour un entraînement plus rapide ! Peut réduire le sur-apprentissage, mais pas énormément.

  5. Laissez cela à 0 pour un entraînement plus rapide et moins sujet au sur-apprentissage !

  6. Les options incluent True, False et "unsloth". Nous suggérons "unsloth" puisque nous réduisons l'utilisation de la mémoire d'environ 30 % supplémentaire et prenons en charge des affins sur des contextes extrêmement longs. Vous pouvez en lire plus ici : https://unsloth.ai/blog/long-contextarrow-up-right pour plus de détails.

  7. Le nombre pour déterminer des exécutions déterministes. L'entraînement et l'affinage nécessitent des nombres aléatoires, donc définir ce nombre rend les expériences reproductibles.

  8. Fonctionnalité avancée pour définir le lora_alpha = 16 automatiquement. Vous pouvez l'utiliser si vous le souhaitez !

  9. Fonctionnalité avancée pour initialiser les matrices LoRA aux r principaux vecteurs singuliers des poids. Peut améliorer quelque peu la précision, mais peut faire exploser l'utilisation de la mémoire au début.

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 rendu l'affinage d'un LLM de base 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-gpt4arrow-up-right. Une première version plus ancienne du jeu de données est ici : https://github.com/tatsu-lab/stanford_alpacaarrow-up-right. 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 une grande invite comme ci-dessous. Nous utilisons ensuite ceci 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 non plusieurs colonnes / entrées. Par exemple dans ChatGPT, vous devez soumettre une seule invite, et non plusieurs invites.

Cela signifie essentiellement que nous devons "fusionner" plusieurs colonnes en une grande invite pour que l'affinage fonctionne réellement !

Par exemple le très célèbre jeu de données Titanic a de nombreuses colonnes. Votre tâche était de prédire si un passager a survécu ou est décédé en fonction de son âge, sa classe de passager, le prix du billet, etc. Nous ne pouvons pas simplement passer ceci à ChatGPT, mais nous devons plutôt "fusionner" ces informations en une seule grande invite.

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

D'autres bibliothèques d'affinage vous obligent à préparer manuellement votre jeu de données pour l'affinage, en fusionnant toutes vos colonnes en une seule invite. Dans Unsloth, nous fournissons simplement la fonction appelée to_sharegpt qui fait cela en une seule opération !

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=sharingarrow-up-right

Ceci est un peu plus compliqué, car nous permettons beaucoup de personnalisation, 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 textuels 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. Ceci est utile pour les jeux de données avec des valeurs manquantes.

  • Sélectionnez la colonne de sortie ou de cible / prédiction dans output_column_name. Pour le jeu de données Alpaca, ce sera output.

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, supposons que le jeu de données ressemble à ceci avec beaucoup de données manquantes :

Embarked
Age
Fare

S

23

18

7.25

Ensuite, nous ne voulons pas que le résultat soit :

  1. Le passager a embarqué depuis S. Son âge est 23. Son tarif est VIDE.

  2. Le passager a embarqué depuis VIDE. Son âge est 18. Son tarif est 7,25 $.

Au lieu de cela, en entourant éventuellement les colonnes avec [[]], nous pouvons exclure complètement cette information.

  1. [[Le passager a embarqué depuis S.]] [[Son âge est 23.]] [[Son tarif est VIDE.]]

  2. [[Le passager a embarqué depuis VIDE.]] [[Son âge est 18.]] [[Son tarif est 7,25 $.]]

devient :

  1. Le passager a embarqué depuis S. Son âge est 23.

  2. Son âge est 18. Son tarif est 7,25 $.

8. Conversations multi-tours

Un problème, si vous ne l'avez pas remarqué, est que le jeu de données Alpaca est mono-tour, tandis que rappelez-vous que l'utilisation de ChatGPT était interactive et vous pouvez lui parler sur 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 certaine manière à faire des conversations multi-tours comme ChatGPT.

Donc nous avons introduit le conversation_extension paramètre, qui sélectionne essentiellement quelques lignes aléatoires de votre jeu de données mono-tour, et les fusionne en une seule conversation ! Par exemple, si vous le définissez à 3, nous sélectionnons aléatoirement 3 lignes et les fusionnons en 1 ! Les définir trop longs peut ralentir l'entraînement, mais pourrait 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 formater correctement le jeu de données 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 très célèbre format Alpaca est ci-dessous :

Mais rappelez-vous que nous avons dit que c'était une mauvaise idée parce que les affins de style ChatGPT nécessitent une seule invite ? Puisque nous avons réussi à fusionner toutes les colonnes du jeu de données en une seule avec 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 un prompt système comme dans ChatGPT. Par exemple, ci-dessous se trouvent quelques exemples sympas que vous pouvez personnaliser dans 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 champ {SYSTEM} optionnel également qui est utile pour personnaliser un prompt système comme dans ChatGPT.

Ou dans la tâche de prédiction Titanic où vous deviez prédire si un passager est mort 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=sharingarrow-up-right

10. Entraîner le modèle

Entraînons le modèle maintenant ! Nous suggérons normalement de ne pas modifier ce qui suit, à moins que vous ne souhaitiez affiner pour plus d'étapes ou entraîner avec de grandes tailles de lots.

Nous ne suggérons généralement pas de changer les paramètres ci-dessus, mais pour en expliquer certains :

  1. Augmentez la taille de lot si vous voulez utiliser davantage la mémoire de votre GPU. Augmentez aussi cela pour rendre l'entraînement plus fluide et éviter le sur-apprentissage. Nous ne le suggérons généralement pas, car cela pourrait en fait ralentir l'entraînement en raison des problèmes de padding. Nous demandons plutôt d'augmenter gradient_accumulation_steps qui effectue simplement plus de passes sur le jeu de données.

  2. Équivalent à augmenter la taille de 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.

  3. Nous fixons les pas à 60 pour un entraînement plus rapide. Pour des exécutions d'entraînement complètes qui peuvent prendre des heures, commentez plutôt max_steps, et remplacez-le par num_train_epochs = 1. Le définir à 1 signifie 1 passage complet sur votre jeu de données. Nous suggérons normalement 1 à 3 passages, et pas plus, sinon vous sur-apprendrez votre affinage.

  4. Réduisez le taux d'apprentissage si vous souhaitez rendre le processus d'affinage plus lent, mais aussi converger probablement vers un résultat de précision plus élevé. Nous suggérons généralement d'essayer 2e-4, 1e-4, 5e-5, 2e-5.

Vous verrez un journal de nombres pendant l'entraînement. Il s'agit de 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 tend vers 0, cela peut signifier un sur-apprentissage, il est donc important de vérifier aussi 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, comme 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 fournit lui-même 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, définissez max_new_tokens = 128 à un nombre plus grand comme 256 ou 1024. Notez que vous devrez aussi attendre plus longtemps pour le résultat !

12. Sauvegarde du modèle

Nous pouvons maintenant sauvegarder le modèle affiné en tant que petit fichier de 100 Mo appelé adaptateur LoRA comme ci-dessous. Vous pouvez aussi le pousser sur le hub Hugging Face si vous voulez téléverser votre modèle ! N'oubliez pas d'obtenir un token Hugging Face via https://huggingface.co/settings/tokensarrow-up-right et d'ajouter votre token !

Après avoir sauvegardé le modèle, nous pouvons de nouveau utiliser Unsloth pour exécuter le modèle lui-même ! Utilisez FastLanguageModel à nouveau pour l'appeler en 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 carnet Colab :

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

Rappel : 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 aussi d'exporter vers toute une liste de méthodes de quantification, l'une des populaires étant q4_k_m.

Rendez-vous sur https://github.com/ggerganov/llama.cpparrow-up-right 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-ggufarrow-up-right

Vous verrez une longue liste de texte 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'apprécie pas les appels asynchrones, mais normalement on exécute simplement ollama serve dans le terminal / invite de commandes.

14. Automatique Modelfile création

L'astuce fournie par Unsloth est que nous créons automatiquement un Modelfile que Ollama requiert ! Il s'agit juste 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 imprimer le Modelfile généré comme ci-dessous :

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

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 propre machine locale / dans le carnet 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 ! D'abord cliquez 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 ENTRÉE pour supprimer une sortie étrange dans la fenêtre du terminal. Attendez quelques secondes et tapez ollama run unsloth_model puis appuyez sur ENTRÉE.

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

Vous l'avez fait !

Vous avez réussi à affiner un modèle de langage et à l'exporter 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 voulez apprendre comment 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 les astuces et conseils d'affinage, rendez-vous sur notre Githubarrow-up-right.

Si vous avez besoin d'aide pour l'affinage, vous pouvez également rejoindre notre serveur Discord iciarrow-up-right. Si vous souhaitez de l'aide avec Ollama, vous pouvez aussi rejoindre leur serveur iciarrow-up-right.

Et enfin, nous voulons vous remercier d'avoir lu et suivi jusqu'ici ! Nous espérons que cela vous a aidé à comprendre certains des mécanismes derrière l'affinage des modèles de langage, et nous espérons que cela vous a été utile !

Pour accéder à notre exemple de jeu de données Alpaca cliquez iciarrow-up-right, et notre guide d'affinage CSV / Excel est iciarrow-up-right.

Mis à jour

Ce contenu vous a-t-il été utile ?