LayoutLM源码踩坑记录

LayoutLM(V1/V2)源码踩坑记录


前言:最近在看VQA相关内容,正好发现了LayoutLM这个repo,有开源代码,有pretrained model,就想着白嫖一波

LayoutLM repo地址:https://github.com/microsoft/unilm/tree/master/layoutlm

环境准备

  • 安装lfs(下载大文件)

ubuntu下面,可以按照下面的方法安装lfs

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
apt-get install git-lfs
git lfs install

安装好之后,就可以按照下面的方法去下载pretrained model了,huggingface的链接,官网repo中也有
下载pretrained model的方法

git clone https://huggingface.co/microsoft/layoutlm-base-uncased/tree/main

这种方法,目前基于torch-transformer用的还挺普遍的。

  • 安装layoutlm:在该文件夹下,按照下面的方法安装layoutlm whl包
python set.py bdist_wheel
pip install dist/***.whl
  • 然后安装以下requirements
seqeval
tensorboardX
transformers

数据准备

这里因为文档分类的数据集太大了,30+G,暂时又无法访问,所以先在Sequence Labeling Task作了实验和流程验证。

  • 准备数据。下面会从网站上下载数据集并解压,由于是外网,所以即使文件不大(17M左右),但是时间也比较久
进入example文件夹
bash preprocess.sh

然后按照官网的文档训练即可。

python3.7 run_seq_labeling.py  --data_dir data \
                            --model_type layoutlm \
                            --model_name_or_path ./layoutlm-base-uncased/ \
                            --do_lower_case \
                            --max_seq_length 512 \
                            --do_train \
                            --num_train_epochs 100.0 \
                            --logging_steps 10 \
                            --save_steps 2 \
                            --output_dir ./output \
                            --overwrite_output_dir \
                            --labels data/labels.txt \
                            --per_gpu_train_batch_size 16 \
                            --per_gpu_eval_batch_size 16 \
                            --evaluate_during_training \
                            --fp16

output/train.log会记录实时日志,也会打印出recall, precision ,f1 等信息,如下。

           precision    recall  f1-score   support

 QUESTION       0.29      0.56      0.38         9
   HEADER       0.50      1.00      0.67         1
   ANSWER       0.04      0.20      0.06         5

micro avg       0.15      0.47      0.23        15
macro avg       0.22      0.47      0.30        15

07/04/2021 09:33:51 - INFO - __main__ -   ***** Eval results  *****
07/04/2021 09:33:51 - INFO - __main__ -     f1 = 0.22950819672131148
07/04/2021 09:33:51 - INFO - __main__ -     loss = 2.8498342037200928
07/04/2021 09:33:51 - INFO - __main__ -     precision = 0.15217391304347827
07/04/2021 09:33:51 - INFO - __main__ -     recall = 0.4666666666666667

遇到的问题

  • 打开训练时评估,遇到:[Errno 2] No such file or directory: 'data/dev.txt

解决办法,创建dev文件,我是把test*.txt都软链到到dev*.txt了。

cd data
ln -s test_box.txt dev_box.txt
ln -s test_image.txt dev_image.txt
ln -s test.txt dev.txt
cd ..

提交的话,需要自己处理数据格式,可以参考这个链接:https://github.com/microsoft/unilm/issues/125

  • 多卡的时候,如果使用torch>=1.5.0的版本,会出现下面的问题:StopIteration: Caught StopIteration in replica 0 on device 0.

可以参考下面的链接:https://www.pythonf.cn/read/153689,修改下源码,将next(self.parameters()).dtype修改为torch.float32(如果使用fp32训练)或者torch.float16 (如果使用fp16训练)。

V2踩坑记录

V2的文档相对更少一些,而且需要额外的依赖。安装之前,一定要手动更新下pip,不然很多包安装都有问题,具体命令如下

pip install --upgrade pip
pip install datasets
  • note:我是万万没想到,有whl包叫datasets,还在各种查相对路径,在layoutlm源码里找这个包。。。

之后就按照官网上的训练脚本运行就行,这里发现layoutlmft文件夹中的代码做了优化,pretrain和dataset都可以自动下载了,所以用起来相对比较无脑

猜你喜欢

转载自blog.csdn.net/u012526003/article/details/118464518