利用huggingface出品的transformers进行预训练模型的finetune

language-modeling finetuning

本文基于最新的transformers v4.3.3

https://github.com/huggingface/transformers/tree/master/examples#important-note

第一步非常重要,如上面官方链接讲的,需要正确安装transformers。单纯的pip install会报错

第二步,多GPU进行分布式训练,同样如上面官方链接,

在运行run_mlm.py的时候在前面加上一句:

python -m torch.distributed.launch \
    --nproc_per_node 8

就是会自动使用多GPU了。

另外就是,运行上面这句之前,如果要指定GPU,那么需要在命令行加一句

export CUDA_VISIBLE_DEVICES=1,2,3,4 

如果出现显存爆掉的情况,比如下面,

RuntimeError: CUDA out of memory. Tried to allocate 786.00 MiB (GPU 0; 11.91 GiB total capacity; 10.57 GiB already allocated; 470.56 MiB free; 10.72 GiB reserved in total by PyTorch)

要么用更多GPU,使用更大显存,要么减小max_sequence_length(文本被切分成这么长的句子),或者batch_size

transformers的每个device上的batch_size一开始默认为8,使用8个GPU的话,总的batch_size就是64。在GPU个数有限的情况下,减小batch_size到2,总的batch_size变成了16.这时,显存大大降低,不再报错,但是训练时间会变长。这样子是牺牲空间换时间。但是batch_size并不是越大越好,据某个大牛讲,batch_size设置为2~32,也就是mini-batch的情况下,甚至会使得网络达到鞍点,也就是局部最优点。这是大batch_size可能找不到的。

另外,就加速训练而言,transformers添加了混合精度训练(mixed precision)的方法,也就是在python run_mlm.py的最后加上一句,--fp16。

一般而言,训练数据的精度是32位,64位甚至128位,这里改成16位,是牺牲训练精度换取时间。

 

你可能感兴趣的:(nlp,自然语言处理,pytorch,transformers)