Avec la croissance des modèles LLM comme ChatGPT, les entreprises se sont précipitées pour commercialiser des applications d'apprentissage profond basées sur le langage. Des sociétés comme Duolingo et Blinkist créent des applications de chat éducatif, des sociétés comme Cocounsel créent des modèles d'analyse de documents et certaines, comme MedGPT, créent même des modèles spécialisés capables de réaliser des tâches telles que le diagnostic médical. Dans un article précédent, j'ai expliqué comment quelqu'un peut utiliser ChatGPT et inviter l'ingénierie à créer un analyseur de documents puissant.
Afin de prendre en charge des applications LLM plus puissantes et spécifiques à un domaine, les fournisseurs de technologie ont mis à disposition de nombreuses solutions cloud. OpenAI, la société derrière ChatGPT, par exemple, a mis à la disposition des utilisateurs une API de réglage simple mais puissante, permettant aux utilisateurs de créer leurs propres modèles de langage basés sur la technologie GPT3. Google, pour ne pas être en reste, a rendu son modèle bison-texte, largement considéré comme un concurrent performant de GPT 3 et GPT 3.5, disponible pour un réglage précis via la plateforme Google Cloud. Dans un article précédent, j'ai expliqué comment utiliser l'API de réglage fin pour créer un LLM d'expert de domaine.
Aussi puissants que puissent être ces services, une entreprise envisageant d’investir sérieusement dans la technologie LLM souhaitera apprendre à former ses propres modèles à partir de technologies open source. Par rapport à l'utilisation de ces points de terminaison fournis par le fournisseur, la formation de votre propre modèle offre les avantages suivants :
Dans cet article, nous prendrons un modèle LLM open source populaire et performant, l'entraînerons sur nos propres données, de la même manière que nous l'avons fait dans un article précédent, et validerons les résultats. Bien que l'exemple que nous abordons soit non commercial et basé sur des informations publiques, les techniques peuvent facilement être appliquées de manière croisée à des activités commerciales. Nous approfondirons des suggestions spécifiques sur les applications commerciales qui peuvent être créées à l'aide de cette technique dans la section « Modèle Expert LLM » où nous définissons le problème que nous allons résoudre dans cet article.
Pour l'expérience d'aujourd'hui, nous nous appuierons sur Flan-T5 Large, qui est un grand modèle de langage publié par Google. Bien que ce ne soit pas la technologie qui sous-tend Bard, ce modèle est largement considéré comme compétitif par rapport aux technologies basées sur GPT. Ce qui est impressionnant avec les modèles Flan T5, cependant, c'est qu'ils obtiennent des résultats satisfaisants en utilisant beaucoup moins de paramètres que les modèles basés sur GPT. Même la version XL du modèle, par exemple, ne comporte que 3 milliards de paramètres, contre GPT3 qui en compte 175 milliards.
En raison de cette compacité, il est relativement peu coûteux de former et de stocker ces modèles sur des actifs de cloud computing. De plus, la famille de modèles Flan-T5 est publiée avec la licence Apache, ce qui permet une utilisation commerciale, réduisant ainsi les problèmes de licence potentiels qui accompagnent certains des autres LLM open source. Le LLaMa de Facebook, par exemple, n'est toujours disponible qu'à des fins de recherche et à des fins non commerciales.
Pour écrire cet article, j'ai expérimenté quelques classes de tâches différentes pour tester l'efficacité de la technologie. De manière générale, le Flan-T5, en particulier la variante XL, semble avoir d'excellentes capacités de compréhension du langage naturel, similaires à celles de certains modèles GPT du marché. Cependant, le modèle échoue quelque peu lorsqu'il s'agit d'établir des connexions abstraites et a quelques difficultés à générer de longues sorties. Il faut donc veiller à sélectionner le bon modèle pour la bonne tâche.
Replicate est une société Platform-as-a-Service qui permet aux utilisateurs de louer des GPU pour s'entraîner et exécuter de grands modèles d'IA à un prix abordable. Leur suite d'outils de gestion de modèles d'IA permet aux utilisateurs de se concentrer sur le travail avec les données plutôt que sur la gestion des ressources du serveur.
Afin d'écrire cet article, j'ai essayé plusieurs offres PaaS de formation à l'IA, notamment AWS SageMaker, Google Colab et PaperSpace Gradient. Replica était de loin la plate-forme la plus simple avec laquelle démarrer et offrait des prix très compétitifs par rapport aux autres services mentionnés.
Python est la lingua franca de l’ingénierie des données. Le vaste écosystème permet aux programmeurs d’ingérer, d’analyser et de traiter rapidement les données. La plupart des principales plates-formes de formation en IA disposent d'un support de premier ordre pour Python, ce qui facilite grandement notre travail. En raison de l'excellente intégration de Replicate, nous allons écrire aujourd'hui tout notre code en Python.
Étant donné que la famille de modèles Flan-T5 est bien meilleure pour comprendre le texte que pour générer du texte, nous souhaitons choisir une tâche lourde en entrée mais légère en sortie. Les classificateurs de langage naturel constituent un cas d'utilisation parfait pour ce type de scénario. Nous allons donc aujourd'hui créer un identifiant de dramaturge. Plus précisément, nous donnerons au modèle des passages de William Shakespeare ou d'Anton Tchekhov, et verrons si nous pouvons apprendre au modèle à identifier le dramaturge en fonction du style d'écriture et du choix des mots.
Bien entendu, comme il s’agit d’un didacticiel public, nous choisissons intentionnellement un modèle avec des données publiques et facilement accessibles. Cependant, cela peut facilement être adapté à un contexte commercial . Voici quelques exemples où les classificateurs de langage naturel peuvent être utiles :
Pour créer les données de formation, nous pouvons télécharger des pièces d'Anton Tchekhov et de William Shakespeare du projet Gutenberg. Pour configurer l'ingestion de données, nous pouvons exécuter le script Python suivant.
import requests import openai import replicate import os import pandas as pd import random texts = { 'chekhov': 'https://www.gutenberg.org/files/7986/7986-0.txt', 'chekhov_2': 'https://www.gutenberg.org/cache/epub/1755/pg1755.txt', 'shakespeare_midsummer': 'https://www.gutenberg.org/cache/epub/1514/pg1514.txt', 'shakespeare_romeo_juliet': 'https://www.gutenberg.org/cache/epub/1112/pg1112.txt', 'shakespeare_macbeth': 'https://www.gutenberg.org/cache/epub/2264/pg2264.txt', 'shakespeare_hamlet': 'https://www.gutenberg.org/cache/epub/2265/pg2265.txt', }
Maintenant, nous créons le dossier des données d'entraînement et téléchargeons les textes :
if not os.path.exists('training_text'): os.mkdir('training_text') for name, url in texts.items(): print(name) res = requests.get(url) with open(os.path.join('training_text', '%s.txt' % name), 'w') as fp_write: fp_write.write(res.text)
Vous devriez voir des résultats comme celui-ci pour vous montrer que cela a réussi :
chekhov chekhov_2 shakespeare_midsummer shakespeare_romeo_juliet shakespeare_macbeth Shakespeare_hamlet
Vous pouvez également vérifier le dossier training_text pour voir que les fichiers ont été correctement téléchargés.
Nous voulons maintenant relire ces fichiers en mémoire et les diviser en une liste de lignes. Pendant que nous y sommes, nous compterons le nombre de lignes dans chaque fichier.
lines_by_file = {} for fn in os.listdir('training_text'): if not fn.endswith('.txt'): continue with open(os.path.join('training_text', fn)) as fp_file: lines_by_file[fn.split('.')[0]] = '\n'.join(fp_file.readlines()) print(fn, len(lines_by_file[fn.split('.')[0]]))
Vous devriez voir un résultat comme celui-ci :
shakespeare_midsummer.txt 120198 shakespeare_romeo_juliet.txt 179726 shakespeare_macbeth.txt 140022 shakespeare_hamlet.txt 204169 chekhov.txt 419063 chekhov_2.txt 148324
Vient maintenant la partie amusante. Nous voulons diviser les lignes en données d'entraînement réelles. Pour ce faire, nous supprimons d’abord les 1 000 premières et dernières lignes, qui sont occupées par le contenu de l’introduction, de l’en-tête et du pied de page. Ensuite, nous récupérerons le texte restant 50 lignes à la fois. Nous transformerons ensuite les 50 lignes en une paire d'invite et de complétion.
train_data = [] for k in lines_by_file: is_chekhov = 'chekhov' in k useful_lines = lines_by_file[k].split('\n')[1000:-1000] prompt_fmt = "Which playwright wrote the following passage? \n ==== \n %s \n ====" for i in range(0, len(useful_lines), 50): training_set = useful_lines[i: i+50] train_data.append({ 'prompt': prompt_fmt % '\n'.join(training_set), 'completion': 'Anton Chekhov' if is_chekhov else 'William Shakespeare' })
Nous avons donc maintenant clairement défini le problème : à partir de 50 lignes de texte d'une pièce, déterminez si le dramaturge est Anton Chekov ou William Shakespeare. Nous n’avons pas encore fini. Nous devons écrire les données au format jsonl (JSON Lines) pour la formation, et nous souhaitons également réserver quelques échantillons à des fins de test. Exécutez le code suivant comme ceci :
df = pd.DataFrame(train_data) df_chekhov = df[df['completion'] == 'Anton Chekhov'] df_shakespeare = df[df['completion'] == 'William Shakespeare'] chekhov_test_indices = random.sample(df_chekhov.index.tolist(), 15) shakespeare_test_indices = random.sample(df_shakespeare.index.tolist(), 15) df_chekhov_test = df_chekhov.loc[chekhov_test_indices] df_shakespeare_test = df_shakespeare.loc[shakespeare_test_indices] df_chekhov_train = df_chekhov.loc[[i for i in df_chekhov.index if i not in chekhov_test_indices]] df_shakespeare_train = df_shakespeare.loc[[i for i in df_shakespeare.index if i not in shakespeare_test_indices]] pd.concat([df_chekhov_train, df_shakespeare_train]).to_json('chekhov_shakespeare_train.jsonl', orient='records', lines=True) pd.concat([df_chekhov_test, df_shakespeare_test]).to_json('chekhov_shakespeare_test.jsonl', orient='records', lines=True)
Bien sûr, si vous souhaitez utiliser l'intégralité du corpus pour la formation, vous pouvez simplement exécuter
pd.DataFrame(train_data).to_json('output.jsonl', orient='records', lines=True)
.
Nous devons faire deux choses avant de pouvoir invoquer la formation : premièrement, nous devons télécharger les données de formation sur un endroit accessible par réplication. Un moyen très simple de procéder serait de télécharger le fichier dans un bucket Google Cloud, de rendre le bucket et le fichier publics et de fournir l'URL au format https://storage.googleapis.com/<bucket_name>/<file_name>
.
Ensuite, nous devons créer une destination. Pour ce faire, connectez-vous simplement à Replicate (ce que vous pouvez faire via Github OAuth) et créez un nouveau modèle. Une fois le modèle créé et nommé, vous pourrez pousser votre modèle vers cet espace.
Une fois que tout est mis en place, vous pouvez lancer la formation comme ceci :
training = replicate.trainings.create( version="[flant5-large location]", input={ "train_data": "[Data Location]", }, destination="[Destination]" ) print(training)
Vous devriez voir une sortie vous indiquant que la formation commence. Attendez quelques minutes et revenez avec la formation en exécutant le code suivant :
training.reload() print(training)
Vous pouvez également suivre la progression de la formation sur le site Web Replicate. Une fois la formation terminée, vous pouvez recharger l'objet de formation pour obtenir le nom de sortie et passer à l'étape suivante.
Soyez averti qu'il y a des périodes pendant lesquelles les ressources GPU sont rares et vous pouvez obtenir une erreur « échec de la formation ». Si cela vous arrive, attendez quelques heures et réessayez. Il y a une pénurie de GPU, et les fournisseurs de PaaS ne sont pas à l’abri !
D'accord! Maintenant que nous avons notre modèle affiné, nous devons le tester. N'oubliez pas que nous avons réservé 15 passages de Tchekhov et Shakespeare pour tests. Nous pouvons les utiliser ici comme ceci :
for _, row in df_chekhov_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Après une courte période de démarrage, vous devriez voir le résultat imprimé sur la console. Le modèle doit être extrêmement précis et renvoyer à chaque fois « Anton Tchekhov ». Essayons ceci avec Shakespeare :
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Semblable à l’exemple de Tchekhov, vous devriez voir que le modèle est capable d’identifier Shakespeare à chaque fois.
Pour faire bonne mesure, voyons si le modèle de base est capable d'identifier Shakespeare ou Tchekhov :
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('') for _, row in df_chekhov_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Vous devriez voir que le modèle de base est incapable d'identifier de manière fiable le dramaturge pour les mêmes passages. Cela montre que notre réglage fin a donné de nouvelles informations au modèle de manière fiable, et nous avons nous-mêmes construit un classificateur de dramaturge en langage naturel !
Dans l'article d'aujourd'hui, nous avons formé un classificateur de langage naturel simple basé sur Flan-T5, un grand modèle de langage fourni par Google. En raison de sa taille compacte et de sa licence permissive, Flan-T5 peut être formé et déployé sur une infrastructure privée, ce qui le distingue de nombreux autres modèles populaires sur le marché, tels que ChatGPT.
Même si l’exemple d’aujourd’hui était basé sur des données publiques et était résolument non commercial, cette preuve de concept peut être facilement adaptée à de nombreuses autres applications commerciales, comme indiqué ci-dessus. Si vous avez une idée de LLM que vous aimeriez voir se concrétiser, n'hésitez pas à démarrer une conversation en visitant ma page GitHub ou LinkedIn . N'hésitez pas non plus à lire mes précédents articles LLM, dont un sur la création d'un analyseur de documents à l'aide de ChatGPT et la création d'un LLM expert en domaine à l'aide de l'API de réglage fin d'OpenAI .
Bon piratage !