自然语言处理库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配置正常,几分钟即可训练完成。

参考

posted on 2021-10-05 20:39  xieyan0811  阅读(248)  评论(0编辑  收藏  举报