1 00:00:05,040 --> 00:00:12,000 Bonjour, il s'agit d'une vidéo sur l'API `push_to_hub` pour Tensorflow et Keras. Donc, 2 00:00:12,000 --> 00:00:16,240 pour commencer, nous allons ouvrir notre notebook, et la première chose que vous devrez faire est de vous 3 00:00:16,240 --> 00:00:22,480 connecter à votre compte HuggingFace, par exemple avec la fonction de connexion du notebook. Donc, pour ce faire, 4 00:00:23,040 --> 00:00:28,560 vous appelez simplement la fonction, la fenêtre contextuelle apparaîtra, vous entrez votre nom d'utilisateur et votre mot de passe, 5 00:00:28,560 --> 00:00:34,160 que je vais retirer de mon gestionnaire de mots de passe ici, et vous êtes connecté. Les 6 00:00:34,160 --> 00:00:38,720 deux cellules suivantes préparent tout ce qu'il faut pour l'entraînement. Nous allons donc simplement charger un jeu de données, 7 00:00:38,720 --> 00:00:42,960 nous allons tokeniser ce jeu de données, puis nous allons charger notre modèle et le compiler 8 00:00:42,960 --> 00:00:47,040 avec l'optimiseur Adam standard. Je vais donc tout exécuter. 9 00:00:49,600 --> 00:00:53,760 Nous attendrons quelques secondes et tout devrait être prêt pour l'entraînement. 10 00:00:56,600 --> 00:01:03,200 D'accord, nous sommes maintenant prêts pour entraîner. Je vais vous montrer les deux manières de 11 00:01:03,200 --> 00:01:07,520 transférer votre modèle vers le Hub. Donc, la première est avec `PushToHubCallback`. 12 00:01:08,080 --> 00:01:14,640 Ainsi, un « Callback » dans Keras est une fonction qui est appelée régulièrement pendant l'entraînement. Vous pouvez la configurer pour qu'elle soit 13 00:01:14,640 --> 00:01:20,640 appelé après un certain nombre d'étapes, ou à chaque époque, ou même une seule fois à la fin de l'entraînement. 14 00:01:22,480 --> 00:01:27,600 Ainsi, de nombreux « Callback » dans Keras, par exemple, contrôlent le taux 'apprentissage de décroissance sur plateau 15 00:01:28,320 --> 00:01:34,400 et des choses comme ça. Et donc ce « Callback », par défaut, enregistrera votre modèle dans le Hub une fois à 16 00:01:34,400 --> 00:01:39,200 chaque époque. Et c'est vraiment utile, surtout si votre entraînement est très long, car cela signifie que 17 00:01:39,200 --> 00:01:43,680 vous pouvez reprendre à partir de cette sauvegarde, donc vous obtenez cette sauvegarde automatique de votre modèle dans le cloud, et vous pouvez 18 00:01:43,680 --> 00:01:49,760 même exécuter une inférence avec les checkpoints de votre modèle qui ont été téléchargés par ce « Callback ». 19 00:01:50,720 --> 00:01:55,120 Et cela signifie que vous pouvez, vous savez, exécuter des entrées de test et voir réellement comment 20 00:01:55,120 --> 00:02:00,560 votre modèle fonctionne à différentes étapes de l'entraînement, ce qui est une fonctionnalité vraiment intéressante. 21 00:02:01,280 --> 00:02:06,560 Nous allons donc ajouter le `PushToHubCallback` qui ne prend que quelques arguments. Le premier argument 22 00:02:06,560 --> 00:02:11,920 est donc le répertoire temporaire dans lequel les fichiers vont être enregistrés avant d'être téléchargés sur le Hub. 23 00:02:11,920 --> 00:02:16,880 Le deuxième argument est le tokenizer, et le troisième argument ici est l'argument mot clé 24 00:02:17,600 --> 00:02:22,160 `hub_model_id`. C'est donc le nom sous lequel il sera enregistré sur le Hub d'HuggingFace. 25 00:02:23,200 --> 00:02:29,760 Vous pouvez également télécharger vers un compte d'organisation en ajoutant simplement le nom de l'organisation avant 26 00:02:29,760 --> 00:02:34,320 le nom du dépôt avec une barre oblique comme celle-ci. Vous n'avez donc probablement pas les autorisations pour télécharger vers 27 00:02:34,320 --> 00:02:38,640 l'organisation Hugging Face, si vous le faites, veuillez signaler un bogue et nous le faire savoir de toute urgence. 28 00:02:40,640 --> 00:02:44,000 Mais si vous avez accès à votre propre organisation, vous pouvez utiliser la 29 00:02:44,000 --> 00:02:47,600 même approche pour télécharger des modèles sur leur compte plutôt que sur votre propre 30 00:02:49,280 --> 00:02:56,080 jeu de modèles. Ainsi, une fois que vous avez effectué votre `callbacks`, vous l'ajoutez simplement à la liste `callbacks` 31 00:02:56,080 --> 00:03:01,280 lorsque vous êtes appelé `model.fit()` et tout est téléchargé pour vous à partir de là, et vous n'avez 32 00:03:01,280 --> 00:03:06,320 plus à vous inquiéter. La deuxième façon d'importer un modèle consiste à appeler `model.push_to_hub()`. 33 00:03:06,880 --> 00:03:11,920 Il s'agit donc plutôt d'une méthode ponctuelle : elle n'est pas appelée régulièrement pendant l'entraînement. Vous pouvez simplement 34 00:03:11,920 --> 00:03:17,680 l'appeler manuellement chaque fois que vous souhaitez télécharger un modèle sur le Hub. Nous vous recommandons donc de l'exécuter 35 00:03:17,680 --> 00:03:22,720 après la fin de l'entraînement, juste vous assurer que vous avez un message de commit pour garantir 36 00:03:22,720 --> 00:03:27,280 qu'il s'agissait de la version finale du modèle, à la fin de l'entraînement. Et cela garantit simplement que 37 00:03:28,160 --> 00:03:32,000 vous travaillez avec le modèle d'entraînement définitif et que vous n'utilisez pas accidentellement un modèle 38 00:03:32,000 --> 00:03:36,720 provenant d'un checkpoint quelque part en cours de route. Je vais donc exécuter ces deux cellules 39 00:03:38,800 --> 00:03:42,320 puis je vais couper la vidéo ici, simplement parce que l'entraînement va prendre quelques 40 00:03:42,320 --> 00:03:46,160 minutes, et je vais donc passer à la fin de cela, lorsque les modèles ont tous été téléchargés, 41 00:03:46,160 --> 00:03:50,880 et je vais vous montrer comment vous pouvez accéder aux modèles dans le Hub et les autres choses que 42 00:03:50,880 --> 00:03:58,400 vous pouvez faire avec eux à partir de là. D'accord, nous sommes de retour et notre modèle a été téléchargé, à la 43 00:03:58,960 --> 00:04:03,760 fois par le `PushToHubCallback` et également par notre appel à `model.push_to_hub()` après l'entraînement. 44 00:04:04,720 --> 00:04:10,320 Donc tout s'annonce bien ! Alors maintenant, si nous passons sur mon profil sur HuggingFace, que vous pouvez 45 00:04:10,320 --> 00:04:15,760 y accéder en cliquant simplement sur le bouton de profil dans le menu déroulant, nous pouvons voir que le modèle `bert-fine-tuned- 46 00:04:15,760 --> 00:04:20,560 cola` est ici et a été mis à jour il y a 3 minutes. Il figurera donc toujours en haut de votre liste, car 47 00:04:20,560 --> 00:04:25,280 ils sont triés en fonction de leur date de mise à jour récente. Et nous pouvons commencer à interroger notre modèle immédiatement ! 48 00:04:26,640 --> 00:04:36,720 Le jeu de données sur lequel nous avons entraîné est donc le jeu de données GLUE CoLA, et CoLA est l'acronyme de « Corpus 49 00:04:36,720 --> 00:04:42,560 of Linguistic Acceptability ». Cela signifie donc que le modèle est entraîné pour décider si une 50 00:04:42,560 --> 00:04:49,040 phrase est grammaticalement ou linguistiquement correcte, ou s'il y a un problème avec elle. Par exemple, 51 00:04:49,680 --> 00:04:54,400 nous pourrions dire « This is a legitimate sentence » et nous espérons qu'il réalise qu'il s'agit en 52 00:04:54,400 --> 00:05:00,880 fait d'une phrase légitime. Donc, le chargement du modèle peut prendre quelques secondes lorsque vous 53 00:05:00,880 --> 00:05:05,200 l'appelez pour la première fois. Je peux donc supprimer quelques secondes de cette vidéo ici. 54 00:05:07,680 --> 00:05:14,160 Ok, nous sommes de retour ! Le modèle a été chargé et nous avons obtenu un résultat, mais il y a un problème évident ici. 55 00:05:14,160 --> 00:05:19,680 Ces étiquettes ne nous indiquent donc pas vraiment quelles catégories le modèle a réellement attribuées à 56 00:05:19,680 --> 00:05:26,720 cette phrase d'entrée. Donc, si nous voulons résoudre ce problème, nous voulons nous assurer que la configuration du modèle a les 57 00:05:26,720 --> 00:05:31,920 noms corrects pour chacune des classes d'étiquettes, puis nous voulons importer cette configuration. Nous pouvons donc le faire 58 00:05:31,920 --> 00:05:38,480 ici. Pour obtenir les `label_names`, nous pouvons les obtenir à partir du jeu de données que nous avons chargé, à partir de l'attribut `.features` dont 59 00:05:38,480 --> 00:05:44,160 il dispose. Et puis nous pouvons créer des dictionnaires `id2label` et `label2id` 60 00:05:45,200 --> 00:05:51,040 et les attribuer simplement à la configuration du modèle. Puis nous pouvons simplement pousser notre configuration mise à jour et cela 61 00:05:51,040 --> 00:05:58,080 remplacera la configuration existante dans le dépôt sur le Hub. Donc cela vient d'être fait. Donc maintenant si nous revenons ici, 62 00:05:58,080 --> 00:06:02,720 je vais utiliser une phrase légèrement différente parce que les sorties pour les phrases sont parfois 63 00:06:02,720 --> 00:06:07,600 mises en cache, et donc si nous voulons générer de nouveaux résultats je vais utiliser quelque chose de légèrement différent. 64 00:06:07,600 --> 00:06:13,840 Essayons donc une phrase incorrecte, donc ce n'est pas une grammaire anglaise valide et j'espère que le modèle le 65 00:06:13,840 --> 00:06:17,360 verra. Il va se recharger ici, donc je vais couper quelques secondes ici, 66 00:06:18,480 --> 00:06:26,400 et ensuite nous verrons ce que le modèle va dire. Ok ! La confiance du modèle n'est donc pas très bonne 67 00:06:26,400 --> 00:06:31,440 car bien sûr nous n'avons pas du tout optimisé nos hyperparamètres, mais il a décidé que 68 00:06:31,440 --> 00:06:37,200 cette phrase est plus susceptible d'être inacceptable qu'acceptable. Vraisemblablement, si nous essayions un peu 69 00:06:37,200 --> 00:06:41,280 plus avec l'entraînement, nous pourrions obtenir une perte de validation beaucoup plus faible et donc les prédictions du modèle 70 00:06:41,280 --> 00:06:47,040 seraient plus précises. Mais essayons à nouveau notre phrase d'origine. Bien sûr, en 71 00:06:47,040 --> 00:06:52,560 raison du problème de mise en cache, nous constatons que les réponses d'origine sont inchangées. 72 00:06:52,560 --> 00:06:58,160 Essayons donc une phrase différente et valide. Essayons donc « This is a valid English sentence. ». 73 00:06:59,920 --> 00:07:03,680 Et nous voyons que maintenant le modèle décide correctement qu'il a une très forte probabilité d'être 74 00:07:03,680 --> 00:07:09,840 acceptable et une très faible probabilité d'être inacceptable. Vous pouvez donc utiliser cette API d'inférence 75 00:07:09,840 --> 00:07:14,320 même avec les checkpoints téléchargés pendant l'entraînement. Il peut donc être très intéressant de voir comment 76 00:07:15,200 --> 00:07:19,680 les prédictions du modèle pour les exemples d'entrées changent à chaque époque d'entraînement. 77 00:07:21,920 --> 00:07:27,040 De plus, le modèle que nous avons importé sera accessible pour vous et, s'il est partagé publiquement, 78 00:07:27,040 --> 00:07:32,240 par n'importe qui d'autre. Donc, si vous voulez charger ce modèle, tout ce que vous ou quelqu'un d'autre devez faire 79 00:07:34,160 --> 00:07:40,640 est de le charger dans un pipeline ou vous pouvez simplement le charger avec, par exemple, 80 00:07:40,640 --> 00:07:50,960 `TFAutoModelForSequenceClassification`. Puis pour le nom, vous passerez simplement le chemin 81 00:07:50,960 --> 00:07:58,560 vers le dépôt que vous souhaitez charger - ou télécharger, excusez-moi. Donc, si je veux utiliser à nouveau ce modèle, 82 00:07:58,560 --> 00:08:02,880 si je veux le télécharger à partir du Hub, j'exécute simplement cette une ligne de code, le modèle sera téléchargé 83 00:08:05,280 --> 00:08:11,200 et avec un peu de chance, il sera prêt à être finetuner sur un autre jeu de données, 84 00:08:11,200 --> 00:08:17,760 faire des prédictions avec ou faire tout ce que vous voulez faire. C'était donc un bref aperçu de la manière dont, 85 00:08:17,760 --> 00:08:21,280 après ou pendant votre entraînement, vous pouvez télécharger des modèles dans le Hub. 86 00:08:21,280 --> 00:08:26,800 Vous pouvez le sauvegarder, vous pouvez reprendre l'entraînement à partir de là et vous pouvez obtenir des résultats d'inférence à partir 87 00:08:26,800 --> 00:08:37,040 des modèles que vous avez téléchargés. Alors merci, et j'espère vous voir dans une future vidéo !