大模型微调实战(2):调用本地模型

大模型向量数据库云存储
  1. 将模型下载到本地 ===========

上节课中,我们以 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}")  

模型文件介绍

执行完成后,模型文件就会被下载到本地了。

picture.image

我们会发现一下子多出来好几个文件,这些文件都是做什么的呢?下面就逐个来介绍一下。

config.json

config.json 是模型的配置文件,存储模型的结构配置参数,如 Transformer层数、隐藏层维度、注意力头数、词表长度、使用的 tokenizers 类型等等。

该文件定义了模型的结构,确保加载时能正确初始化模型。

picture.image

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。

picture.image

tokenizer_config.json

tokenizer_config.json 文件保存了分词器的配置信息,如分词类型(如WordPiece、BPE)、是否转小写、最大输入长度等。该配置文件决定了如何将文本切分为token。

picture.image

tokenizer 分词器是自然语言处理模型中的关键组件,它觉得了如何将文本内容转换为模型可以理解的数值形式。后面我们会专门介绍 tokenizer 的原理。

special_tokens_map.json

special_tokens_map.json 是特殊 token 映射文件,它 定义了 如何处理一些特殊的 token,主要包括以下几类:

  • [UNK]: 未知字符。

  • [SEP]: 分隔符。

  • [PAD]: 填充符。

  • [CLS]: 分类任务的起始标识。

  • [MASK]: 掩码标识。

如前文所述,任何模型在训练时都不会囊括所有字符,所以在遇到一些特殊字符时,需要定义一个映射关系,告诉模型如何处理。举例来说, 模型在推理时,如果遇到没有见过的文本,则会用 **[UNK]** 代替。

  1. 调用本地模型 =========

将模型文件下载到本地之后,我们就可以进行推理调用了。具体的实现可以参考下面的代码,我都附上了详细的注释:

  
# 导入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% 的词中选择下一个词,进一步增加生成的质量。

最终的生成结果如下:

picture.image

  1. 小结 =====

在本篇文章中,我们继续以 uer/gpt2-chinese-cluecorpussmall 这个模型为例,演示了如何从 Hugging Face上将模型下载到本地,并且在本地进行调用。 这才是目前大模型应用中更常用的开发范式,希望大家都能够了解。

在下一篇文章中,我们会进行一个综合性实战,使用 BERT 这个开源模型,进行中文评论的情感分享,敬请期待!

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论