加载Tokenizer和基础模型的解析及文件介绍:from_pretrained到底加载了什么?

加载Tokenizer和基础模型的解析及文件介绍

在使用Hugging Face的transformers库加载Tokenizer和基础模型时,涉及到许多文件的调用和解析。这篇博客将详细介绍这些文件的功能和它们在加载过程中的作用,同时结合代码片段进行解析。

下图是我本地下载好模型之后的样子:
在这里插入图片描述

下面结合上图进行解释。


1. 加载 Tokenizer

代码示例:

from transformers import AutoTokenizer

model_path = "你的模型路径"
tokenizer = AutoTokenizer.from_pretrained(model_path)

AutoTokenizer.from_pretrained(model_path) 的作用是加载一个Tokenizer对象,用于将文本转换为模型可识别的输入格式(token ID)。在加载过程中,它会依赖模型路径下的一些关键文件。

加载的文件:
  1. tokenizer.json

    • 作用:定义了词汇表和分词规则,是Tokenizer的核心文件。
    • 格式:通常是JSON格式,包含了以下内容:
      • vocab: 词汇表,每个词汇对应一个唯一的token ID。
      • merges: 如果是基于BPE(Byte Pair Encoding)的Tokenizer,会有合并规则。
      • special_tokens: 特殊标记(如<pad><unk><eos>等)。
  2. tokenizer_config.json

    • 作用:定义了Tokenzier的配置,比如是否使用特殊token、分词方式等。
    • 常见字段
      • do_lower_case: 是否将文本转为小写。
      • bos_token/eos_token: 开始和结束标记。
      • pad_token: 填充标记。
  3. special_tokens_map.json

    • 作用:映射特殊token(如<pad><unk>)到词汇表中的实际标记。
    • 常见字段
      • pad_token: <pad>
      • unk_token: <unk>
      • cls_token: <cls>
加载流程:
  1. 优先加载tokenizer.json来获取分词规则和词汇表。
  2. 使用tokenizer_config.json设置额外的配置参数。
  3. 如果存在special_tokens_map.json,会根据该文件映射特殊标记。

2. 加载基础模型(预训练权重)

代码示例:

from transformers import AutoModelForCausalLM

base_model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8b",  # 替换为基础模型路径
    torch_dtype=torch.float16,
    device_map="auto"
)

AutoModelForCausalLM.from_pretrained 的作用是加载预训练的基础模型,用于执行因果语言建模任务(如生成文本)。在加载时,它会调用模型路径中的一系列文件。

加载的文件:
  1. config.json

    • 作用:定义模型的结构配置,例如层数、隐藏单元数量、注意力头数等。
    • 常见字段
      • hidden_size: 隐藏层的大小。
      • num_attention_heads: 注意力头的数量。
      • num_hidden_layers: 模型的层数。
      • max_position_embeddings: 最大序列长度。
  2. generation_config.json

    • 作用:定义生成任务的配置,例如生成文本时的最大长度、温度等。
    • 常见字段
      • max_length: 生成文本的最大长度。
      • temperature: 生成时的多样性控制参数。
      • top_k/top_p: 生成时的采样策略。
  3. model.safetensorsmodel-xxxx-of-xxxx.safetensors

    • 作用:保存模型的权重。
    • 文件名解析:权重文件可能被分片存储,文件名中会标注分片信息,例如:
      • model-00001-of-00004.safetensors: 表示这是四个权重分片中的第一个。
    • 格式safetensors格式是优化的序列化格式,安全且高效。
  4. model.safetensors.index.json

    • 作用:如果权重文件被分片存储,该文件记录了每个分片的索引和分布信息。
加载流程:
  1. 解析config.json,构建基础模型的结构。
  2. 加载权重文件(safetensors.bin格式)到模型中。
  3. 如果有分片,则根据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. 注意事项
  1. 模型文件完整性:确保config.jsonsafetensors等文件都在路径中,否则可能加载失败。
  2. 设备配置:根据硬件资源调整device_map参数。
  3. 特殊Token:如果生成结果中出现<unk>等标记,可以检查special_tokens_map.json文件是否正确配置。

通过这篇博客,希望读者对加载Tokenizer和基础模型涉及的文件及其作用有了全面的了解,并能够在自己的任务中正确调用这些文件。

后记

2024年12月28日22点58分于上海,在GPT4o大模型辅助下完成。

