- 将模型下载到本地 ===========
在上节课中,我们以 uer/gpt2-chinese-cluecorpussmall
这个模型为例,讲解了如何使用通过 HTTP 请求的方式调用 Hugging Face 上的在线模型。
但是实际上,这种方式仅适用于个人测试。由于数据隐私和网络限制等原因,我们通常不会直接使用 Hugging Face 上的在线模型,而是会将模型下载到本地,并私有部署。
这节课我们就实战模型的下载与私部署。
安装依赖库
想要下载 Hugging Face 上的模型,最高效的方式就是直接使用 Hugging Face 的 transformers 库。
首先我们需要安装依赖:
pip install transformers datasets tokenizers
简单介绍下这几个依赖库的作用:
-
transformers 模型:这是 Hugging Face 的核心库,主要用于模型的下载、训练和推理等等。它提供简洁的 pipeline 组件,可以快速调用模型接口。因为大部分的大语言模型底层都是基于 Transformer 架构,因此该库被命名为 transformers。
-
datasets 数据集: 针对数据集,提供数据预处理/清洗/版本控制功能,可以与 transformer 库无缝对接。
-
tokenizers 分词器: 提供了高性能的分词器实现,支持BPE/WordPiece 等主流分词算法。分词器通常与具体的模型绑定,每个大模型都有与之匹配的分词器实现。
下载模型
准备好了依赖环境,我们就可以下载模型了。下面是参考代码:
import dotenv
# 导入transformers依赖库
# AutoModelForCausalLM代表模型
# AutoTokenizer代表分词器
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载环境变量
dotenv.load_dotenv()
# 指定模型名称和保存路径
model_name = "uer/gpt2-chinese-cluecorpussmall"
# 指定模型文件保存路径
cache_dir = "./my_model/uer/gpt2-chinese-cluecorpussmall"
# 下载模型和分词器到指定路径
# 分词器通常与具体的模型绑定,每个大模型都有与之匹配的分词器实现
AutoModelForCausalLM.from_pretrained(model_name, cache_dir=cache_dir)
AutoTokenizer.from_pretrained(model_name, cache_dir=cache_dir)
print(f"模型与分词器下载完成。路径: {cache_dir}")
模型文件介绍
执行完成后,模型文件就会被下载到本地了。
我们会发现一下子多出来好几个文件,这些文件都是做什么的呢?下面就逐个来介绍一下。
config.json
config.json 是模型的配置文件,存储模型的结构配置参数,如 Transformer层数、隐藏层维度、注意力头数、词表长度、使用的 tokenizers 类型等等。
该文件定义了模型的结构,确保加载时能正确初始化模型。
pytorch_model.bin
pytorch_model.bin 是模型和核心参数文件,保存了模型训练后的权重参数(最重要的就是weight、bias 等)。这是模型的核心文件,包含了所有可学习的参数值。
因为我们采用的是 PyTorch 框架,所以该文件也是以PyTorch 格式的。
vocab.txt
vocab.txt 文件是分词器的词汇表,包含模型能识别的所有词汇或子词(token)。如果是中文模型,通常包含汉字、标点符号和特殊符号。
对于任何模型来说,词表都不可能是无限的,它会存在长度上限,这个上限就是在 config.json 文件中指定的。以 uer/gpt2-chinese-cluecorpussmall
这个模型为例,它指定了 vocab_size = 21128,即词表中共有 21128 个 token。
tokenizer_config.json
tokenizer_config.json 文件保存了分词器的配置信息,如分词类型(如WordPiece、BPE)、是否转小写、最大输入长度等。该配置文件决定了如何将文本切分为token。
tokenizer 分词器是自然语言处理模型中的关键组件,它觉得了如何将文本内容转换为模型可以理解的数值形式。后面我们会专门介绍 tokenizer 的原理。
special_tokens_map.json
special_tokens_map.json 是特殊 token 映射文件,它 定义了 如何处理一些特殊的 token,主要包括以下几类:
-
[UNK]: 未知字符。
-
[SEP]: 分隔符。
-
[PAD]: 填充符。
-
[CLS]: 分类任务的起始标识。
-
[MASK]: 掩码标识。
如前文所述,任何模型在训练时都不会囊括所有字符,所以在遇到一些特殊字符时,需要定义一个映射关系,告诉模型如何处理。举例来说, 模型在推理时,如果遇到没有见过的文本,则会用 **[UNK]**
代替。
- 调用本地模型 =========
将模型文件下载到本地之后,我们就可以进行推理调用了。具体的实现可以参考下面的代码,我都附上了详细的注释:
# 导入transformers依赖库
# AutoModelForCausalLM代表模型
# AutoTokenizer代表分词器
# pipeline是Hugging Face提供的一个高级工具,用于简化模型的调用
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
# 指定模型文件保存路径
cache_dir = "./my_model/uer/gpt2-chinese-cluecorpussmall/models--uer--gpt2-chinese-cluecorpussmall/snapshots/c2c0249d8a2731f269414cc3b22dff021f8e07a3"
# 设置推理设备类型
# 如果有有CUDA环境,则使用CUDA进行推理;否则采用CPU
device = "cuda" if torch.cuda.is_available() else "cpu"
# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained(cache_dir)
tokenizer = AutoTokenizer.from_pretrained(cache_dir)
# 使用加载的模型和分词器创建生成文本的pipeline
generator = pipeline("text-generation", model=model, tokenizer=tokenizer, device=device)
# 生成文本
output = generator(
"请帮我讲一个冷笑话:",
max_length=50,
num_return_sequences=1,
truncation=True,
temperature=0.7,
top_k=50,
top_p=0.9,
clean_up_tokenization_spaces=True
)
print(output)
在调用 generator 函数生成文本时,我们传入了一些参数来控制生成内容的质量,这里具体介绍下这些参数的作用:
-
max_length: 指定生成文本的最大长度,以 token 为单位。这里设置为最多生成100个token。
-
num_return_sequences: 生成文本序列的数量,这里设置为1,表示仅生成1段回复。
-
truncation: 表示是否截断输入文本以适应模型的最大输入长度。因为模型生成的回复长度是有上限的,如果该参数设置为 False,则模型如果无法处理过长的输入,可能会报错。所以这里设置为 True,表示当回复长度超过上限时,会对输入内容进行截断。
-
temperature: 该参数控制生成文本的随机性。值越低,生成文本的确定性越强;而值越高,则生成的文本的随机性越强。通常 0.7 是一个较为常见的设置,既保留了部分随机性,又不至于太混乱。
-
top_k: 该参数限制模型在每一步生成时,仅从概率最高的 k 个词中选择下一个词。这里 top_k=50 表示模型在生成每个词时只考虑概率最高的前 50 个候选词,从而减少生成不太可能的词的概率。
-
top_p: 核采样率。该参数与 temperature 的作用类似,都可以用于控制生成内容的随机性。top_p 的含义是:它会选择一组累积概率达到 p 的词汇,模型只会从这个概率集合中采样。这里设置top_p=0.9 ,意味着模型会在可能性最强的 90% 的词中选择下一个词,进一步增加生成的质量。
最终的生成结果如下:
- 小结 =====
在本篇文章中,我们继续以 uer/gpt2-chinese-cluecorpussmall
这个模型为例,演示了如何从 Hugging Face上将模型下载到本地,并且在本地进行调用。 这才是目前大模型应用中更常用的开发范式,希望大家都能够了解。
在下一篇文章中,我们会进行一个综合性实战,使用 BERT 这个开源模型,进行中文评论的情感分享,敬请期待!