自然语言处理库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版本
$ nvidia-smi
(查看右上角CUDA Version: xx.x)
如果低于10.2,可通过以下命令安装
$ sudo apt-get install cuda-10-2
安装好后请重启系统
安装方法一:通用方法
由于安装依赖库可能干扰主机Linux系统中的Python环境,建议在docker中使用Transformers运行环境。
如果之前有比较常用的docker image,可通过pip安装transformers。
$ pip install transformers
推荐下载transfromers源码安装,以保持例程与系统中软件版本一致
$ git clone https://github.com/huggingface/transformers.git
$ cd transformers
$ python3 -m pip install --no-cache-dir .
安装方法二:标准方法
如果不考虑现有的docker image,可利用官方提供的Dockerfile制做transforms镜像。
$ 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
$ nvidia-docker run --rm -v /exports:/exports -it transformers-pytorch-gpu:test1 bash
(注意:使用nvidia-docker启动docker,否则无法在docker内部使用GPU)
测试GPU是否正常工作
在docker内运行以下Python程序,测试GPU+CUDA+Pytorch是否正常工作。
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模型
$ git clone https://huggingface.co/bert-base-chinese
$ cd bert-base-chinese/
从浏览器下载pytorch_model.bin覆盖目录中的pytorch_model.bin(用393M的文件覆盖134K的文件),或者复制download地址后用wget下载:
$ wget https://huggingface.co/bert-base-chinese/resolve/main/pytorch_model.bin
(使用模型时指定bert-base-chinese,有些情况下模型可自动下载)
测试中文BERT
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模型。
安装依赖库
$ cd transformers/examples/pytorch/text-classification/
$ pip install -r requirements.txt
测试例程(具体请参考例程目录下的README)
$ 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配置正常,几分钟即可训练完成。
参考
- PyTorch-Transformers:最先进的自然语言处理库(附带python代码)
https://baijiahao.baidu.com/s?id=1640539349483912777&wfr=spider&for=pc - transformers 安装 https://pytorchchina.com/2020/02/29/transformers-%E5%AE%89%E8%A3%85/
- 中文新闻情感分类 Bert-Pytorch-transformers
https://blog.csdn.net/qq_21749493/article/details/103703085