模型文件详解

env

conda install -c nvidia cuda-compiler

solve nvcc not found

1
2
3
4
5
conda install -c conda-forge cudatoolkit
conda search -c nvidia cudatoolkit
conda search -c conda-forge cudatoolkit

conda install cuda

Tensorflow

1
2
3
saver = tf.train.Saver()

saver.save(sess,"./checkpoint_dir/MyModel")
1
2
3
4
5
model_folder:
------checkpoint # checkpoint文件是存储所有模型文件的名字,在使用tf.train.latest_checkpoint()的时候,该函数会借助此文件内容获取最新模型文件。
------model.meta # 文件是图的基本架构,pb格式文件,里面包含变量,操作,集合等数据。 保存网络图结构
------model.data-00000-of-00001 # 数据文件,保存的是网络的权值,偏置,操作等等
------model.index # 文件保存了辅助索引信息: 是一个不可变得字符串表,每一个键都是张量的名称,它的值描述张量的元数据:“数据”文件中的哪个文件包含张量的内容,该文件的偏移量,校验和,一些辅助数据等等
1
tf.saved_model.save() 
1
2
3
4
5
6
7
.
├── assets # 目录包含 TensorFlow 计算图使用的文件,例如,用于初始化词汇表的文本文件
├── saved_model.pb  # 文件用于存储实际 TensorFlow 程序或模型,以及一组已命名的签名——每个签名标识一个接受张量输入和产生张量输出的函数。
└── variables
    ├── variables.data-00000-of-00001
    └── variables.index

Pytorch

https://www.cnblogs.com/zhangxuegold/p/17588049.html

格式 解释 适用场景
.pt 或 .pth PyTorch 的默认模型文件格式,用于保存和加载完整的 PyTorch 模型,包含模型的结构和参数等信息。
需要保存和加载完整的 PyTorch 模型的场景,例如在训练中保存最佳的模型或在部署中加载训练好的模型。
.bin 一种通用的二进制格式,可以用于保存和加载各种类型的模型和数据。 需要将 PyTorch 模型转换为通用的二进制格式的场景。
ONNX 一种通用的模型交换格式,可以用于将模型从一个深度学习框架转换到另一个深度学习框架或硬件平台。在 PyTorch 中,可以使用 torch.onnx.export 函数将 PyTorch 模型转换为 ONNX 格式。 需要将 PyTorch 模型转换为其他深度学习框架或硬件平台可用的格式的场景。
TorchScript PyTorch 提供的一种序列化和优化模型的方法,可以将 PyTorch 模型转换为一个序列化的程序,并使用 JIT 编译器对模型进行优化。在 PyTorch 中,可以使用 torch.jit.trace 或 torch.jit.script 函数将 PyTorch 模型转换为 TorchScript 格式。 需要将 PyTorch 模型序列化和优化,并在没有 Python 环境的情况下运行模型的场景。

.pt .pth格式

一个完整的Pytorch模型文件,包含了如下参数:

  • model_state_dict:模型参数
  • optimizer_state_dict:优化器的状态
  • epoch:当前的训练轮数
  • loss:当前的损失值

下面是一个.pt文件的保存和加载示例(注意,后缀也可以是 .pth ):

  • .state_dict():包含所有的参数和持久化缓存的字典,model和optimizer都有这个方法 ,但是没有保存模型的结构,在其他地方使用的时候,必须先重新定义相同结构的模型(或兼容模型),才能够加载模型参数进行使用,如果我们想直接把整个模型都保存下来,避免重新定义模型 torch.save(model, PATH)
  • torch.save():将所有的组件保存到文件中

bin格式

.bin文件是一个二进制文件,可以保存Pytorch模型的参数和持久化缓存。.bin文件的大小较小,加载速度较快,因此在生产环境中使用较多。

.onnx格式

上述保存的文件可以通过PyTorch提供的torch.onnx.export函数转化为ONNX格式,这样可以在其他深度学习框架中使用PyTorch训练的模型。

