我正在尝试使用来自HuggingFace的run_clm.py
示例script对我的数据进行基于GPT2的模型微调。
我有一个.json
数据文件,如下所示:
...
{"text": "some text"}
{"text": "more text"}
...
我不得不更改用于连接输入文本的脚本的默认行为,因为我的所有示例都是不应连接的单独演示:
def add_labels(example):
example['labels'] = example['input_ids'].copy()
return example
with training_args.main_process_first(desc="grouping texts together"):
lm_datasets = tokenized_datasets.map(
add_labels,
batched=False,
# batch_size=1,
num_proc=data_args.preprocessing_num_workers,
load_from_cache_file=not data_args.overwrite_cache,
desc=f"Grouping texts in chunks of {block_size}",
)
这实际上只添加了CLM所需的相应'labels'
字段。
然而,由于GPT2有一个1024大小的上下文窗口,所以应该将示例填充到该长度。
我可以通过如下修改标记化过程来实现这一点:
def tokenize_function(examples):
with CaptureLogger(tok_logger) as cl:
output = tokenizer(
examples[text_column_name], padding='max_length') # added: padding='max_length'
# ...
培训运行正常。
但是,我认为这 * 不 * 应该由tokenizer来完成,而应该由数据整理器来完成。
ValueError: Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' 'truncation=True' to have batched tensors with the same length. Perhaps your features (`labels` in this case) have excessive nesting (inputs type `list` where type `int` is expected).
除此之外:
Traceback (most recent call last):
File "/home/jan/repos/text2task/.venv/lib/python3.10/site-packages/transformers/tokenization_utils_base.py", line 716, in convert_to_tensors
tensor = as_tensor(value)
ValueError: expected sequence of length 9 at dim 1 (got 33)
During handling of the above exception, another exception occurred:
为了解决这个问题,我创建了一个数据整理器,它应该做填充:
data_collator = DataCollatorWithPadding(tokenizer, padding='max_length')
这是传递给培训师的内容。但是,上面的错误仍然存在。
这是怎么回事?
1条答案
按热度按时间wfveoks01#
我设法修复了错误,但我真的不确定我的解决方案,详细信息如下。将接受一个更好的答案。
这似乎解决了它:
可在以下文档中找到:https://huggingface.co/docs/transformers/main_classes/data_collator#transformers.DataCollatorForSeq2Seq
看起来
DataCollatorWithPadding
没有填充标签?我的问题是关于从输入序列生成输出序列,所以我 * 猜测 * 使用
DataCollatorForSeq2Seq
是我真正想要做的。然而,我的数据没有单独的input
和target
列,而是一个text
列(包含字符串input => target
)。我并不真的认为这个排序器是打算用于GPT2的...