我正在寻找一种正确的、最有效的方法来保存、加载和重新使用C++中的模型,其中包括模型和优化器状态块。我相信所有设置都是正确的(但是这可能不适合保存和加载优化器状态块,只有我绝对确定的模型状态块),我的最后一个问题是我在哪里设置了优化器并给它提供模型参数。
储蓄模型和优化器:
// Save model state
torch::serialize::OutputArchive output_model_archive;
myModel.to(torch::kCPU);
myModel.save(output_model_archive);
output_model_archive.save_to(model_state_dict_path);
// Save optim state
torch::serialize::OutputArchive output_optim_archive;
myOptimizer->save(output_optim_archive);
output_optim_archive.save_to(optim_state_dict_path);
加载模型和optim进行再培训。
// Load model state
torch::serialize::InputArchive input_archive;
input_archive.load_from(state_dict);
myModel.load(input_archive);
// Load optim state
torch::serialize::InputArchive input_archive;
input_archive.load_from(state_dict);
myOptimizer->load(input_archive);
在创建优化器对象时,需要为其提供模型参数:
std::shared_ptr<torch::optim::Optimizer> myOptimizer;
myOptimizer.reset(new torch::optim::Adam(myModel.parameters(), torch::optim::AdamOptions(LR)));
这是否应该在加载状态数据之前、之后、还是重要的时候完成?例如,我是这样做的:
// Setup model and optimizer object, set model params in optimizer
// Load state dictionaries...
// Train epoch #n...
myOptimizer->step();
// Save state dictionaries
发布于 2022-10-04 18:43:16
为了回答我自己的问题,需要加载模型状态dict,然后将参数放入优化器对象中。然后将状态数据集加载到优化器对象中。
我的用例稍微复杂一些,因为我从正在进行培训的多个节点聚合渐变,并在“主”节点上执行优化器步骤。我试图简化上面的问题,我认为我不需要以前的状态dict,因为我是在聚合梯度。这是一个错误的假设。流程看起来是:
// Load model state dict
// Aggregate gradients
// Load Optimizer state dict / params into optim
// Step
https://stackoverflow.com/questions/73949214
复制相似问题