Help addapting pytorch/text-classification example to t5

Hello,

I would like to fine-tune models from the flan-t5 family for text classification on my own data.

Being a beginner, I decided to start by running the examples provided. The example runs fine with the default pretrained model. We are still labelling our data, so right now I am focusing on switching to another model.

I have tried to adapt run_glue.py to t5 by changing the imports, namely: T5Config, T5ForConditionalGeneration, T5TokenizerFast.

However, I receive the following error:

โ”‚ /home/emoman/.local/lib/python3.10/site-packages/transformers/models/t5/modeling_t5.py:990 in    โ”‚
โ”‚ forward                                                                                          โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    987 โ”‚   โ”‚   โ”‚   โ”‚   raise ValueError("You have to initialize the model with valid token embe  โ”‚
โ”‚    988 โ”‚   โ”‚   โ”‚   inputs_embeds = self.embed_tokens(input_ids)                                  โ”‚
โ”‚    989 โ”‚   โ”‚                                                                                     โ”‚
โ”‚ โฑ  990 โ”‚   โ”‚   batch_size, seq_length = input_shape                                              โ”‚
โ”‚    991 โ”‚   โ”‚                                                                                     โ”‚
โ”‚    992 โ”‚   โ”‚   # required mask seq length can be calculated via length of past                   โ”‚
โ”‚    993 โ”‚   โ”‚   mask_seq_length = past_key_values[0][0].shape[2] + seq_length if past_key_values  โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
ValueError: not enough values to unpack (expected 2, got 1)

Any ideas?

This is my command:

export TASK_NAME=sst2

python run_glue_t5.py \
--model_name_or_path 'google/flan-t5-base' \
--task_name $TASK_NAME \
--do_train \
--do_eval \
--max_seq_length 128 \
--per_device_train_batch_size 32 \
--learning_rate 2e-5 \
--num_train_epochs 2 \
--output_dir /tmp/$TASK_NAME/ \
--evaluation_strategy steps \
--save_total_limit 1 \
--load_best_model_at_end True \
--overwrite_output_dir \
--optim adamw_torch \
--use_ipex \
--jit_mode_eval \
--no_cuda

Best regards,

Ed

The full trace:

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ /home/emoman/Work/exploration/ipex/transformers/examples/pytorch/text-classification/run_glue_t5 โ”‚
โ”‚ .py:623 in <module>                                                                              โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   620                                                                                            โ”‚
โ”‚   621                                                                                            โ”‚
โ”‚   622 if __name__ == "__main__":                                                                 โ”‚
โ”‚ โฑ 623 โ”‚   main()                                                                                 โ”‚
โ”‚   624                                                                                            โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/emoman/Work/exploration/ipex/transformers/examples/pytorch/text-classification/run_glue_t5 โ”‚
โ”‚ .py:531 in main                                                                                  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   528 โ”‚   โ”‚   โ”‚   checkpoint = training_args.resume_from_checkpoint                              โ”‚
โ”‚   529 โ”‚   โ”‚   elif last_checkpoint is not None:                                                  โ”‚
โ”‚   530 โ”‚   โ”‚   โ”‚   checkpoint = last_checkpoint                                                   โ”‚
โ”‚ โฑ 531 โ”‚   โ”‚   train_result = trainer.train(resume_from_checkpoint=checkpoint)                    โ”‚
โ”‚   532 โ”‚   โ”‚   metrics = train_result.metrics                                                     โ”‚
โ”‚   533 โ”‚   โ”‚   max_train_samples = (                                                              โ”‚
โ”‚   534 โ”‚   โ”‚   โ”‚   data_args.max_train_samples if data_args.max_train_samples is not None else    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/emoman/.local/lib/python3.10/site-packages/transformers/trainer.py:1664 in train           โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   1661 โ”‚   โ”‚   inner_training_loop = find_executable_batch_size(                                 โ”‚
โ”‚   1662 โ”‚   โ”‚   โ”‚   self._inner_training_loop, self._train_batch_size, args.auto_find_batch_size  โ”‚
โ”‚   1663 โ”‚   โ”‚   )                                                                                 โ”‚
โ”‚ โฑ 1664 โ”‚   โ”‚   return inner_training_loop(                                                       โ”‚
โ”‚   1665 โ”‚   โ”‚   โ”‚   args=args,                                                                    โ”‚
โ”‚   1666 โ”‚   โ”‚   โ”‚   resume_from_checkpoint=resume_from_checkpoint,                                โ”‚
โ”‚   1667 โ”‚   โ”‚   โ”‚   trial=trial,                                                                  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/emoman/.local/lib/python3.10/site-packages/transformers/trainer.py:1940 in                 โ”‚
โ”‚ _inner_training_loop                                                                             โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   1937 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   with model.no_sync():                                                 โ”‚
โ”‚   1938 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   tr_loss_step = self.training_step(model, inputs)                  โ”‚
โ”‚   1939 โ”‚   โ”‚   โ”‚   โ”‚   else:                                                                     โ”‚
โ”‚ โฑ 1940 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   tr_loss_step = self.training_step(model, inputs)                      โ”‚
โ”‚   1941 โ”‚   โ”‚   โ”‚   โ”‚                                                                             โ”‚
โ”‚   1942 โ”‚   โ”‚   โ”‚   โ”‚   if (                                                                      โ”‚
โ”‚   1943 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   args.logging_nan_inf_filter                                           โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/emoman/.local/lib/python3.10/site-packages/transformers/trainer.py:2735 in training_step   โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   2732 โ”‚   โ”‚   โ”‚   return loss_mb.reduce_mean().detach().to(self.args.device)                    โ”‚
โ”‚   2733 โ”‚   โ”‚                                                                                     โ”‚
โ”‚   2734 โ”‚   โ”‚   with self.compute_loss_context_manager():                                         โ”‚
โ”‚ โฑ 2735 โ”‚   โ”‚   โ”‚   loss = self.compute_loss(model, inputs)                                       โ”‚
โ”‚   2736 โ”‚   โ”‚                                                                                     โ”‚
โ”‚   2737 โ”‚   โ”‚   if self.args.n_gpu > 1:                                                           โ”‚
โ”‚   2738 โ”‚   โ”‚   โ”‚   loss = loss.mean()  # mean() to average on multi-gpu parallel training        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/emoman/.local/lib/python3.10/site-packages/transformers/trainer.py:2767 in compute_loss    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   2764 โ”‚   โ”‚   โ”‚   labels = inputs.pop("labels")                                                 โ”‚
โ”‚   2765 โ”‚   โ”‚   else:                                                                             โ”‚
โ”‚   2766 โ”‚   โ”‚   โ”‚   labels = None                                                                 โ”‚
โ”‚ โฑ 2767 โ”‚   โ”‚   outputs = model(**inputs)                                                         โ”‚
โ”‚   2768 โ”‚   โ”‚   # Save past state if it exists                                                    โ”‚
โ”‚   2769 โ”‚   โ”‚   # TODO: this needs to be fixed and made cleaner later.                            โ”‚
โ”‚   2770 โ”‚   โ”‚   if self.args.past_index >= 0:                                                     โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/emoman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py:1501 in _call_impl   โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   1498 โ”‚   โ”‚   if not (self._backward_hooks or self._backward_pre_hooks or self._forward_hooks   โ”‚
โ”‚   1499 โ”‚   โ”‚   โ”‚   โ”‚   or _global_backward_pre_hooks or _global_backward_hooks                   โ”‚
โ”‚   1500 โ”‚   โ”‚   โ”‚   โ”‚   or _global_forward_hooks or _global_forward_pre_hooks):                   โ”‚
โ”‚ โฑ 1501 โ”‚   โ”‚   โ”‚   return forward_call(*args, **kwargs)                                          โ”‚
โ”‚   1502 โ”‚   โ”‚   # Do not call functions when jit is used                                          โ”‚
โ”‚   1503 โ”‚   โ”‚   full_backward_hooks, non_full_backward_hooks = [], []                             โ”‚
โ”‚   1504 โ”‚   โ”‚   backward_pre_hooks = []                                                           โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/emoman/.local/lib/python3.10/site-packages/transformers/models/t5/modeling_t5.py:1720 in   โ”‚
โ”‚ forward                                                                                          โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   1717 โ”‚   โ”‚   โ”‚   โ”‚   decoder_attention_mask = decoder_attention_mask.to(self.decoder.first_de  โ”‚
โ”‚   1718 โ”‚   โ”‚                                                                                     โ”‚
โ”‚   1719 โ”‚   โ”‚   # Decode                                                                          โ”‚
โ”‚ โฑ 1720 โ”‚   โ”‚   decoder_outputs = self.decoder(                                                   โ”‚
โ”‚   1721 โ”‚   โ”‚   โ”‚   input_ids=decoder_input_ids,                                                  โ”‚
โ”‚   1722 โ”‚   โ”‚   โ”‚   attention_mask=decoder_attention_mask,                                        โ”‚
โ”‚   1723 โ”‚   โ”‚   โ”‚   inputs_embeds=decoder_inputs_embeds,                                          โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/emoman/.local/lib/python3.10/site-packages/torch/nn/modules/module.py:1501 in _call_impl   โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   1498 โ”‚   โ”‚   if not (self._backward_hooks or self._backward_pre_hooks or self._forward_hooks   โ”‚
โ”‚   1499 โ”‚   โ”‚   โ”‚   โ”‚   or _global_backward_pre_hooks or _global_backward_hooks                   โ”‚
โ”‚   1500 โ”‚   โ”‚   โ”‚   โ”‚   or _global_forward_hooks or _global_forward_pre_hooks):                   โ”‚
โ”‚ โฑ 1501 โ”‚   โ”‚   โ”‚   return forward_call(*args, **kwargs)                                          โ”‚
โ”‚   1502 โ”‚   โ”‚   # Do not call functions when jit is used                                          โ”‚
โ”‚   1503 โ”‚   โ”‚   full_backward_hooks, non_full_backward_hooks = [], []                             โ”‚
โ”‚   1504 โ”‚   โ”‚   backward_pre_hooks = []                                                           โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/emoman/.local/lib/python3.10/site-packages/transformers/models/t5/modeling_t5.py:990 in    โ”‚
โ”‚ forward                                                                                          โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    987 โ”‚   โ”‚   โ”‚   โ”‚   raise ValueError("You have to initialize the model with valid token embe  โ”‚
โ”‚    988 โ”‚   โ”‚   โ”‚   inputs_embeds = self.embed_tokens(input_ids)                                  โ”‚
โ”‚    989 โ”‚   โ”‚                                                                                     โ”‚
โ”‚ โฑ  990 โ”‚   โ”‚   batch_size, seq_length = input_shape                                              โ”‚
โ”‚    991 โ”‚   โ”‚                                                                                     โ”‚
โ”‚    992 โ”‚   โ”‚   # required mask seq length can be calculated via length of past                   โ”‚
โ”‚    993 โ”‚   โ”‚   mask_seq_length = past_key_values[0][0].shape[2] + seq_length if past_key_values  โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
ValueError: not enough values to unpack (expected 2, got 1)

Could the issue be that the decoder expect a different format?

I switched to DataCollatorForSeq2Seq and now I get the following error:

TypeError: T5ForConditionalGeneration.forward() got an unexpected keyword argument 'label'

I believe this to be a show stopper. I guess I will have to build the whole thing from scratch rather than try and adapt this script.

It seems to be working! It will take several hours on my hardware but at least there are no errors so far.

The key was to use the class T5ForSequenceClassification from here:

With a bit of hacking like replacing โ€œlabelsโ€ with โ€œlabelโ€.

Also:

from transformers import (
    T5Config,
    T5TokenizerFast,
    DataCollatorForSeq2Seq,
    EvalPrediction,
    HfArgumentParser,
    PretrainedConfig,
    Trainer,
    TrainingArguments,
    set_seed,
)

from t5_extra_models import T5ForSequenceClassification

And the corresponding replacements in the code.