配置 BERT 运行环境

自然语言处理库 Transformers 包含了 BERT、GPT、GPT-2、Transformer-XL、XLNet、XLM 等模型的实现,近两年 Pytorch 生态日趋成熟。因此,本文中使用 Transformers 的 Pytorch 支持来调用 BERT 模型。

检查 cuda 版本

深度学习模型如果没有 GPU 加持,训练速度几乎是无法忍受的,因此,在使用模型前请先确认 GPU 正常工作;另外,最新版本的 Transformers 需要 Pytorch 1.5.0 及以上版本,而 Pytorch 1.5.0 底层又依赖 CUDA 10.2 以上版本。

使用以下命令查看 CUDA 版本

1
$ nvidia-smi

(查看右上角 CUDA Version: xx.x)

如果低于 10.2,可通过以下命令安装

1
$ sudo apt-get install cuda-10-2

安装好后请重启系统

安装方法一:通用方法

由于安装依赖库可能干扰主机 Linux 系统中的 Python 环境,建议在 docker 中使用 Transformers 运行环境。

如果之前有比较常用的 docker image,可通过 pip 安装 transformers。

1
$ pip install transformers

推荐下载 transfromers 源码安装,以保持例程与系统中软件版本一致

1
2
3
$ git clone https://github.com/huggingface/transformers.git
$ cd transformers
$ python3 -m pip install --no-cache-dir .

安装方法二:标准方法

如果不考虑现有的 docker image,可利用官方提供的 Dockerfile 制做 transforms 镜像。

1
2
3
$ git clone https://github.com/huggingface/transformers.git # README支持中文简体
$ cd transformers/
$ docker build -t transformers-pytorch-gpu:test1 docker/transformers-pytorch-gpu

(注意:在 transformers 目录下运行,否则 Dockerfile 中复制文件路径不对)

启动 docker

1
$ nvidia-docker run --rm -v /exports:/exports -it transformers-pytorch-gpu:test1 bash 

(注意:使用 nvidia-docker 启动 docker,否则无法在 docker 内部使用 GPU)

测试 GPU 是否正常工作

在 docker 内运行以下 Python 程序,测试 GPU+CUDA+Pytorch 是否正常工作。

1
2
3
4
5
6
7
8
9
10
import torch

print(torch.cuda.is_available())
print(torch.__version__)

ngpu= 1
device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")
print(device)
print(torch.cuda.get_device_name(0))
print(torch.rand(3,3).cuda())

下载预训练好的中文 BERT 模型

1
2
$ git clone https://huggingface.co/bert-base-chinese
$ cd bert-base-chinese/

从浏览器下载 pytorch_model.bin 覆盖目录中的 pytorch_model.bin(用 393M 的文件覆盖 134K 的文件),或者复制 download 地址后用 wget 下载:

1
$ wget https://huggingface.co/bert-base-chinese/resolve/main/pytorch_model.bin

(使用模型时指定 bert-base-chinese,有些情况下模型可自动下载)

测试中文 BERT

1
2
3
4
5
6
7
8
9
10
11
12
import torch
from transformers import BertModel, BertConfig, BertTokenizer

modle_path = '/exports/git/bert-base-chinese' # 下载模型的目录
tokenizer = BertTokenizer.from_pretrained(modle_path)
model = BertModel.from_pretrained(modle_path)
input_ids = torch.tensor([tokenizer.encode("测试一下", add_special_tokens=True)])
with torch.no_grad():
output = model(input_ids)
last_hidden_state = output[0]
pooler_output = output[1]
print(last_hidden_state[:, 0, :])

语义相似度示例

源码的 transformers/examples/pytorch/目录下有各种例程,其中包含常用的问答,多选,分类等自然语言应用。

下面以语义相似度为例,看看如何使用 BERT 库解决实际问题。

GLUE(General Language Understanding Evaluation) 是用于评估 NLP 模型的一组标准,其中包含诸多项目,以语义相似度 STS-B(Semantic Textual Similarity)为目录,相关代码在:

transformers/examples/pytorch/text-classification/run_glue.py,可以该程序为入口学习如何使用 BERT 模型。

安装依赖库

1
2
$ cd transformers/examples/pytorch/text-classification/
$ pip install -r requirements.txt

测试例程(具体请参考例程目录下的 README)

1
2
$ export TASK_NAME=stsb
$ python run_glue.py --model_name_or_path bert-base-cased --task_name $TASK_NAME --do_train --do_eval --max_seq_length 128 --per_device_train_batch_size 32 --learning_rate 2e-5 --num_train_epochs 3 --output_dir /tmp/$TASK_NAME/

此时程序将下载相似度训练数据,并按指定参数训练模型(外网时常连不通,请多试几次)。另外,也要以加参数 --cache_dir /exports/bert/ 来指定数据存放路径。如果 GPU 配置正常,几分钟即可训练完成。

参考