migration.md 15.1 KB
Newer Older
Joao Gante's avatar
Joao Gante committed
1
2
<!---
Copyright 2020 The HuggingFace Team. Tutti i diritti riservati.
3

Joao Gante's avatar
Joao Gante committed
4
5
6
Concesso in licenza in base alla Licenza Apache, Versione 2.0 (la "Licenza");
non 猫 possibile utilizzare questo file se non in conformit脿 con la Licenza.
脠 possibile ottenere una copia della Licenza all'indirizzo
7

Joao Gante's avatar
Joao Gante committed
8
http://www.apache.org/licenses/LICENSE-2.0
9

Joao Gante's avatar
Joao Gante committed
10
11
12
13
14
A meno che non sia richiesto dalla legge applicabile o concordato per iscritto, il software
distribuito con la Licenza 猫 distribuito su BASE "COS脤 COM'脠",
SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, espresse o implicite.
Per la lingua specifica vedi la Licenza che regola le autorizzazioni e
le limitazioni ai sensi della STESSA.
15
16
17
18

鈿狅笍 Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
rendered properly in your Markdown viewer.

Joao Gante's avatar
Joao Gante committed
19
-->
20

Joao Gante's avatar
Joao Gante committed
21
# Migrazione da pacchetti precedenti
22

Joao Gante's avatar
Joao Gante committed
23
## Migrazione da transformers `v3.x` a `v4.x`
24

Joao Gante's avatar
Joao Gante committed
25
26
Un paio di modifiche sono state introdotte nel passaggio dalla versione 3 alla versione 4. Di seguito 猫 riportato un riepilogo delle
modifiche previste:
27

Joao Gante's avatar
Joao Gante committed
28
#### 1. AutoTokenizer e pipeline ora utilizzano tokenizer veloci (rust) per impostazione predefinita.
29

Joao Gante's avatar
Joao Gante committed
30
I tokenizer python e rust hanno all'incirca le stesse API, ma i tokenizer rust hanno un set di funzionalit脿 pi霉 completo.
31

Joao Gante's avatar
Joao Gante committed
32
33
34
Ci貌 introduce due modifiche sostanziali:
- La gestione dei token in overflow tra i tokenizer Python e Rust 猫 diversa.
- I tokenizers di rust non accettano numeri interi nei metodi di codifica.
35

Joao Gante's avatar
Joao Gante committed
36
##### Come ottenere lo stesso comportamento di v3.x in v4.x
37

Joao Gante's avatar
Joao Gante committed
38
39
- Le pipeline ora contengono funzionalit脿 aggiuntive pronte all'uso. Vedi la [pipeline di classificazione dei token con il flag `grouped_entities`](main_classes/pipelines#transformers.TokenClassificationPipeline).
- Gli auto-tokenizer ora restituiscono tokenizer rust. Per ottenere invece i tokenizer python, l'utente deve usare il flag `use_fast` impostandolo `False`:
40

Joao Gante's avatar
Joao Gante committed
41
42
43
Nella versione `v3.x`:
```py
from transformers import AutoTokenizer
44

45
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased")
Joao Gante's avatar
Joao Gante committed
46
47
48
49
```
per ottenere lo stesso nella versione `v4.x`:
```py
from transformers import AutoTokenizer
50

51
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-cased", use_fast=False)
Joao Gante's avatar
Joao Gante committed
52
```
53

Joao Gante's avatar
Joao Gante committed
54
#### 2. SentencePiece 猫 stato rimosso dalle dipendenze richieste
55

Joao Gante's avatar
Joao Gante committed
56
Il requisito sulla dipendenza SentencePiece 猫 stato rimosso da `setup.py`. 脠 stato fatto per avere un canale su anaconda cloud senza basarsi su `conda-forge`. Ci貌 significa che i tokenizer che dipendono dalla libreria SentencePiece non saranno disponibili con un'installazione standard di `transformers`.
57

Joao Gante's avatar
Joao Gante committed
58
59
60
61
62
63
64
65
66
Ci貌 include le versioni **lente** di:
- `XLNetTokenizer`
- `AlbertTokenizer`
- `CamembertTokenizer`
- `MBartTokenizer`
- `PegasusTokenizer`
- `T5Tokenizer`
- `ReformerTokenizer`
- `XLMRobertaTokenizer`
67

Joao Gante's avatar
Joao Gante committed
68
##### Come ottenere lo stesso comportamento della v3.x nella v4.x
69

