paint-brush
J'ai affiné un Llm avec mon historique de discussion Telegram. Voici ce que j'ai apprispar@furiousteabag
1,518 lectures
1,518 lectures

J'ai affiné un Llm avec mon historique de discussion Telegram. Voici ce que j'ai appris

par Alex7m2024/06/13
Read on Terminal Reader

Trop long; Pour lire

J'ai affiné un modèle de langage en utilisant mes messages Telegram pour voir s'il pouvait reproduire mon style d'écriture et mes modèles de conversation. J'ai choisi le modèle Mistral 7B pour ses performances et expérimenté à la fois les approches LoRA (adaptation de bas rang) et de réglage fin complet. J'ai extrait tous mes messages Telegram, totalisant 15 789 sessions sur cinq ans, et les ai d'abord testés avec le modèle Mistral de conversation générique affiné. Pour LoRA, la formation sur un RTX 3090 a duré 5,5 heures et a coûté 2 $, améliorant le mimétisme de style mais luttant avec le contexte et la grammaire. Un réglage fin complet, utilisant huit GPU A100, a amélioré les performances linguistiques et la rétention du contexte, mais comportait encore quelques erreurs. Dans l’ensemble, même si le modèle a bien saisi le style de conversation et les sujets courants, il manquait souvent de contexte dans les réponses.
featured image - J'ai affiné un Llm avec mon historique de discussion Telegram. Voici ce que j'ai appris
Alex HackerNoon profile picture
0-item
1-item

Pour la plupart des personnes avec qui j’interagis, je ne suis la plupart du temps qu’un autre programme basé sur du texte. Si l’entrée et la sortie sont si simples, pourrais-je être remplacé par le modèle ? Pour que cela fonctionne, le modèle devrait non seulement comprendre mon style d'écriture, mais aussi en savoir beaucoup sur moi. La meilleure source pour cela est mon messager Telegram , car je l'utilise quotidiennement et il contient presque tout sur mes pensées et mes actions sous forme d'historiques de discussion.

Approche

L'approche la plus simple serait d'extraire tous mes messages, de les charger dans le contexte de ChatGPT et de lui demander d'utiliser ces informations pour imiter mon style lorsqu'il répond à de nouveaux messages. Cependant, cette approche est limitée par la taille de la fenêtre contextuelle, ce qui m'oblige à prétraiter les messages pour en extraire les points clés. Comme je veux éviter ces tracas, peut-être que la génération augmentée de récupération (RAG) pourrait être utilisée pour extraire les informations nécessaires en cas de besoin. Cependant, d'après mon expérience, la récupération de données diverses telles que les sessions de chat nécessite généralement un réglage fin supervisé du modèle de récupération, et je ne suis pas enthousiaste à l'idée de créer un tel ensemble de données. Un réglage fin semble donc être la meilleure option. C'est idéal pour plusieurs raisons : il doit capturer mon style d'écriture et potentiellement accumuler des connaissances sur tous mes messages sans avoir à sélectionner ce qui est important.


OpenAI offre des capacités de réglage fin , mais comme j'utiliserai mes messages privés, je ne souhaite pas utiliser de services de réglage tiers. Je dois donc choisir un modèle de base. Selon le classement Hugging Face Open LLM , l'un des modèles les plus petits (paramètres ≤ 13B) est le Mistral 7B . Il surpasse même Llama 2 13B . Maintenant, la question est de savoir si LoRA est suffisant ou si un réglage complet est nécessaire. Diverses comparaisons [1] [2] suggèrent que LoRA est un peu pire qu'un réglage fin complet, mais reste correct la plupart du temps. Cependant, pour des tâches spécifiques comme la mienne (langue russe + chat), j'ai trouvé un article dans lequel des chercheurs ont peaufiné l'enseignement des lamas en chinois, d'une complexité similaire à mon objectif. Ils ont constaté que le réglage basé sur LoRA sur un modèle de base sans réglage préalable des instructions est moins efficace qu'un réglage fin complet. Pourtant, le réglage basé sur LoRA sur un modèle déjà affiné pour les instructions peut donner des résultats comparables. Dans mon cas, cela signifie soit un réglage fin complet sur un modèle de base, soit LoRA sur un modèle déjà réglé pour discuter en russe. Comme je n'ai pas trouvé de modèle optimisé pour le chat russe, je vais essayer LoRA sur un modèle optimisé pour le chat anglais, comme le modèle Mistral affiné Dolphin .


