torch使用
torch保存模型参数
可以使用torch.save函数来保存模型参数,该函数接受两个参数:要保存的对象和文件路径。要保存的对象通常是模型的state_dict(),它包含了模型中所有参数的名称和参数本身的映射关系。以下是一个示例代码:
import torch
# 定义模型
model = torch.nn.Linear(10, 2)
# 保存模型参数
torch.save(model.state_dict(), 'model_params.pth')
在上面的代码中,我们创建了一个简单的线性模型,并将其state_dict()保存到名为’model_params.pth’的文件中。要加载模型参数,可以使用torch.load()函数。例如:
import torch
# 定义模型
model = torch.nn.Linear(10, 2)
# 加载模型参数
model.load_state_dict(torch.load('model_params.pth'))
在上面的代码中,我们加载了’model_params.pth’文件中的模型参数,将它们加载到模型中。注意,如果模型的结构不同,加载参数时可能会出现错误。因此,保存模型参数时应该同时保存模型结构的信息。
from transformers.trainer import TRAINING_ARGS_NAME 这里面的TRAINING_ARGS_NAME是什么
TRAINING_ARGS_NAME是一个字符串常量,它的值为"training_args.bin"。它在transformers.trainer模块中被定义,用作保存和加载训练参数的文件名。 在transformers.Trainer中,训练参数(TrainingArguments)被保存为一个二进制文件。该文件包含了训练参数的所有信息,包括学习率、批次大小、最大迭代次数等。通过将训练参数保存为文件,我们可以在需要时轻松地加载和重用它们。 为了方便起见,transformers.Trainer中提供了一个常量TRAINING_ARGS_NAME,它指定了训练参数文件的默认名称。当我们需要保存或加载训练参数时,可以使用该常量,而不需要手动指定文件名。
model.gradient_checkpointing_enable()
model.gradient_checkpointing_enable() 方法是用来启用梯度检查点技术的。梯度检查点技术是一种优化技术,可以在计算梯度时减少显存的使用,可以将需要计算梯度的神经网络的一部分暂存到硬盘上,只在必要时再从硬盘中取出来计算,从而减少显存的使用。 在你的代码中并没有调用 model.gradient_checkpointing_enable() 方法,因此该模型并没有启用梯度检查点技术。如果你需要启用梯度检查点技术,可以在模型初始化时使用 gradient_checkpointing=True 参数,如下所示:
model = AutoModel.from_pretrained(
"THUDM/chatglm-6b", load_in_8bit=True, trust_remote_code=True, device_map="auto", gradient_checkpointing=True
)
这将启用梯度检查点技术。
model.enable_input_require_grads()
model.enable_input_require_grads() 是一个私有方法,它用于启用模型输入的 requires_grad 属性,从而允许计算输入对模型输出的梯度。在一般情况下,不需要手动调用该方法,因为在 PyTorch 中,requires_grad 属性是默认开启的。只有在需要禁用 requires_grad 属性时,才需要手动调用 torch.no_grad()。 如果你需要在输入上计算梯度,可以直接在输入张量上设置 requires_grad=True,如下所示:
import torch
from transformers import AutoModel
model = AutoModel.from_pretrained("bert-base-uncased")
input_ids = torch.tensor([[1, 2, 3], [4, 5, 6]])
input_ids.requires_grad = True
outputs = model(input_ids)
loss = outputs.loss
loss.backward()
input_grads = input_ids.grad
在上面的例子中,我们将 input_ids 张量设置为 requires_grad=True,从而允许计算 input_ids 对 loss 的梯度。最后,我们可以通过 input_ids.grad 获取 input_ids 对 loss 的梯度。
model.is_parallelizable = True和model.model_parallel = True
model.is_parallelizable = True 和 model.model_parallel = True 是两个不同的属性。 model.is_parallelizable 是一个只读属性,用于指示当前模型是否可以并行化。该属性是根据模型中的各层自动推断出来的,如果所有层的输入和输出大小都相同,那么该属性就为 True。如果模型不支持并行化,则该属性为 False。 model.model_parallel 是一个布尔类型的属性,用于指示是否启用模型并行化。启用模型并行化可以加速模型的训练和推理,特别是在处理大型模型和大型数据集时。如果该属性为 True,则模型会被分成多个部分,并行计算每个部分。这些部分可以在多个 GPU 或计算机上运行。 通常,启用模型并行化需要在模型初始化时进行设置,如下所示:
import torch
from transformers import AutoModel
model = AutoModel.from_pretrained("bert-base-uncased")
model = torch.nn.DataParallel(model)
# 使用多个 GPU 训练模型
model.to("cuda")
在上面的例子中,我们使用 torch.nn.DataParallel 将模型并行化,然后将模型移到 cuda 设备上进行训练。