Models(模型)是Hugging Face Hub的核心,这里对于如何下载预训练模型,采用Transformers进行加载、微调等做一个充分的介绍。
Models下载
其实用户可以手动下载,比如在页面:下载页面去下载。
也可以通过代码去下载:
from huggingface_hub import hf_hub_download
import joblib
REPO_ID = "stabilityai/stable-diffusion-xl-base-1.0"
FILENAME = "sd_xl_base_1.0.safetensors"
model = joblib.load(
hf_hub_download(repo_id=REPO_ID, filename=FILENAME)
)
也可以通过Transformers
库下载,后面会介绍到。
除了下载外,有很多libraries也支持Hub,或者说这些库和Hub进行了良好的集成,可以参见:模型库。
Transformers
Transformers是用于NLP开发的模型,由Hugging Face开发的一个library,和Hub进行了集成,在Hub上面,很多模型都是基于transformers开发的,这些models的功能有很多:
- NLP:文本分类,命名实体识别,问答,语言模型,摘要,翻译,文本生成
- 计算机视觉:文本分类,目标检测,分割
- 音频:语音识别,语音分类
- 多模态:表格问答,OCR,信息抽取,视频分类,视觉问答
Transformers提供了快速的下载和使用的API,可以使用预训练数据,也可以在用户自己的数据集、文本上进行微调,然后分享到社区中。支持三个最热门的深度学习库:Jax,PyTorch 以及 TensorFlow,也就是说,可以用一个框架来训练,用另外一个框架来加载和推理。
模型都是可以在线体验的,比如:
比较强悍的是,Hugging Face提供了私有模型托管服务,包括模型版本管理,推理API。
安装
需要安装一些必要的库:
$ pip install transformers datasets evaluate accelerate
$ pip install torch
快速上手
- 使用 pipeline:使用预训练模型做inference的最简单方式
from transformers import pipeline
classifier = pipeline(task='sentiment-analysis')
classifier('you are so beautiful.')
# result
[{'label': 'POSITIVE', 'score': 0.9998807907104492}]
模型会在缓存中保留:
$ ls ~/.cache/huggingface/hub/
models--distilbert--distilbert-base-uncased-finetuned-sst-2-english
models--stabilityai--stable-diffusion-xl-base-1.0
version.txt
要看transformers
支持的任务,可以查阅这里。
- 使用 AutoTokenizer, TFAutoModel
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
model = AutoModel.from_pretrained("google-bert/bert-base-uncased")
inputs = tokenizer("Hello world!", return_tensors="pt")
outputs = model(**inputs)
注意tokenizer
,Tokenizer的作用就是将连续的文本切分成离散的Token,并为每个Token分配一个唯一的标识符(ID),以便于模型进行后续的处理。
Tokenizer的工作原理可以分为两个主要步骤:词汇表构建和文本切分。
1)词汇表构建
词汇表是Tokenizer工作的基础,它包含了所有可能出现的Token。在构建词汇表时,通常会使用大量的语料库数据进行统计,从而得到一个包含所有出现过的单词、标点符号和子词的列表。此外,为了提高模型的泛化能力,通常还会在词汇表中添加一些特殊的Token,如<unk>
(未知词)、<pad>
(填充词)和<eos>
(句尾标记)等。
2)文本切分
在文本切分阶段,Tokenizer会根据词汇表将输入文本拆分成一系列Token。对于每个Token,Tokenizer会查找其在词汇表中的ID,并将这个ID作为该Token的数值表示。如果某个Token不在词汇表中,则通常会将其视为未知词,并使用<unk>
的ID进行替换。
- 在pipeline()中设置model,tokenizer
from transformers import AutoTokenizer, AutoModelForSequenceClassification
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
classifier("you are not so cool.")
参考:transformers详细文档。