通过Hugging Face构建、训练和部署人工智能模型

人工智能特别是深度学习(Deep Learning)对于每个人来说都是利器。如果不想局限于问答机器人的应用场景,必须需要了解更底层的算法、模型、训练、测试等方面的知识。对于大众来说,应该如何开始?我想答案就是Hugging Face。

通过Hugging Face构建、训练和部署人工智能模型

Hugging Face是一家美国公司,专门开发用于构建机器学习应用的工具。该公司的代表产品是其为自然语言处理应用构建的transformers库,以及允许用户共享机器学习模型和数据集的平台。

有了这个高效的工具,任何一个人都可以快速地运行人工智能模型,并对模型进行训练和部署。如何使用Hugging Face的教程可参考官网。这里只提供关键的知识点。

运行环境(Working Env.)

最方便的是使用Google开发的在线编辑器:Colab Notebook。Colab还提供了免费的GPUs和TPUs等硬件资源,即使用CPU也可以训练大模型。官方文档有详细介绍如何在Colab中安装Transformers library 。

Colab allows you to use some accelerating hardware, like GPUs or TPUs, and it is free for smaller workloads.

Transformers library是Hugging Face开发的,可与不同的大模型进行交互的Python Package。大模型就是熟悉的GPT,BERT,T5等能进行深度学习(Deep Learning)的模型。Hugging Face接入了几千种不同的模型。

Transformer Library基础案例

The most basic object in the Transformers library is the pipeline()  function. It connects a model with its necessary preprocessing and postprocessing steps, allowing us to directly input any text and get an intelligible answer.

pipeline()函数提供了专用于多项任务的简单API,只需要输入一些信息便可通过模型输出相应的结果,可用于情感分析、特征提取和问答等。

例如以下一个来自官方文档问答系统:

from transformers import pipeline

question_answerer = pipeline("question-answering")
question_answerer(
    question="Where do I work?",
    context="My name is Sylvain and I work at Hugging Face in Brooklyn",
)

问答系统的回答是:

{'score': 0.6385916471481323, 'start': 33, 'end': 45, 'answer': 'Hugging Face'}

如果你更换几次question与context两个变量的内容,就会发现这个模型的回答并不能很好地达到自己的预期。可见pipeline()虽然简化了数据输入、处理与输出的流程,但输出的问答也相对简单。

Behind the pipeline()

pipeline()后台的运行可分为三个步骤:预处理、模型传递输入和后处理。

pipeline function

1)预处理为Preprocessing,也叫tokenization。Transformer模型无法直接处理原始文本,因此我们流程的第一步是将文本输入转换为模型可以理解的数字。这个是由标记器(Tokenizer)完成的,具体步骤为:

  1. 标记器将输入的Raw Data拆分为单词、子单词或符号,这些小单元叫Token。
  2. 标记器将每个Token映射到一个整数

以上步骤可使用 AutoTokenizer 类及其 from_pretrained() 方法:

from transformers import AutoTokenizer

checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

checkpoint表示的是pre-trained models。AutoTokenizer.from_pretrained() loads a pre-trained tokenizer associated with a specific model architecture from the Hugging Face model hub. 当有了tokenizer之后,就可以导入文本并生成标记的数据。

raw_inputs = [
    "I've been waiting for a HuggingFace course my whole life.",
    "I hate this so much!",
]
inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt")
print(inputs)

2)处理之后的数据需要传递到模型中,因此要先下载模型。Hugging Face同样提供了一个 TFAutoModel 类,用于下载Model,该类也具有 from_pretrained() 方法:

from transformers import AutoModel

checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModel.from_pretrained(checkpoint)
outputs = model(inputs)

3)从模型输出数据并不人能理解的数据,还需要进行postprocessing。官方文档有详细介绍具体的过程及包含相应的实例。

运行BERT Pre-train Model

从零开始训练一个模型所需要的投入是非常大的,好在我们可以直接用一些训练好的模型,然后通过一些优化(Fine-tuning)来满足自己的应用场景。以下的代码可以加载需要的模型。

from transformers import TFBertModel

model = TFBertModel.from_pretrained("bert-base-cased")

模型加载完之后需要输入一些信息。由于模型不能输入原始的数据(Raw Data),需要通过Tokenizer进行预处理,这样原始的数据才能被转换成模型能够处理的数据。例如以下一句话:

你在学习什么语言?

Pre-train Model是无法识别这句话的,模型只能识别数字,因此需要把上面那句话转换成数字。Tokenizer就是处理这个工作的。先通过以下的语言加载BERT的Tokenizer. 注意不同的模型有不同的Tokenizer,具体需要阅读模型的说明文档。

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-cased")

Tokenizer加载好之后便可以导入Raw Data:

tokens = tokenizer("Using a Transformer network is simple")

tokens便是处理后的能够输入Model的数据。把它输入到Model之后,便可以得到输出的数据:

output = model(**tokens)

整个过程的全部代码如下

from transformers import TFBertModel, BertTokenizer

model = TFBertModel.from_pretrained("bert-base-cased")
tokenizer = BertTokenizer.from_pretrained("bert-base-cased")

sequences = ["Using a Transformer network is simple"]

tokens = tokenizer(sequences, padding=True, truncation=True, 
                   return_tensors="tf")
output = model(**tokens)