Le plan est donc :

  1. Commencez avec LoRA au-dessus de Dolphin, le chat anglais peaufiné Mistral
  2. Si la qualité n'est pas suffisante, essayez un réglage fin complet sur Mistral

Préparation des données

Un aspect unique de la messagerie dans des applications comme Telegram, par rapport aux e-mails, est le flux conversationnel. Les messages n'alternent généralement pas un par un entre vous et votre contact. Au lieu de cela, vous vous retrouvez souvent à envoyer quelques messages d’affilée, suivis de plusieurs réponses de l’autre personne. Ces messages sont également généralement courts. Je souhaitais conserver ce style conversationnel naturel dans mes données.


Telegram propose une fonctionnalité intégrée pour exporter toutes les discussions en JSON. Après quelques filtrages et regroupements de messages en sessions, j'ai compilé les données des cinq dernières années d'utilisation de Telegram. Cela a donné lieu à 15 789 sessions provenant de 466 chats, avec une durée moyenne de session de 8,51 messages. Pour structurer les données, j'ai choisi le format d'invite ChatML . Voici un exemple de session (traduit du russe) :


<|im_start|>John Smith
>>> putain, je ne peux pas contourner le délai de 135

>>> j'essaie de tout faire de manière super optimale, mais sans succès<|im_end|>

<|im_start|>Alexandre Smirnov
>>> ouais pareil

>>> vous continuez avec la même idée ?<|im_end|>

<|im_start|>John Smith
>>> je ne sais pas, je pense que nous sommes sur la même longueur d'onde

>>> comme tu l'as dit

>>> utiliser la chaîne inversée pour essayer d'y trouver quelque chose

>>> cela semble être une vraie merde parce que la fonction z gâche tout……………………<|im_end|>

<|im_start|>Alexandre Smirnov
>>> n'arrivez pas à comprendre où z entre en jeu<|im_end|>

<|im_start|>John Smith
>>> je ne sais pas, on dirait que je fais tout de manière itérative de toute façon, mais oui, je dois inverser certaines chaînes pour construire la fonction z

>>> et c'est juste une solution aléatoire

>>> issus des discussions<|im_end|>

<|im_start|>Alexandre Smirnov
>>> j'ai compris<|im_end|>


Mon collecteur de données garantit que la perte est calculée uniquement en fonction de la réponse de quelqu'un. Prédire qui parlera ensuite est relativement simple, et nous ne voulons pas que le modèle se concentre sur l'apprentissage de cela. Par conséquent, les parties de la conversation où la perte est calculée sont mises en évidence en gras.


Vous remarquerez peut-être que non seulement mes réponses, mais aussi celles des autres, sont utilisées pour le calcul des pertes. C'est délibéré. En faisant cela, le modèle pourra jouer non seulement mon rôle, mais aussi celui de mes interlocuteurs fréquents !

Plan d'évaluation

Je vais tester des modèles en discutant de deux manières. Tout d’abord, le modèle se fera passer pour moi et je discuterai avec moi-même du point de vue de mes différents amis. Ensuite, je discuterai en tant que moi-même pendant que le modèle agira en tant qu'ami. Mon démarreur de conversation sera toujours les mêmes 2 messages : « hé » et « quoi de neuf ? (en russe, « прив » et « как дела ? »). Phrases générées et personnes en tant que modèle qui seront mises en évidence . Pour les tests, j'utiliserai oobabooga/text-generation-webui .


Au début, je souhaite explorer comment le modèle Mistral affiné de conversation générique gère cette tâche sans aucune formation préalable de ma part.


Ami 1 contre Alexander Smirnov


Alexander Smirnov contre ami 1


Ok, il est capable de former des phrases cohérentes. Le problème le plus notable est son manque de conscience du contexte des conversations, ce qui conduit à des réponses fades et génériques. Les messages manquaient de style distinct et semblaient assez basiques. Un autre problème est que le russe du modèle est médiocre. Ceci est attendu, car le modèle est trop petit pour bien se généraliser à des langues autres que son modèle principal, l'anglais. De plus, le modèle avait tendance à être trop proactif, terminant presque chaque phrase par une question, ce qui n'est pas la façon dont les vraies personnes communiquent généralement dans les messageries.


Essayons de réparer tout cela !

LoRA

