首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Libtorch C++:保存/加载模型的有效/正确方法和再培训的优化状态

Libtorch C++:保存/加载模型的有效/正确方法和再培训的优化状态
EN

Stack Overflow用户
提问于 2022-10-04 14:08:45
回答 1查看 120关注 0票数 0

我正在寻找一种正确的、最有效的方法来保存、加载和重新使用C++中的模型,其中包括模型和优化器状态块。我相信所有设置都是正确的(但是这可能不适合保存和加载优化器状态块,只有我绝对确定的模型状态块),我的最后一个问题是我在哪里设置了优化器并给它提供模型参数。

储蓄模型和优化器:

代码语言:javascript
运行
复制
// 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进行再培训。

代码语言:javascript
运行
复制
// 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);

在创建优化器对象时,需要为其提供模型参数:

代码语言:javascript
运行
复制
std::shared_ptr<torch::optim::Optimizer> myOptimizer;
myOptimizer.reset(new torch::optim::Adam(myModel.parameters(), torch::optim::AdamOptions(LR)));

这是否应该在加载状态数据之前、之后、还是重要的时候完成?例如,我是这样做的:

代码语言:javascript
运行
复制
// Setup model and optimizer object, set model params in optimizer
// Load state dictionaries...
// Train epoch #n...
myOptimizer->step();
// Save state dictionaries
EN

Stack Overflow用户

回答已采纳

发布于 2022-10-04 18:43:16

为了回答我自己的问题,需要加载模型状态dict,然后将参数放入优化器对象中。然后将状态数据集加载到优化器对象中。

我的用例稍微复杂一些,因为我从正在进行培训的多个节点聚合渐变,并在“主”节点上执行优化器步骤。我试图简化上面的问题,我认为我不需要以前的状态dict,因为我是在聚合梯度。这是一个错误的假设。流程看起来是:

代码语言:javascript
运行
复制
// Load model state dict
// Aggregate gradients
// Load Optimizer state dict / params into optim
// Step
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73949214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档