Joao Gante's avatar
Joao Gante committed
70
Per ottenere lo stesso comportamento della versione `v3.x`, devi installare anche `sentencepiece`:
71

Joao Gante's avatar
Joao Gante committed
72
73
74
75
76
77
78
79
80
81
82
83
84
Nella versione `v3.x`:
```bash
pip install transformers
```
per ottenere lo stesso nella versione `v4.x`:
```bash
pip install transformers[sentencepiece]
```
o
```bash
pip install transformers stentencepiece
```
#### 3. L'architettura delle repo 猫 stato aggiornata in modo che ogni modello abbia la propria cartella
85

Joao Gante's avatar
Joao Gante committed
86
Con l鈥檃ggiunta di nuovi modelli, il numero di file nella cartella `src/transformers` continua a crescere e diventa pi霉 difficile navigare e capire. Abbiamo fatto la scelta di inserire ogni modello e i file che lo accompagnano nelle proprie sottocartelle.
87

Joao Gante's avatar
Joao Gante committed
88
Si tratta di una modifica sostanziale in quanto l'importazione di layer intermedi utilizzando direttamente il modulo di un modello deve essere eseguita tramite un percorso diverso.
89

Joao Gante's avatar
Joao Gante committed
90
##### Come ottenere lo stesso comportamento della v3.x nella v4.x
91

Joao Gante's avatar
Joao Gante committed
92
Per ottenere lo stesso comportamento della versione `v3.x`, devi aggiornare il percorso utilizzato per accedere ai layer.
93

Joao Gante's avatar
Joao Gante committed
94
95
96
97
98
99
100
101
Nella versione `v3.x`:
```bash
from transformers.modeling_bert import BertLayer
```
per ottenere lo stesso nella versione `v4.x`:
```bash
from transformers.models.bert.modeling_bert import BertLayer
```
102

Joao Gante's avatar
Joao Gante committed
103
#### 4. Impostare l'argomento `return_dict` su `True` per impostazione predefinita
104

Joao Gante's avatar
Joao Gante committed
105
L'[argomento `return_dict`](main_classes/output) abilita la restituzione di oggetti python dict-like contenenti gli output del modello, invece delle tuple standard. Questo oggetto 猫 self-documented poich茅 le chiavi possono essere utilizzate per recuperare valori, comportandosi anche come una tupla e gli utenti possono recuperare oggetti per indexing o slicing.
106

Joao Gante's avatar
Joao Gante committed
107
Questa 猫 una modifica sostanziale poich茅 la tupla non pu貌 essere decompressa: `value0, value1 = outputs` non funzioner脿.
108

Joao Gante's avatar
Joao Gante committed
109
##### Come ottenere lo stesso comportamento della v3.x nella v4.x
110

Joao Gante's avatar
Joao Gante committed
111
Per ottenere lo stesso comportamento della versione `v3.x`, specifica l'argomento `return_dict` come `False`, sia nella configurazione del modello che nel passaggio successivo.
112

Joao Gante's avatar
Joao Gante committed
113
114
Nella versione `v3.x`:
```bash
115
model = BertModel.from_pretrained("google-bert/bert-base-cased")
Joao Gante's avatar
Joao Gante committed
116
117
118
119
outputs = model(**inputs)
```
per ottenere lo stesso nella versione `v4.x`:
```bash
120
model = BertModel.from_pretrained("google-bert/bert-base-cased")
Joao Gante's avatar
Joao Gante committed
121
122
123
124
outputs = model(**inputs, return_dict=False)
```
o
```bash
125
model = BertModel.from_pretrained("google-bert/bert-base-cased", return_dict=False)
Joao Gante's avatar
Joao Gante committed
126
127
128
129
130
131
outputs = model(**inputs)
```

#### 5. Rimozione di alcuni attributi deprecati

Gli attributi sono stati rimossi se deprecati da almeno un mese. L'elenco completo degli attributi obsoleti 猫 disponibile in [#8604](https://github.com/huggingface/transformers/pull/8604).
132

Joao Gante's avatar
Joao Gante committed
133
Ecco un elenco di questi attributi/metodi/argomenti e quali dovrebbero essere le loro sostituzioni:
134

