本文通过PyTorch简单实现下bert。

PyTorch安装(Windows)
安装前准备
  • Python 3.x
    需要注意的是,目前PyTorch Windows仅支持Python3。
  • Package Manager
    使用包管理器安装最方便啦,比如Anaconda或pip都可。官网推荐Anaconda,因为它提供了所有PyTorch依赖项包括Python和pip。这里我使用Anaconda。
CPU/GPU和CUDA

这里先讲讲CPU和GPU的差别。

CPU

GPU

Central Processing Unit

Graphics Processing Unit

Several cores

Many cores

Low latency

High throughout

Good for serial processing

Good for parallel processing

Can do a handful of operations at once

Can do thousands of operations at once

CPU快速且通用,可以完成一系列需要大量交互的任务。 例如,响应用户的从硬盘驱动器中调用信息。 GPU是图形处理的理想选择,图形必须同时进行纹理,光照和形状渲染,以保持图像在屏幕上显示。

pytorch在cpu和gpu代码运行过程区别 pytorch cpu和gpu版本怎么选_CUDA

从上图可以看出,GPU和CPU在设计上的主要差别在于GPU有更多的运算单元(图中绿色的ALU),而CPU有更多的控制和缓存单元,这是因为GPU在进行并行运算时每个运算单元都是执行相同的程序而不需要太多的控制。CPU擅长逻辑控制,是串行计算,而GPU擅长高强度计算,是并行计算。
这里再插曲普及下对于新手陌生的CUDA。
我们先看下官网上咋说的:CUDA®是NVIDIA开发的一种并行计算平台和编程模型,用于图形处理单元(GPU)上的常规计算。 借助CUDA,开发人员能够利用GPU的功能来显着加快计算应用程序的速度。在GPU加速的应用程序中,工作负载的顺序部分在CPU上运行(针对单线程性能进行了优化),而应用程序的计算密集型部分则在数千个GPU内核上并行运行。 使用CUDA时,开发人员使用C,C ++,Fortran,Python和MATLAB等流行语言进行编程,并通过扩展以一些基本关键字的形式表示并行性。
也就是说,CUDA是NVDIA推出的用于加速自家GPU的并行运算框架,只能在NVDIA的GPU上运行,而且只有当要解决的计算问题是大量并行计算的时候才会发挥CUDA的作用。

安装

检查完上面两项就可以正式进入安装了。需要声明的是,为了充分利用PyTorch的CUDA支持,推荐但非必须为Windows配备NVIDIA GPU。
♦ 打开Anaconda Prompt,如果没有支持CUDA的系统或者不需要CUDA:conda install pytorch torchvision cpuonly -c pytorch。如果系统CUDA可用:conda install pytorch torchvision cudatoolkit=10.1 -c pytorch,这里安装CUDA10.1。
问题:我在用conda安装时遇到了无尽等待而连接失败,查了下这里推荐用清华源替代默认conda源的方法,可以解决下载过慢的问题。

//首先添加清华源 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --set show_channel_urls yes
//另外为了保险起见,建议同时添加第三方conda源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

这里一定要注意,去掉-c pytorch,安装的时候才会默认从清华源下载相应的包,因此这里用命令行;

conda install pytorch torchvision cudatoolkit=10.1

♦ 或者选择pip安装。如果没有支持CUDA的系统或者不需要CUDA:pip install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html。如果系统CUDA可用:pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html

检查安装是否成功

通过运行简单的PyTorch代码验证下是否成功安装。这里构建一个随机初始化的张量tensor。打开python命令行,输入以下代码。

Input:
from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x) 

Output:
tensor([[0.3380, 0.3845, 0.3217],
        [0.8337, 0.9050, 0.2650],
        [0.2979, 0.7141, 0.9069],
        [0.1449, 0.1132, 0.1375],
        [0.4675, 0.3947, 0.1426]])

另外,为了检查GPU驱动和CUDA是否可用,运行以下命令,将会返回是否可用。

>>>import torch
>>>torch.cuda.is_available()
Transformers安装和加载

通过Hugging Face安装BERT的pytorch接口。 (该库包含其他预训练语言模型的接口,例如OpenAI的GPT和GPT-2。)而我们选择pytorch接口是因为它在高级API(易于使用,但无法深入了解工作原理)和tensorflow代码(包含很多细节,但我们想用的是BERT而不是深入学习tensorflow的内部实现细节)之间取得了很好的平衡。
我们将在以后的教程中详细解释BERT模型,BERT是Google发布的经过预先训练的模型,该模型在Wikipedia和Book Corpus(包含+10,000种不同类型的图书)上运行了很多很多个小时。该模型(稍做修改)在一系列任务中击败NLP benchmarks。Google发布了BERT模型的一些变体,但是我们在这里使用的是两种可用尺寸(“base”和“large”)中较小的一种,并且忽略大小写,因此是“uncased”。
Transformers提供了许多将BERT应用于不同任务(词分类,文本分类等)。在这里,我们使用的是基本BertModel,它没有特定的输出任务-对于使用BERT只是提取嵌入向量来说,这是一个不错的选择。
♦ 安装:pip install transformers ♦ 加载 :

import torch
from transformers import BertTokenizer, BertModel
# OPTIONAL: if you want to have more information on what's happening, activate the logger as follows
import logging
#logging.basicConfig(level=logging.INFO)

import matplotlib.pyplot as plt
% matplotlib inline

# Load pre-trained model tokenizer (vocabulary)
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
Bert简单使用

首先对输入文本进行格式化(Input Formatting)——首先分词之前要在一个句子的开头加上[SEP]标记,在句子的结尾加上[CLS]标记(其中[CLS]是专门针对于分类任务的);然后根据分词后的文本得到Token idSegment id;运行模型;
完全推荐参考Chris McCormick 的这篇blog