<think>好的,现在我要帮用户解决关于加载Hugging Face模型的问题。用户之前遇到了连接超时的错误,现在他们想知道如何加载本地模型。首先,我需要确认用户当前的问题是什么。用户提供的代码是使用`from_pretrained('bert-base-uncased')`,所以默认情况下会从Hugging Face的服务器下载模型。但用户现在本地有模型在C盘的缓存目录,想知道该怎么处理。 用户之前已经遇到过网络问题导致下载失败,所以现在可能已经成功下载了模型到本地,或者他们希望避免再次下载,直接使用本地的副本。我需要先确认用户是否正确保存了模型到指定目录,以及目录结构是否正确。 接下来,我需要回忆Hugging Face库加载模型的机制。当调用`from_pretrained`时,库首先检查本地缓存,通常是默认的缓存路径,比如在用户的`.cache/huggingface`目录下。如果用户希望指定自定义路径,可以通过设置环境变量`TRANSFORMERS_CACHE`或者直接传递路径参数。或者,用户可以将模型文件放在正确结构的目录中,然后直接传递该路径给`from_pretrained`。 用户提到的路径是`C:\Users\Administrator\bert_cache`,我需要确保这个目录下包含模型的所有必要文件,比如`config.json`、`pytorch_model.bin`等。如果目录结构正确,用户可以直接传递这个路径作为模型名称,这样库就会从本地加载而不是远程下载。 可能的解决方案有几个:一是设置环境变量`TRANSFORMERS_CACHE`指向该目录,这样库会自动使用缓存中的模型;二是直接传递路径字符串给`from_pretrained`方法;三是使用`cache_dir`参数指定缓存目录。需要比较这些方法的区别,并推荐最直接的方法,即直接传递路径。 同时,用户可能需要确认他们的本地文件是否完整。如果之前下载中断,可能文件不完整,导致加载失败。需要提醒用户检查文件是否存在且完整,比如是否有`config.json`模型文件。 另外,用户可能对路径的写法有疑问,比如在Windows中使用反斜杠可能需要转义,或者使用原始字符串。建议使用正斜杠或双反斜杠来避免转义问题。 还需要考虑用户是否希望混合使用本地远程资源,比如如果本地缺少某些文件,是否允许从网络下载。不过根据用户的问题,他们可能希望完全离线加载,因此需要确保所有文件都在本地目录中。 最后,需要给出示例代码,并说明不同方法的适用场景,以及如何验证是否成功加载了本地模型。可能还需要提醒用户如果本地文件有问题,可能会抛出异常,这时候需要检查文件完整性或路径是否正确。</think>### 问题解答:本地加载与远程加载的区别 你提供的代码 `model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)` **默认会尝试从 Hugging Face 服务器下载模型**。但如果你已经将模型下载到本地目录 `C:\Users\Administrator\bert_cache`,可以通过以下方法直接加载本地模型,避免网络请求。 --- #### 1. **代码行为解析** - **远程加载**: 当参数为 `'bert-base-uncased'` 时,Hugging Face 库会: 1. 检查本地默认缓存路径(如 `~/.cache/huggingface`)是否存在该模型。 2. 若本地不存在,则从 `huggingface.co` 下载模型到缓存目录。 3. 加载模型并初始化分类头(`num_labels=2`)。 - **潜在问题**: 如果本地缓存目录中没有该模型,且网络连接失败(如之前的 `ConnectTimeoutError`),会导致加载失败。 --- #### 2. **本地模型加载方法** 若你已将完整模型文件保存在 `C:\Users\Administrator\bert_cache`,可以通过以下任一方式加载: ##### 方法 1:直接指定本地路径 ```python model = BertForSequenceClassification.from_pretrained( 'C:/Users/Administrator/bert_cache', # 直接传递本地路径 num_labels=2 ) ``` - **关键点**: - 路径需指向包含 `config.json` `pytorch_model.bin`(或 `tf_model.h5`)的目录。 - 路径中的斜杠建议使用 `/` 或双反斜杠 `\\`(Windows 兼容)。 ##### 方法 2:通过环境变量指定缓存目录 设置环境变量 `TRANSFORMERS_CACHE`,强制库从指定目录加载: ```python import os os.environ["TRANSFORMERS_CACHE"] = "C:/Users/Administrator/bert_cache" # 代码会优先从该目录加载模型 model = BertForSequenceClassification.from_pretrained( 'bert-base-uncased', num_labels=2 ) ``` ##### 方法 3:使用 `cache_dir` 参数(混合模式) 如果希望同时保留远程下载能力但优先使用本地目录: ```python model = BertForSequenceClassification.from_pretrained( 'bert-base-uncased', num_labels=2, cache_dir="C:/Users/Administrator/bert_cache" # 指定缓存目录 ) ``` --- #### 3. **验证本地模型完整性** 确保 `C:\Users\Administrator\bert_cache` 包含以下必要文件: ``` bert_cache/ ├── config.json # 模型配置 ├── pytorch_model.bin # PyTorch 模型权重 ├── tokenizer_config.json # 分词器配置 ├── vocab.txt # 词表 └── (其他可能的相关文件) ``` - **缺失文件会导致错误**:例如缺少 `config.json` 会触发 `OSError: Unable to load config`。 --- #### 4. **对比不同加载方式** | 加载方式 | 行为 | |--------------------------|----------------------------------------------------------------------| | `from_pretrained('bert-base-uncased')` | 优先从本地默认缓存加载,若不存在则从 Hugging Face 下载 | | `from_pretrained('本地路径')` | 直接从指定路径加载,完全跳过网络请求(离线模式) | | `cache_dir="本地路径"` | 优先从指定路径加载,若文件缺失则从 Hugging Face 下载并保存到该路径 | --- #### 5. **常见问题排查** - **错误:`OSError: Unable to load weights`** **原因**:本地目录缺少 `pytorch_model.bin` 或文件损坏。 **解决**:重新下载模型或检查文件完整性。 - **错误:`ValueError: Tokenizer class not found`** **原因**:本地目录缺少分词器文件(如 `tokenizer_config.json`)。 **解决**:确保模型目录包含完整的配置文件。 --- ### 总结 - **若需完全离线加载**:直接传递本地路径(方法 1)。 - **若需保留远程下载能力**:使用 `cache_dir` 参数(方法 3)。 - **路径格式注意**:Windows 路径建议使用 `/` 或转义符 `\\`,例如: `r'C:\Users\Administrator\bert_cache'` 或 `'C:/Users/Administrator/bert_cache'`。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值