subtitles/fr/29_write-your-training-loop-in-pytorch.srt (216 lines of code) (raw):
1
00:00:05,430 --> 00:00:07,240
Écrivez votre propre boucle d'entraînement dans PyTorch.
2
00:00:07,240 --> 00:00:11,759
Dans cette vidéo, nous verrons comment nous pouvons faire le même finetuning que dans la
3
00:00:11,759 --> 00:00:14,120
vidéo sur l'API Trainer, mais sans compter sur cette classe.
4
00:00:14,120 --> 00:00:20,369
De cette façon, vous pourrez facilement personnaliser chaque étape de la boucle d'entraînement en fonction de vos besoins.
5
00:00:20,369 --> 00:00:23,859
Ceci est également très utile pour déboguer manuellement quelque chose qui n'allait pas avec l'
6
00:00:23,859 --> 00:00:26,189
API Trainer.
7
00:00:26,189 --> 00:00:31,200
Avant de nous plonger dans le code, voici une esquisse d'une boucle d'entraînement : nous prenons un batch de
8
00:00:31,200 --> 00:00:33,469
données d'entraînement et le transmettons au modèle.
9
00:00:33,469 --> 00:00:36,600
Avec les étiquettes, nous pouvons alors calculer une perte.
10
00:00:36,600 --> 00:00:41,130
Ce nombre n'est pas utile en soi, mais est utilisé pour calculer les gradients de nos
11
00:00:41,130 --> 00:00:46,750
poids de modèle, c'est-à-dire la dérivée de la perte par rapport à chaque poids de modèle.
12
00:00:46,750 --> 00:00:51,920
Ces gradients sont ensuite utilisés par l'optimiseur pour mettre à jour les poids du modèle et les
13
00:00:51,920 --> 00:00:53,360
améliorer un peu.
14
00:00:53,360 --> 00:00:56,170
Nous répétons ensuite le processus avec un nouveau batch de données d'apprentissage.
15
00:00:56,170 --> 00:01:00,969
Si tout cela n'est pas clair, n'hésitez pas à reprendre votre
16
00:01:00,969 --> 00:01:02,240
cours d'apprentissage profond préféré.
17
00:01:02,240 --> 00:01:07,560
Nous utiliserons à nouveau le jeu de données GLUE MRPC, et nous avons vu comment prétraiter les données
18
00:01:07,560 --> 00:01:10,439
à l'aide de la bibliothèque Datasets avec le rembourrage dynamique.
19
00:01:10,439 --> 00:01:15,549
Découvrez les vidéos liées ci-dessous si vous ne les avez pas déjà vues.
20
00:01:15,549 --> 00:01:20,060
Cela fait, nous n'avons plus qu'à définir les DataLoaders PyTorch, qui seront chargés de
21
00:01:20,060 --> 00:01:24,480
convertir les éléments de notre jeu de données en batchs.
22
00:01:24,480 --> 00:01:33,890
Nous utilisons notre `DataCollatorForPadding` comme fonction d'assemblement et mélangeons l'ensemble d'entraînementpour s'assurer que nous voyons pas tous les échantillons dans le même ordre.
23
00:01:33,890 --> 00:01:39,460
Pour vérifier que tout fonctionne comme prévu, nous essayons de récupérer un batch de données et de l'
24
00:01:39,460 --> 00:01:40,460
inspecter.
25
00:01:40,460 --> 00:01:44,790
Comme nos éléments de jeu de données, c'est un dictionnaire, mais cette fois les valeurs ne sont pas une seule
26
00:01:44,790 --> 00:01:50,460
liste d'entiers, mais un tenseur de forme de taille de batch par longueur de séquence.
27
00:01:50,460 --> 00:01:52,869
L'étape suivante consiste à envoyer les données d'entraînement dans notre modèle.
28
00:01:52,869 --> 00:01:56,790
Pour cela, nous devrons créer notre modèle.
29
00:01:56,790 --> 00:02:01,240
Comme on l'a vu dans la vidéo sur l'API des modèles, nous utilisons la méthode `from_pretrained` et ajustons le nombre
30
00:02:01,240 --> 00:02:06,159
d'étiquettes au nombre de classes que nous avons sur cet jeu de données, ici deux.
31
00:02:06,159 --> 00:02:11,020
Encore une fois, pour être sûr que tout se passe bien, nous passons le batch que nous avons saisi à notre modèle
32
00:02:11,020 --> 00:02:12,640
et vérifions qu'il n'y a pas d'erreur.
33
00:02:12,640 --> 00:02:17,780
Si les étiquettes sont fournies, les modèles de la bibliothèque Transformers renvoient toujours
34
00:02:17,780 --> 00:02:18,840
directement la perte.
35
00:02:18,840 --> 00:02:24,129
Nous pourrons faire `loss.backward()` pour calculer tous les gradients, et nous aurons alors besoin d'un optimiseur
36
00:02:24,129 --> 00:02:26,480
pour faire l'étape d'apprentissage.
37
00:02:26,480 --> 00:02:30,800
Nous utilisons ici l'optimiseur AdamW, qui est une variante d'Adam avec une décroissance de poids appropriée,
38
00:02:30,800 --> 00:02:35,040
mais vous pouvez choisir n'importe quel optimiseur PyTorch que vous aimez.
39
00:02:35,040 --> 00:02:39,519
En utilisant la perte précédente et en calculant les gradients avec `loss.backward()`, nous vérifions que
40
00:02:39,519 --> 00:02:43,510
nous pouvons faire l'étape d'optimisation sans aucune erreur.
41
00:02:43,510 --> 00:02:47,580
N'oubliez pas de mettre `zero_grad()` par la suite, sinon à l'étape suivante, ils seront ajoutés
42
00:02:47,580 --> 00:02:49,659
aux gradients que vous calculez !
43
00:02:49,659 --> 00:02:53,620
Nous pourrions déjà écrire notre boucle d'entraînement, mais nous ajouterons deux autres choses pour la rendre
44
00:02:53,620 --> 00:02:55,590
aussi bonne que possible.
45
00:02:55,590 --> 00:03:01,150
Le premier est un planificateur de taux d'apprentissage, pour réduire progressivement notre taux d'apprentissage à
46
00:03:01,150 --> 00:03:02,150
0.
47
00:03:02,150 --> 00:03:06,180
La fonction `get_scheduler` de la bibliothèque Transformers n'est qu'une fonction pratique pour
48
00:03:06,180 --> 00:03:12,760
créer facilement un tel planificateur0 Vous pouvez à nouveau utiliser n'importe quel planificateur de taux d'apprentissage PyTorch à la place.
49
00:03:12,760 --> 00:03:17,299
Enfin, si nous voulons que notre entraînement prenne quelques minutes au lieu de quelques heures,
50
00:03:17,299 --> 00:03:19,580
nous devrons utiliser un GPU.
51
00:03:19,580 --> 00:03:24,340
La première étape consiste à en obtenir un, par exemple en utilisant un notebook Colab.
52
00:03:24,340 --> 00:03:29,090
Ensuite, vous devez réellement envoyer votre modèle et les données d'entraînement à l'aide d'un appareil Torch.
53
00:03:29,090 --> 00:03:35,659
Vérifiez les lignes suivantes pour avoir un appareil CUDA ou préparez vous à ce que votre entraînement dure plus d'une heure.
54
00:03:35,659 --> 00:03:38,450
Nous pouvons maintenant tout assembler !
55
00:03:38,450 --> 00:03:42,470
Nous mettons d'abord notre modèle en mode d'entraînement (ce qui activera le comportement d'entraînement pour certaines
56
00:03:42,470 --> 00:03:47,900
couches comme la Dropout), puis parcourons le nombre d'époques que nous avons sélectionnées et toutes les données dans
57
00:03:47,900 --> 00:03:50,130
notre chargeur de données d'entraînement.
58
00:03:50,130 --> 00:03:54,560
Ensuite, nous passons par toutes les étapes que nous avons déjà vues : envoyer les données au GPU, calculer
59
00:03:54,560 --> 00:03:57,870
les sorties du modèle, et en particulier la perte.
60
00:03:57,870 --> 00:04:02,040
Utilisez la perte pour calculer les gradients, puis effectuez une étape d'apprentissage avec l'optimiseur.
61
00:04:02,040 --> 00:04:06,760
Mettez à jour le taux d'apprentissage dans notre planificateur pour la prochaine itération et mettez à 0 les gradients
62
00:04:06,760 --> 00:04:09,340
de l'optimiseur.
63
00:04:09,340 --> 00:04:13,590
Une fois cela terminé, nous pouvons évaluer notre modèle très facilement avec une métrique de la
64
00:04:13,590 --> 00:04:14,730
bibliothèque Datasets.
65
00:04:14,730 --> 00:04:22,470
Nous mettons d'abord notre modèle en mode d'évaluation, puis parcourons toutes les données dans le
66
00:04:22,470 --> 00:04:23,900
chargeur de données d'évaluation.
67
00:04:23,900 --> 00:04:27,480
Comme nous l'avons vu dans la vidéo sur l'API Trainer, le modèle génère des logits et nous devons appliquer
68
00:04:27,480 --> 00:04:31,350
la fonction argmax pour les convertir en prédictions.
69
00:04:31,350 --> 00:04:36,910
L'objet `metric` a alors une méthode `add_batch` que nous pouvons utiliser pour lui envoyer ces prédictions intermédiaires.
70
00:04:36,910 --> 00:04:40,590
Une fois la boucle d'évaluation terminée, nous n'avons plus qu'à appeler la méthode de calcul pour obtenir nos
71
00:04:40,590 --> 00:04:41,620
résultats finaux !
72
00:04:41,620 --> 00:04:50,760
Félicitations, vous avez maintenant finetuné un modèle tout seul !