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 !