unilm Max_seq_length LayoutLMV3 - 如何实现?

envsm3lx  于 2个月前  发布在  其他
关注(0)|答案(4)|浏览(32)

你好,
我正在使用的模型是LayoutLMV3(LayoutLMv3ForTokenClassification)。我希望模型能够处理超过512个token,因为当文本非常大时,它无法对剩余的部分进行分类。我想增加seq_max_length,从LayoutLMv3Config -> max_position_embeddings = 1024更改过来,但我使用的bboxes数据集的大小为1024 + 196 + 1 = 1221,但这并没有奏效。我得到了一个CUDA错误:

.../python3.8/layoutlm_model-packages/torch/nn/functional.py in embedding(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq, sparse)
2197         # remove once script supports set_grad_enabled
2198         _no_grad_embedding_renorm_(weight, input, max_norm, norm_type)
-> 2199     return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)

RuntimeError: CUDA error: device-side assert triggered

。这应该是一个矩阵尺寸错误。有人能解释一下如何增加max_seq_length吗?

3zwjbxry

3zwjbxry1#

问题是否已解决?我遇到了相同的问题。

lo8azlld

lo8azlld2#

你好@superxii和@davelza95,
我使用huggingface库的实现完成了这个任务。为了使LayoutLMv3在较长的序列长度上正常工作,需要调整以下参数:

  1. processor.tokenizer.model_max_length
  2. config.max_position_embeddings
    我的猜测是输入大小与预期大小不匹配。我发现将输入更改为cpu可以获得更好的错误信息。如果你能让它在cpu上训练,那么在cuda上的错误主要是由于内存不足导致的,这时你可以减小批量大小。
    另外,我想分享一点:为了提高LayoutLMv3模型的泛化能力,你可能需要对模型进行预训练。这是因为,通过改变序列长度,文本和图像路径对齐可能不正确。你可能会发现模型在预期性能下进行训练,但在测试时无法泛化到离散分布的数据集,我认为这是由于上述问题导致的。
    希望这对你有所帮助。请随时分享你的进展 :)
4ngedf3f

4ngedf3f3#

我已经通过设置以下内容解决了这个问题:
encoding = processor(image, return_offsets_mapping=True, return_tensors="pt", truncation=True, max_length=512)
这个错误的原因是因为模型的token长度与输入不相同。通常情况下,输入的token长度大于模型的token长度。因此,通过设置max_length和截断可以解决这个问题。|
感谢您提供您的解决方案 :)

tez616oj

tez616oj4#

大家好!
我在此处解释了如何处理大型令牌的解决方案,希望它能帮助到你们:
huggingface/transformers#19190 (评论)

相关问题