Joao Gante's avatar
Joao Gante committed
135
136
137
138
139
140
141
142
143
144
145
146
In diversi modelli, le etichette diventano coerenti con gli altri modelli:
- `masked_lm_labels` diventa `labels` in `AlbertForMaskedLM` e `AlbertForPreTraining`.
- `masked_lm_labels` diventa `labels` in `BertForMaskedLM` e `BertForPreTraining`.
- `masked_lm_labels` diventa `labels` in `DistilBertForMaskedLM`.
- `masked_lm_labels` diventa `labels` in `ElectraForMaskedLM`.
- `masked_lm_labels` diventa `labels` in `LongformerForMaskedLM`.
- `masked_lm_labels` diventa `labels` in `MobileBertForMaskedLM`.
- `masked_lm_labels` diventa `labels` in `RobertaForMaskedLM`.
- `lm_labels` diventa `labels` in `BartForConditionalGeneration`.
- `lm_labels` diventa `labels` in `GPT2DoubleHeadsModel`.
- `lm_labels` diventa `labels` in `OpenAIGPTDoubleHeadsModel`.
- `lm_labels` diventa `labels` in `T5ForConditionalGeneration`.
147

Joao Gante's avatar
Joao Gante committed
148
149
150
151
152
In diversi modelli, il meccanismo di memorizzazione nella cache diventa coerente con gli altri:
- `decoder_cached_states` diventa `past_key_values` in tutti i modelli BART-like, FSMT e T5.
- `decoder_past_key_values` diventa `past_key_values` in tutti i modelli BART-like, FSMT e T5.
- `past` diventa `past_key_values` in tutti i modelli CTRL.
- `past` diventa `past_key_values` in tutti i modelli GPT-2.
153

Joao Gante's avatar
Joao Gante committed
154
155
156
157
Per quanto riguarda le classi tokenizer:
- L'attributo tokenizer `max_len` diventa `model_max_length`.
- L'attributo tokenizer `return_lengths` diventa `return_length`.
- L'argomento di codifica del tokenizer `is_pretokenized` diventa `is_split_into_words`.
158

Joao Gante's avatar
Joao Gante committed
159
160
161
162
163
164
165
166
167
Per quanto riguarda la classe `Trainer`:
- L'argomento `tb_writer` di `Trainer` 猫 stato rimosso in favore della funzione richiamabile `TensorBoardCallback(tb_writer=...)`.
- L'argomento `prediction_loss_only` di `Trainer` 猫 stato rimosso in favore dell'argomento di classe `args.prediction_loss_only`.
- L'attributo `data_collator` di `Trainer` sar脿 richiamabile.
- Il metodo `_log` di `Trainer` 猫 deprecato a favore di `log`.
- Il metodo `_training_step` di `Trainer` 猫 deprecato a favore di `training_step`.
- Il metodo `_prediction_loop` di `Trainer` 猫 deprecato a favore di `prediction_loop`.
- Il metodo `is_local_master` di `Trainer` 猫 deprecato a favore di `is_local_process_zero`.
- Il metodo `is_world_master` di `Trainer` 猫 deprecato a favore di `is_world_process_zero`.
168

Joao Gante's avatar
Joao Gante committed
169
170
Per quanto riguarda la classe `TrainingArguments`:
- L'argomento `evaluate_during_training` di `TrainingArguments` 猫 deprecato a favore di `evaluation_strategy`.
171

Joao Gante's avatar
Joao Gante committed
172
173
174
Per quanto riguarda il modello Transfo-XL:
- L'attributo di configurazione `tie_weight` di Transfo-XL diventa `tie_words_embeddings`.
- Il metodo di modellazione `reset_length` di Transfo-XL diventa `reset_memory_length`.
175

Joao Gante's avatar
Joao Gante committed
176
177
Per quanto riguarda le pipeline:
- L'argomento `topk` di `FillMaskPipeline` diventa `top_k`.
178
179
180



Joao Gante's avatar
Joao Gante committed
181
## Passaggio da pytorch-transformers a 馃 Transformers
182

Joao Gante's avatar
Joao Gante committed
183
Ecco un breve riepilogo di ci貌 a cui prestare attenzione durante il passaggio da `pytorch-transformers` a 馃 Transformers.
184

Joao Gante's avatar
Joao Gante committed
185
### L鈥檕rdine posizionale di alcune parole chiave di input dei modelli (`attention_mask`, `token_type_ids`...) 猫 cambiato
186