保存场景 保存方法 文件后缀
整个模型 model = Net() torch.save(model, PATH) .pt .pth .bin
仅模型参数 model = Net() torch.save(model.state_dict(), PATH) .pt .pth .bin
checkpoints使用 model = Net() torch.save({ ‘epoch’: 10, ‘model_state_dict’: model.state_dict(), ‘optimizer_state_dict’: optimizer.state_dict(), ‘loss’: loss, }, PATH) .pt .pth .bin
ONNX通用保存 model = Net() model.load_state_dict(torch.load(“model.bin”)) example_input = torch.randn(1, 3) torch.onnx.export(model, example_input, “model.onnx”, input_names=[“input”], output_names=[“output”]) .onnx
TorchScript无python环境使用 model = Net() model_scripted = torch.jit.script(model) # Export to TorchScript model_scripted.save(‘model_scripted.pt’) 使用时: model = torch.jit.load(‘model_scripted.pt’) model.eval() .pt .pth

Hugging Face

  • config.json:模型配置文件,包含了模型的各种参数设置,例如层数、隐藏层大小、注意力头数及Transformers API的调用关系等,用于加载、配置和使用预训练模型。
  • configuration_chatglm.py:是该config.json文件的类表现形式,模型配置的Python类代码文件,定义了用于配置模型的ChatGLMConfig 类。
  • modeling_chatglm.py:源码文件,ChatGLM对话模型的所有源码细节都在该文件中,定义了模型的结构和前向传播过程,例如 ChatGLMForConditionalGeneration 类。
  • model-XXXXX-of-XXXXX.safetensors:安全张量文件,保存了模型的权重信息。这个文件通常是 TensorFlow 模型的权重文件。
  • model.safetensors.index.json:模型权重索引文件,提供了 safetensors 文件的索引信息。
  • pytorch_model-XXXXX-of-XXXXX.bin:PyTorch模型权重文件,保存了模型的权重信息。这个文件通常是 PyTorch模型的权重文件。
  • pytorch_model.bin.index.json:PyTorch模型权重索引文件,提供了 bin 文件的索引信息。

说明1

  • 在实际使用过程中不需要将这两种类型的权重文件都下载下来,只需要下载一类即可,还包括对应的.index.json
  • 在使用过程中都是调用transformers包进行加载,两种格式都可以加载,即使在PyTorch环境中也可以下载.safetensors格式的模型权重进行加载,只要安装了transformers包即可。

说明2:

传统的,Pytorch会保存一个完整的文件,包含参数名到权重的映射关系。这个映射关系表称为state_dict

1
2
3
4
5
6
7
8
# PyTorch文档给出的保存和加载模型代码示例
# Save the model weights
torch.save(my_model.state_dict(), 'model_weights.pth')

# Reload them
new_model = ModelClass()
new_model.load_state_dict(torch.load('model_weights.pth'))

在模型参数小于10亿时,上面代码一般运行没有问题。但是对于大模型(超过10亿参数),上面的代码就有点不能用了。像ChatGPT模型有1760亿个参数,就算使用全精度(bfloat16数据类型)来保存权重,它会消耗352GB的存储空间。对于超级计算机,可以完成加载、训练和保存的任务,但是对于用户侧的推理,这个存储需求就要另外想办法了。

这个方法就是将模型权重文件切分为多个文件,如果模型.bin文件形式进行保存,会得到两种后缀格式的文件:

  • pytorch_model_xxxxx-of-000XX.bin:每个都是模型权重的一部分,通过这种文件格式切分,可以在内存中一个一个加载(不用全部加载,导致超出内存存储能力。可以实现加载部分权重到模型、移动到GPU或其他设备上进行计算、以及加载下一部分权重时,去除上一部分已加载的权重来释放内存或显存等)。与加载全部的模型不同,我们的机器只需要能够加载最大的一个checkpoint即可,这里称为分片。

  • pytorch_model.bin.index.json:参数名 与 模型bin文件的映射表。

  • quantization.py:量化代码文件,包含了模型量化的相关代码。
  • special_tokens_map.json:特殊标记映射文件,用于指定特殊标记(如起始标记、终止标记等)的映射关系。
  • tokenization_chatglm.py:分词器的Python类代码文件,用于chatglm3-6b模型的分词器,它是加载和使用模型的必要部分,定义了用于分词的 ChatGLMTokenizer 类。
  • tokenizer.model:包含了训练好的分词模型,保存了分词器的模型信息,用于将输入文本转换为标记序列;通常是二进制文件,使用pickle或其他序列化工具进行存储和读取。
  • tokenizer_config.json:含了分词模型的配置信息,用于指定分词模型的超参数和其他相关信息,例如分词器的类型、词汇表大小、最大序列长度、特殊标记等