备忘录
一、.safetensors 文件、.ckpt文件、.pth以及.bin文件
一. .safetensors 文件
1.1.背景和定义:
-.safetensors 是一种模型权重文件格式。它是由 Hugging Face 开发的,主要用于存储深度学习模型的参数。这种格式的设计目的是提供更安全和高效的模型权重存储方式。
特点:
1.2.特点:
1.2.1.安全性:
与其他一些格式相比,.safetensors 通过限制对文件内容的随意访问来提高安全性。例如,它可以防止一些潜在的恶意代码注入或意外修改模型权重。
1.2.2.内存高效:
在存储和加载模型权重时,它能够更有效地利用内存资源。这对于处理大型深度学习模型(如具有数十亿参数的语言模型)非常重要,因为它可以减少内存占用,提高加载速度。
1.3.应用场景:
在自然语言处理(NLP)领域,当存储预训练的语言模型(如 BERT、GPT 等模型的变体)权重时可以使用.safetensors 格式。比如在 Hugging Face 的 Transformer 库中,很多模型都提供了.safetensors 格式的权重文件,方便用户在不同的任务(如文本分类、机器翻译等)中加载和使用。
.safetensors 文件示例(以 Hugging Face Transformers 库为例)
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
import safetensors.torch
# 加载预训练模型和分词器
model_name = "bert-base-uncased"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 假设我们有一些示例输入数据进行处理(这里简单模拟)
input_text = "This is a sample sentence for testing."
inputs = tokenizer(input_text, return_tensors="pt")
# 进行前向传播(这里只是示例,不一定是实际完整的训练流程)
outputs = model(**inputs)
# 保存模型为.safetensors文件
model.save_pretrained("my_model_safetensors", save_format="safetensors")
# 加载.safetensors文件
loaded_model = AutoModelForSequenceClassification.from_pretrained("my_model_safetensors", local_files_only=True)
二. .ckpt 文件(Checkpoint File)
2.1.背景和定义:
-.ckpt 文件是深度学习模型训练过程中的检查点文件。在模型训练过程中,为了能够在后续恢复训练或者保存模型的阶段性成果,通常会定期保存模型的参数、优化器状态等信息到.ckpt 文件中。
2.2.特点:
2.2.1.包含训练状态信息:
它不仅包含模型的权重参数,还可能包含优化器的状态(如 Adam 优化器的动量等信息)。这使得可以从训练中断的地方继续训练,而不需要从头开始。
2.2.2.便于模型选择和评估:
在模型训练过程中,可以保存多个不同阶段的.ckpt 文件。通过比较这些文件对应的模型在验证集上的性能(如准确率、损失值等),可以选择性能最佳的模型进行后续的部署或者进一步优化。
2.3.应用场景:
在图像识别任务中,当训练一个复杂的卷积神经网络(如 ResNet、VGG 等)时,会定期保存.ckpt 文件。如果训练过程因为硬件故障、时间限制等原因中断,可以从最近的.ckpt 文件恢复训练,减少训练时间的浪费。同时,在训练结束后,可以根据这些检查点文件评估模型在不同训练阶段的性能,选择最适合实际应用的模型版本。
.ckpt 文件示例(以 PyTorch 为例)
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的神经网络模型
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
model = SimpleNet()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 假设我们有一些示例输入数据(这里简单模拟)
input_data = torch.randn(1, 10)
target = torch.randn(1, 1)
# 训练模型几个步骤(这里简化了,实际训练会更多轮次)
for i in range(5):
optimizer.zero_grad()
output = model(input_data)
loss = nn.MarginLoss()(output, target)
loss.backward()
optimizer.step()
# 保存模型为.ckpt文件,这里保存模型参数和优化器状态
torch.save({
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'epoch': i
}, 'checkpoint.ckpt')
# 加载.ckpt文件并恢复训练
checkpoint = torch.load('checkpoint.ckpt')
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
start_epoch = checkpoint['epoch'] + 1
# 可以继续进行训练等后续操作
for i in range(start_epoch, 10):
optimizer.zero_grad()
output = model(input_data)
loss = nn.MarginLoss()(output, target)
loss.backward()
optimizer.step()
三. .pth 文件(Checkpoint File)
3.1.背景和定义:
-.pth 文件通常是 PyTorch 深度学习框架中用于保存模型权重的一种格式。PyTorch 是一个广泛使用的深度学习框架,.pth 文件是其存储模型参数的主要方式之一。
3.2.特点:
3.2.1.与 PyTorch 紧密结合:
它可以方便地在 PyTorch 生态系统中进行加载和使用。通过简单的 PyTorch 加载函数(如torch.load()),可以轻松地将.pth 文件中的模型权重加载到定义好的模型结构中
3.2.2.灵活性:
可以保存整个模型的状态字典(包括所有层的权重和偏置等参数),也可以只保存模型的部分参数。这对于模型的迁移学习或者模型融合等操作非常方便。例如,在进行迁移学习时,可以加载预训练模型的.pth 文件,只提取其中一部分层的权重用于新的任务
3.3.应用场景:
在目标检测任务中,使用 PyTorch 框架训练的模型(如 Faster R - CNN)可以将模型权重保存为.pth 文件。在实际应用中,将.pth 文件加载到模型中,用于对新的图像数据进行目标检测。同时,在模型更新或者优化时,也可以方便地保存和加载新的.pth 文件来更新模型的权重。
.pth 文件示例(以 PyTorch 为例)
import torch
import torch.nn as nn
# 定义一个简单的神经网络模型
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
model = SimpleNet()
# 假设我们有一些示例输入数据(这里简单模拟)
input_data = torch.randn(1, 10)
target = torch.randn(1, 1)
# 训练模型几个步骤(这里简化了,实际训练会更多轮次)
for i in range(5):
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
optimizer.zero_grad()
output = model(input_data)
loss = nn.MarginLoss()(output, target)
loss.backward()
optimizer.step()
# 保存模型为.pth文件,这里只保存模型的参数
torch.save(model.state_dict(),'model.pth')
# 加载.pth文件
loaded_model = SimpleNet()
loaded_model.load_state_dict(torch.load('model.pth'))
# 可以使用加载后的模型进行预测等操作
output = loaded_model(input_data)
四. .bin 文件
4.1.背景和定义:
-.bin 文件本质上是二进制文件,在深度学习领域,它也可以用于存储模型权重等信息。它的格式比较通用,具体的内容解读取决于存储的是什么模型以及采用了什么样的存储约定。
4.2.特点:
4.2.1.通用性强:
因为是二进制格式,很多不同的软件和工具都可以生成和读取.bin 文件。不过,这也意味着它的内容格式可能因不同的用途而有很大差异
4.2.2.存储效率高:
二进制格式通常比文本格式在存储数据时更紧凑,占用更少的磁盘空间。对于大型深度学习模型,这可以有效减少存储成本
4.3.应用场景:
在一些深度学习推理引擎中,.bin 文件被用来存储模型权重,以便在边缘设备(如智能手机、物联网设备等)上快速加载和运行模型。例如,在一些轻量级的深度学习模型用于实时图像分类的场景中,模型权重以.bin 文件的形式存储在设备的本地存储中,方便快速加载并进行推理,减少延迟
.bin 文件示例(使用 PyTorch)
import torch
import torch.nn as nn
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
model = SimpleNet()
# 保存模型权重为.bin文件
weights = []
for param in model.parameters():
weights.append(param.data.cpu().numpy().tobytes())
with open('model_weights.bin', 'wb') as f:
for weight in weights:
f.write(weight)
加载.bin文件中的权重
# 加载.bin文件中的权重
# 重新创建模型
loaded_model = SimpleNet()
index = 0
with open('model_weights.bin', 'rb') as f:
for param in loaded_model.parameters():
size = np.prod(param.size())
data = f.read(size * 4) # 假设数据是float32类型,每个元素占4字节
new_param = torch.from_numpy(np.frombuffer(data, dtype=np.float32)).reshape(param.size())
param.data.copy_(new_param)
# 假设一些输入数据
input_data = torch.randn(1, 10)
output = loaded_model(input_data)
print(output)