Joao Gante's avatar
Joao Gante committed
187
Per usare Torchscript (vedi #1010, #1204 e #1195) l'ordine specifico delle **parole chiave di input** di alcuni modelli (`attention_mask`, `token_type_ids`...) 猫 stato modificato.
188

Joao Gante's avatar
Joao Gante committed
189
Se inizializzavi i modelli usando parole chiave per gli argomenti, ad esempio `model(inputs_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)`, questo non dovrebbe causare alcun cambiamento.
190

Joao Gante's avatar
Joao Gante committed
191
Se inizializzavi i modelli con input posizionali per gli argomenti, ad esempio `model(inputs_ids, attention_mask, token_type_ids)`, potrebbe essere necessario ricontrollare l'ordine esatto degli argomenti di input.
192

Joao Gante's avatar
Joao Gante committed
193
## Migrazione da pytorch-pretrained-bert
194

Joao Gante's avatar
Joao Gante committed
195
Ecco un breve riepilogo di ci貌 a cui prestare attenzione durante la migrazione da `pytorch-pretrained-bert` a 馃 Transformers
196

Joao Gante's avatar
Joao Gante committed
197
### I modelli restituiscono sempre `tuple`
198

Joao Gante's avatar
Joao Gante committed
199
La principale modifica di rilievo durante la migrazione da `pytorch-pretrained-bert` a 馃 Transformers 猫 che il metodo dei modelli di previsione d脿 sempre una `tupla` con vari elementi a seconda del modello e dei parametri di configurazione.
200

Joao Gante's avatar
Joao Gante committed
201
202
203
Il contenuto esatto delle tuple per ciascun modello 猫 mostrato in dettaglio nelle docstring dei modelli e nella [documentazione](https://huggingface.co/transformers/).

In quasi tutti i casi, andr脿 bene prendendo il primo elemento dell'output come quello che avresti precedentemente utilizzato in `pytorch-pretrained-bert`.
204
205

Ecco un esempio di conversione da `pytorch-pretrained-bert`
Joao Gante's avatar
Joao Gante committed
206
 a 馃 Transformers per un modello di classificazione `BertForSequenceClassification`:
207

Joao Gante's avatar
Joao Gante committed
208
209
```python
# Carichiamo il nostro modello
210
model = BertForSequenceClassification.from_pretrained("google-bert/bert-base-uncased")
211

Joao Gante's avatar
Joao Gante committed
212
213
# Se usavi questa riga in pytorch-pretrained-bert :
loss = model(input_ids, labels=labels)
214

Joao Gante's avatar
Joao Gante committed
215
216
217
# Ora usa questa riga in 馃 Transformers per estrarre la perdita dalla tupla di output:
outputs = model(input_ids, labels=labels)
loss = outputs[0]
218

Joao Gante's avatar
Joao Gante committed
219
220
# In 馃 Transformers puoi anche avere accesso ai logit:
loss, logits = outputs[:2]
221

Joao Gante's avatar
Joao Gante committed
222
# Ed anche agli attention weight se configuri il modello per restituirli (e anche altri output, vedi le docstring e la documentazione)
223
model = BertForSequenceClassification.from_pretrained(" google-bert/bert-base-uncased", output_attentions=True)
Joao Gante's avatar
Joao Gante committed
224
225
226
outputs = model(input_ids, labels=labels)
loss, logits, attentions = outputs
```
227

Joao Gante's avatar
Joao Gante committed
228
### Serializzazione
229

Joao Gante's avatar
Joao Gante committed
230
Modifica sostanziale nel metodo `from_pretrained()`:
231

Joao Gante's avatar
Joao Gante committed
232
1. I modelli sono ora impostati in modalit脿 di valutazione in maniera predefinita quando usi il metodo `from_pretrained()`. Per addestrarli non dimenticare di riportarli in modalit脿 di addestramento (`model.train()`) per attivare i moduli di dropout.
233

Joao Gante's avatar
Joao Gante committed
234
2. Gli argomenti aggiuntivi `*inputs` e `**kwargs` forniti al metodo `from_pretrained()` venivano passati direttamente al metodo `__init__()` della classe sottostante del modello. Ora sono usati per aggiornare prima l'attributo di configurazione del modello, che pu貌 non funzionare con le classi del modello derivate costruite basandosi sui precedenti esempi di `BertForSequenceClassification`. Pi霉 precisamente, gli argomenti posizionali `*inputs` forniti a `from_pretrained()` vengono inoltrati direttamente al metodo `__init__()`  del modello mentre gli argomenti keyword `**kwargs` (i) che corrispondono agli attributi della classe di configurazione, vengono utilizzati per aggiornare tali attributi (ii) che non corrispondono ad alcun attributo della classe di configurazione, vengono inoltrati al metodo `__init__()`.
235

Joao Gante's avatar
Joao Gante committed
236
Inoltre, sebbene non si tratti di una modifica sostanziale, i metodi di serializzazione sono stati standardizzati e probabilmente dovresti passare al nuovo metodo `save_pretrained(save_directory)` se prima usavi qualsiasi altro metodo di serializzazione.
237

Joao Gante's avatar
Joao Gante committed
238
Ecco un esempio:
239

Joao Gante's avatar
Joao Gante committed
240
241
```python
### Carichiamo un modello e un tokenizer
242
243
model = BertForSequenceClassification.from_pretrained("google-bert/bert-base-uncased")
tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-uncased")
244

Joao Gante's avatar
Joao Gante committed
245
246
247
248
### Facciamo fare alcune cose al nostro modello e tokenizer
# Es: aggiungiamo nuovi token al vocabolario e agli embending del nostro modello
tokenizer.add_tokens(["[SPECIAL_TOKEN_1]", "[SPECIAL_TOKEN_2]"])
model.resize_token_embeddings(len(tokenizer))
249
# Alleniamo il nostro modello
Joao Gante's avatar
Joao Gante committed
250
train(model)
251

Joao Gante's avatar
Joao Gante committed
252
253
254
### Ora salviamo il nostro modello e il tokenizer in una cartella
model.save_pretrained("./my_saved_model_directory/")
tokenizer.save_pretrained("./my_saved_model_directory/")
255

Joao Gante's avatar
Joao Gante committed
256
257
258
259
### Ricarichiamo il modello e il tokenizer
model = BertForSequenceClassification.from_pretrained("./my_saved_model_directory/")
tokenizer = BertTokenizer.from_pretrained("./my_saved_model_directory/")
```
260

Joao Gante's avatar
Joao Gante committed
261
### Ottimizzatori: BertAdam e OpenAIAdam ora sono AdamW, lo scheduling 猫 quello standard PyTorch
262

Joao Gante's avatar
Joao Gante committed
263
I due ottimizzatori precedenti inclusi, `BertAdam` e `OpenAIAdam`, sono stati sostituiti da un singolo `AdamW` che presenta alcune differenze:
264

Joao Gante's avatar
Joao Gante committed
265
266
267
- implementa solo la correzione del weights decay,
- lo scheduling ora 猫 esterno (vedi sotto),
- anche il gradient clipping ora 猫 esterno (vedi sotto).
268
269
270

Il nuovo ottimizzatore `AdamW` corrisponde alle API di `Adam` di PyTorch e ti consente di utilizzare metodi PyTorch o apex per lo scheduling e il clipping.

Joao Gante's avatar
Joao Gante committed
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
Lo scheduling 猫 ora standard [PyTorch learning rate schedulers](https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate) e non fanno pi霉 parte dell'ottimizzatore.

Ecco un esempio di linear warmup e decay con `BertAdam` e con `AdamW`:

```python
# Parametri:
lr = 1e-3
max_grad_norm = 1.0
num_training_steps = 1000
num_warmup_steps = 100
warmup_proportion = float( num_warmup_steps) / float(num_training_steps) # 0.1

### In precedenza l'ottimizzatore BertAdam veniva istanziato in questo modo:
optimizer = BertAdam(
   model.parameters(),
   lr=lr,
   schedule="warmup_linear",
   warmup=warmup_proportion,
   num_training_steps=num_training_steps,
)
### e usato in questo modo:
for batch in train_data:
   loss = model(batch)
   loss.backward()
   optimizer.step()

### In 馃 Transformers, ottimizzatore e schedule sono divisi e usati in questo modo:
optimizer = AdamW(
   model.parameters(), lr=lr, correct_bias=False
) # Per riprodurre il comportamento specifico di BertAdam impostare correct_bias=False
scheduler = get_linear_schedule_with_warmup(
   optimizer, num_warmup_steps=num_warmup_steps, num_training_steps=num_training_steps
) # PyTorch scheduler
### e va usato cos矛:
for batch in train_data:
   loss = model(batch)
   loss.backward()
   torch.nn.utils.clip_grad_norm_(
   model.parameters(), max_grad_norm
   ) # Gradient clipping non 猫 pi霉 in AdamW (quindi puoi usare amp senza problemi)
   optimizer.step()
312
313
   scheduler.step()
```