LoRA propose une approche nécessitant peu d'efforts en termes de pipeline de formation et d'exigences matérielles. Il entraîne environ 1% du poids total. J'ai choisi une longueur de séquence de 1024 et une taille de lot de 8. La formation, qui consommait 20 Go de VRAM sur un RTX 3090, a duré trois époques et a duré 5,5 heures. Pour cela, j'ai utilisévast.ai , où le coût du GPU était de 0,362 $ par heure, soit un total de 2 $ pour l'ensemble de la formation, hors temps consacré aux expériences et aux corrections de bugs.


Voici les résultats:


Ami 1 contre Alexander Smirnov


Ami 2 contre Alexander Smirnov


Alexander Smirnov contre ami 1


Alexander Smirnov contre ami 2


Ceci est vraiment mieux. Il capture définitivement le style de la personne pour laquelle il répond. Il identifie également les sujets les plus fréquemment discutés entre des paires spécifiques de personnes. Par exemple, avec l’ami 2, l’accent est clairement davantage mis sur le travail. Cependant, la grammaire est toujours erronée et le contexte de la conversation est rapidement perdu. Je suis assez convaincu que LoRA fonctionnerait avec une qualité raisonnable en anglais, et un réglage complet ne serait peut-être pas nécessaire. Mais comme le russe n'est pas la langue maternelle du modèle, essayons de le peaufiner.

Mise au point complète

Le réglage complet est plus difficile en raison de la nécessité d’une formation multi-GPU. Les méthodes populaires incluent ZeRO & DeepSpeed [3] ou FSDP [4] , FSDP étant essentiellement un ZeRO3 [5] . J'ai décidé d'opter pour FSDP.


Lors de la mise en œuvre du pipeline de formation, j'ai fait référence au code de réglage fin de Stanford Alpaca et au code de réglage fin Mistral d'Anton Bacaj .


L’utilisation d’un fragment complet FSDP demi-précision avec une longueur de séquence de 1 024 et une taille de micro-lot de 2 nécessitait 63 Go de VRAM sur chacun des huit GPU A100 de 80 Go. La formation, d'une durée de trois époques, n'a duré que 20 minutes. Le coût total de la VM était de 8,88 $ par heure, soit 3 $, sans compter le temps consacré aux expériences et aux corrections de bugs.


Conversations :


Ami 1 contre Alexander Smirnov


Ami 2 contre Alexander Smirnov


Alexander Smirnov contre ami 1


Alexander Smirnov contre ami 2


Les conversations sont devenues plus intéressantes et engageantes, même s'il existe toujours un risque de perte de contexte. Les performances en russe se sont améliorées, mais des erreurs persistent. Je pense qu'avant d'affiner une tâche spécifique avec des données limitées, comme la mienne, il serait bénéfique d'affiner d'abord le modèle sans supervision sur un large corpus de textes russes. De plus, l'incorporation des noms des interlocuteurs communs sous forme de jetons distincts pourrait améliorer la qualité.


Je ne dirais pas qu’il s’est avéré nettement meilleur que LoRA. Il pourrait être plus efficace de se concentrer uniquement sur une seule personne et de calculer la perte en fonction uniquement de mes réponses (ou de celles de quelqu'un d'autre), au lieu d'essayer d'en apprendre davantage sur chaque interlocuteur.

Pensées finales

Certes, j'ai dû sélectionner les résultats, non pas parce que la plupart des réponses du modèle étaient inadéquates, mais parce que beaucoup étaient des réponses simples comme « Je t'appellerai plus tard », « occupé » et « ok », qui sont naturellement fréquentes. dans les conversations. Malgré cela, il est clair que le modèle excelle à imiter le style de la personne qu'il incarne. Il capture également les sujets couramment discutés entre deux personnes. Cependant, il manque considérablement de contexte dans les conversations. Répondre à des requêtes telles que « yo, alors ? ou « quels sont vos projets pour le week-end » est un défi sans avoir un contexte complet. Peut-être que l'utilisation d'un système comme Rewind , qui capture tout ce que l'utilisateur fait sur l'ordinateur, pourrait être bénéfique.

Code

Vous pouvez trouver le code de ce projet ainsi que des instructions sur la façon de le répliquer vous-même sur votre propre dump Telegram dans mon dépôt github . Les journaux de formation sont accessibles sur WandB .


Image principale de Christian Wiediger sur Unsplash