加载Tokenizer和基础模型的解析及文件介绍
在使用Hugging Face的transformers
库加载Tokenizer和基础模型时,涉及到许多文件的调用和解析。这篇博客将详细介绍这些文件的功能和它们在加载过程中的作用,同时结合代码片段进行解析。
下图是我本地下载好模型之后的样子:
下面结合上图进行解释。
1. 加载 Tokenizer
代码示例:
from transformers import AutoTokenizermodel_path = "你的模型路径"
tokenizer = AutoTokenizer.from_pretrained(model_path)
AutoTokenizer.from_pretrained(model_path)
的作用是加载一个Tokenizer对象,用于将文本转换为模型可识别的输入格式(token ID)。在加载过程中,它会依赖模型路径下的一些关键文件。
加载的文件:
-
tokenizer.json
- 作用:定义了词汇表和分词规则,是Tokenizer的核心文件。
- 格式:通常是JSON格式,包含了以下内容:
vocab
: 词汇表,每个词汇对应一个唯一的token ID。merges
: 如果是基于BPE(Byte Pair Encoding)的Tokenizer,会有合并规则。special_tokens
: 特殊标记(如<pad>
、<unk>
、<eos>
等)。
-
tokenizer_config.json
- 作用:定义了Tokenzier的配置,比如是否使用特殊token、分词方式等。
- 常见字段:
do_lower_case
: 是否将文本转为小写。bos_token
/eos_token
: 开始和结束标记。pad_token
: 填充标记。
-
special_tokens_map.json
- 作用:映射特殊token(如
<pad>
、<unk>
)到词汇表中的实际标记。 - 常见字段:
pad_token
:<pad>
。unk_token
:<unk>
。cls_token
:<cls>
。
- 作用:映射特殊token(如
加载流程:
- 优先加载
tokenizer.json
来获取分词规则和词汇表。 - 使用
tokenizer_config.json
设置额外的配置参数。 - 如果存在
special_tokens_map.json
,会根据该文件映射特殊标记。
2. 加载基础模型(预训练权重)
代码示例:
from transformers import AutoModelForCausalLMbase_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8b", # 替换为基础模型路径torch_dtype=torch.float16,device_map="auto"
)
AutoModelForCausalLM.from_pretrained
的作用是加载预训练的基础模型,用于执行因果语言建模任务(如生成文本)。在加载时,它会调用模型路径中的一系列文件。
加载的文件:
-
config.json
- 作用:定义模型的结构配置,例如层数、隐藏单元数量、注意力头数等。
- 常见字段:
hidden_size
: 隐藏层的大小。num_attention_heads
: 注意力头的数量。num_hidden_layers
: 模型的层数。max_position_embeddings
: 最大序列长度。
-
generation_config.json
- 作用:定义生成任务的配置,例如生成文本时的最大长度、温度等。
- 常见字段:
max_length
: 生成文本的最大长度。temperature
: 生成时的多样性控制参数。top_k
/top_p
: 生成时的采样策略。
-
model.safetensors
或model-xxxx-of-xxxx.safetensors
- 作用:保存模型的权重。
- 文件名解析:权重文件可能被分片存储,文件名中会标注分片信息,例如:
model-00001-of-00004.safetensors
: 表示这是四个权重分片中的第一个。
- 格式:
safetensors
格式是优化的序列化格式,安全且高效。
-
model.safetensors.index.json
- 作用:如果权重文件被分片存储,该文件记录了每个分片的索引和分布信息。
加载流程:
- 解析
config.json
,构建基础模型的结构。 - 加载权重文件(
safetensors
或.bin
格式)到模型中。 - 如果有分片,则根据
index.json
加载完整的权重。
3. 总结文件作用
文件名 | 作用 | 加载阶段 |
---|---|---|
tokenizer.json | 定义词汇表和分词规则 | 加载Tokenizer |
tokenizer_config.json | 配置Tokenizer的额外参数 | 加载Tokenizer |
special_tokens_map.json | 映射特殊标记到词汇表中的实际标记 | 加载Tokenizer |
config.json | 定义模型的结构配置 | 加载基础模型 |
generation_config.json | 定义生成任务的配置参数 | 加载基础模型 |
model.safetensors | 保存模型权重 | 加载基础模型 |
model-xxxx-of-xxxx.safetensors | 分片保存的模型权重 | 加载基础模型 |
model.safetensors.index.json | 记录分片权重的索引和分布信息 | 加载基础模型 |
4. 示例:加载和评估模型
以下是一个完整的代码示例,展示如何加载本地的模型文件并进行简单的评估:
from transformers import AutoTokenizer, AutoModelForCausalLM# 模型路径
model_path = "xxx/models--meta-llama--Llama-3.1-8B/snapshots/d04e592b4f6aa9cfee91e2e20afa771667e1d4b"# 1. 加载Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_path)# 2. 加载基础模型
model = AutoModelForCausalLM.from_pretrained(model_path,torch_dtype=torch.float16,device_map="auto"
)# 3. 测试生成
input_text = "你好,欢迎使用LLaMA模型。"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
5. 注意事项
- 模型文件完整性:确保
config.json
、safetensors
等文件都在路径中,否则可能加载失败。 - 设备配置:根据硬件资源调整
device_map
参数。 - 特殊Token:如果生成结果中出现
<unk>
等标记,可以检查special_tokens_map.json
文件是否正确配置。
通过这篇博客,希望读者对加载Tokenizer和基础模型涉及的文件及其作用有了全面的了解,并能够在自己的任务中正确调用这些文件。
后记
2024年12月28日22点58分于上海,在GPT4o大模型辅助下完成。