1 引言
在之前的《GeotechSet模型的扩展和优化---集成了aitextgen》中训练出GeotechSet,使用的是GPT2预训练模型,由于机器只有6G GPU的限制,不能使用GPT2-Large。为了能使用这个模型,改用了CPU进行训练。这个笔记简要记录了改进的过程。
2 GPT2和GPT2-large的差别
GPT2是在一个名为WebText的40GB数据集上训练的,数据来源是从网上抓取的。GPT2系列共有 5个模型:distilgpt2-small,gpt2(gpt2-small),gpt2-medium,gpt2-large和gpt2-xl。目前我们只使用gpt2和gpt2-large这两个模型。GPT2需要占用500MB的存储空间来存储其所有参数,而GPT2-large是GPT2的13倍,占用超过6.5GB的存储空间。gpt2共有参数124439808个,gpt2-large共有参数774030080个,而gpt2-xl模型应该有大约1.5B的参数。
这个测试使用了如下代码:
sum(p.numel() for p in gpt2_model.parameters() if p.requires_grad)
3 使用GPT2-large
在现有的条件下,为了使用GPT2-large, 必须在CPU下才能运行。为此新建了一个虚拟环境mwu-training,这个新的虚拟环境是从mwu-transformer克隆过来的,然后在这个新的training环境中首先卸载CUDA,然后重新安装torch的CPU版本,整个过程还算顺利。
训练设置与gpt2的训练设置相同,仍然使用run_language_modeling.py,增大了下面参数的设置:
per_device_train_batch_size=8
dataloader_num_workers=16
block_size=256
训练文本使用了401k的小数据集,运行参数如下:
Num examples = 403
Num Epochs = 2
Instantaneous batch size per device = 8
Total train batch size (w. parallel, distributed & accumulation) = 8
Gradient Accumulation steps = 1
Total optimization steps = 102
CPU的占用率
内存的占用率
这个训练共用了1小时26分钟,生成的模型如下所示,大约3.1G。作为对比,同样的数据在GPT2上训练,产生的模型只有498M。有两个原因导致了运行时间这么长,一个原因是使用了gpt2-large大模型,另一个原因是使用了CPU训练,随着训练数据的增加,训练时间还会更长。
4 使用新模型
当新的模型建立后,转到GPU环境下(mwu-transformer)运行geotech-gpt2-finetune.py,这样做可能稍微快点儿。使用“step-path failure in a rock slope”作为引导句,生成的文本摘要总结如下(省略)。
5 结束语
这个笔记简要记录了在现有条件下使用CPU微调gpt2-large的过程,这是一个不得已而采用的方法,与GPT2的训练结果相比,生成文本的质量好很多,缺点是训练需要大量时间。另外,实践证明XLNet模型《自回归式语言XLNet模型的文本生成试验》在文本生成方面的结果不如gpt2好,即使进行了微调,结果也强差人意,因此决定放弃XLNet在文本生成方面的应用。