使用Google免费GPU进行BERT模型fine-tuning

使用Google Colab中自带的免费GPU进行BERT fine-tuning。

前期准备

首先,需要申请一个谷歌账号。

打开谷歌云端硬盘,新建一个文件夹,例如:BERT。将代码和数据上传到该文件里。这里的代码应该是已经修改好的代码,具体方法参照上一篇博客,博客最后也有提到,谷歌Colab可以在运行的时候设定参数,因此这里代码里的参数可以保持为默认参数,方便在每次运行的时候修改。

在云盘任意位置新建-更多,选择Colaboratory:

1542370973659

如果在更多栏里没有发现Colaboratory,选择关联更多应用,搜索Colaboratory,选择关联。

创建完成后,会生成一个jupyter笔记本。

选择 修改-笔记本设置,将硬件加速器设置为GPU。

到这里,Google Colab已经配置完成,相当于一个远程的终端,我们可以在上面运行一些linux命令以及python代码,但是要调用谷歌云盘上面的数据和代码,还需要更多的配置。

程序运行

每次重新打开笔记本运行程序时,都要进行以下几步:

  • 安装相关库以及授权:

    该步骤是为了建立笔记本与谷歌云盘的关联,具体来说就是给这个笔记本授权,使其能够访问你的谷歌云盘上面的文件。

1
2
3
4
5
6
7
8
9
10
11
12
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

运行后,会出现链接,点开链接,选择自己的谷歌账号,将得到的代码输入链接下面的框中即可。

1542371457391

  • 挂载谷歌云端硬盘
1
2
!mkdir -p drive
!google-drive-ocamlfuse drive -o nonempty

每次修改了云盘中的文件以后都最好运行一次,运行了没有任何提示便成功了。

  • 设置工作路径
1
2
import os
os.chdir('drive/BERT')

将笔记本的工作路径设置到BERT代码的文件夹下。

可以用ls命令查看是否成功:

1542371623670

  • 运行run_classifier.py

    使用命令直接运行位于云盘中的py文件,注意不要丢掉前面的感叹号。

    这里的\表示换行,如果py文件里面已经设置好了相关参数,下面参数可以不要。一旦选择用如下的方式进行参数设置,py文件中的FLAG参数设置必须都是默认参数,否则可能引起报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
!python run_classifier.py \
--task_name=bert_move \
--do_train=true \
--do_eval=true \
--data_dir=data \
--vocab_file=gs://cloud-tpu-checkpoints/bert/uncased_L-24_H-1024_A-16/vocab.txt \
--bert_config_file=gs://cloud-tpu-checkpoints/bert/uncased_L-24_H-1024_A-16/bert_config.json \
--init_checkpoint=gs://cloud-tpu-checkpoints/bert/uncased_L-24_H-1024_A-16/bert_model.ckpt \
--max_seq_length=128 \
--train_batch_size=4 \
--learning_rate=2e-5 \
--num_train_epochs=3.0 \
--output_dir=output \

其中gs://cloud-tpu-checkpoints/bert/uncased_L-12_H-768_A-12,是谷歌云中保存的bert预训练模型,我们无需自己上传,目前一共有:

1542371751932

可以根据相关名称调用不同的模型,这里我们选择的是不区分大小写的基础模型,而大型模型uncased_L-24_H-1024_A-16,使用GPU暂无法运行。

另外,因为前面已经设置了工作路径,因此这里data和output都是位于BERT文件目录下。output可以由程序自动创建,data文件夹需提前将train.tsv等文件上传进去。