Python怎么保存和恢复PyTorch训练中断的断点_checkpoint打包模型与优化器状态

真正可恢复的checkpoint至少需包含model.state_dict()、optimizer.state_dict()、当前epoch、最新loss,以及可选的lr_scheduler.state_dict()和随机数种子;漏掉optimizer.state_dict()会导致优化器状态丢失而收敛异常。

PyTorch保存checkpoint必须包含哪些关键字段

只保存模型参数(model.state_dict())不够,中断训练后恢复会报错或收敛异常。真正可恢复的checkpoint至少得打包:model.state_dict()optimizer.state_dict()、当前epoch、最新loss,以及可选的lr_scheduler.state_dict()和随机数种子。漏掉optimizer.state_dict()是新手最常踩的坑——模型能加载,但优化器内部动量、二阶矩等状态全丢,相当于从头开始训。

示例写法:

torch.save({
    'epoch': epoch,
    'model_state_dict': model.state_dict(),
    'optimizer_state_dict': optimizer.state_dict(),
    'loss': loss,
    'rng_state': torch.get_rng_state()
}, 'checkpoint.pth')

恢复checkpoint时model和optimizer要先初始化再load_state_dict

不能先load_state_dict()再定义模型或优化器——会报AttributeError: 'NoneType' object has no attribute 'load_state_dict'。必须确保modeloptimizer已实例化,且结构/参数名与保存时完全一致(比如用了nn.DataParallel但恢复时没加,或反之,会导致键不匹配)。

典型恢复流程:

Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

  • 先构建好modeloptimizer(结构、参数名、device一致)
  • torch.load()读取checkpoint字典
  • 分别调用model.load_state_dict(checkpoint['model_state_dict'])optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
  • 手动恢复start_epoch = checkpoint['epoch'] + 1,别忘了+1,否则会重复训当前epoch

多GPU训练下state_dict键名不一致导致KeyError

nn.DataParallelDistributedDataParallel时,保存的model.state_dict()键名带module.前缀;单卡恢复时若模型没套DataParallel,就会报KeyError: 'module.conv1.weight'。解决方法不是硬改键名,而是统一加载逻辑:

  • 单卡恢复多卡保存的checkpoint:用{k.replace('module.', ''): v for k, v in state_dict.items()}预处理
  • 更稳妥做法:训练脚本开头就判断是否启用DP,并在保存/加载时保持一致封装
  • DDP场景下注意torch.load(..., map_location)指定device,否则默认加载到CPU,后续model.to(device)不自动迁移optimizer状态

保存路径、覆盖策略和文件损坏防护

别直接覆盖旧checkpoint——万一写入中途断电,新旧全丢。推荐用带epoch编号的命名(如checkpoint_epoch_42.pth),并配合shutil.copyfile()先写临时文件再原子重命名。另外,训练重启前务必检查checkpoint文件是否完整:用torch.load(..., weights_only=True)(PyTorch ≥2.3)可防恶意序列化攻击;小项目也可加简单校验,比如读取后立刻assert 'epoch' in checkpoint

容易被忽略的是:如果用了自定义学习率调度器(如继承torch.optim.lr_scheduler._LRScheduler),它的状态也得进checkpoint,否则step()调用会出错——这个点文档很少提,但实际debug花时间最多。

相关推荐:

FastAPI如何处理复杂嵌套结构多表联合查询_Python结合Pydantic ORM模型嵌套映射

FastAPI 多表查询需 ORM(如 SQLAlchemy)或异步驱动(如 Motor)实现,Pydantic 仅负责结构化响应;关键在模型嵌套、查询写法、字段映射三者一致,否则易报 422 或返回 None。 FastAPI 本身不处理多表联合查询,真正干活的是 ORM(如 SQLAlchemy)或异步驱动(如 Motor),Pydantic 只负责把查出来的数据转成带校验的结构化响应。关键在...

如何用Python实现机器学习模型的数据漂移监控_集成AlibiDetect检测输入分布散度

TabularDrift比手动KL散度更可靠,因其采用MMD+RFF非参数检验,不假设分布、兼容混合特征并支持特征贡献分析;需正确配置cat_vars处理类别变量,且predict低延迟需优化。 AlibiDetect 的 TabularDrift 为什么比手动计算 KL 散度更可靠 直接用 scipy.stats.entropy 算训练集和线上 batch 的 KL 散度,结果波动大、阈值难设,...

为什么Python训练模型时CPU占用率过高_利用Multiprocessing多进程并发

ProcessPoolExecutor比手写Process更稳,因其内置进程复用、超时控制、异常透传;避免AttributeError需将函数置于模块顶层且非lambda/嵌套;max_workers应据内存与任务粒度调优,而非盲目设为cpu_count()。 训练模型时 CPU 占用率“过高”不是 bug,而是 multiprocessing 正常工作的表现——它真正在压满多核,而不是像 thr...

如何在 Vespa 中正确集成 ONNX 模型(使用 pyvespa)

本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,重点说明为何不能在应用包中直接引用宿主机或 docker 卷中的 onnx 文件,并提供可落地的解决方案:将模型文件嵌入 zip 包、正确配置 schema 与 model 定义、确保资源分配充足。 本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,重点说明为何不能在应用包中直接引用宿主机或 docker...

如何在 Vespa 中正确集成 ONNX 模型(PyVespa 教程)

本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,指出应用包内不可使用宿主机或 docker 卷路径,所有模型文件必须打包进应用 zip 并通过相对路径引用,同时提供可运行的 schema 配置与部署实践要点。 本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,指出应用包内不可使用宿主机或 docker 卷路径,所有模型文件必须打包进应用 zip 并通过...

如何在Python Django中实现分库分表逻辑_利用Router控制模型路由到指定库

Django的DatabaseRouter仅支持分库,无法自动分表,因其只在查询前选择数据库别名,不干预SQL生成与表名替换,分表需手动处理建表、查询、写入及迁移。 分库分表不能靠 Django 的 DatabaseRouter 完全实现,它只负责“路由到库”,不处理“表拆分逻辑”;真正要分表(比如按时间/用户ID哈希),必须手动干预查询、写入和迁移流程。 为什么 DatabaseRouter 只...

TensorFlow怎么导出模型为JS格式_Python转换TF.js模型部署网页

tensorflowjs_converter是唯一官方工具,需先将模型保存为SavedModel格式再转换;Keras模型若含自定义层等则无法直接由.h5转换,必须用save_format="tf";输入输出格式、加载API及权重分片配置须严格匹配。 tensorflowjs_converter 是唯一能完成 Python 模型到浏览器可用 JS 格式转换的官方工具,没有替代方案。直接用 tf.k...

如何将Python Flask应用打包成Docker镜像_编写Dockerfile脚本

Flask应用打包前必须确认的三个路径:app.py须置于根目录以避免ModuleNotFoundError;requirements.txt须与Dockerfile同目录或显式指定路径;import路径须适配容器内结构,确保config.py等依赖文件被正确COPY且不在被忽略目录中。 Flask应用打包前必须确认的三个路径 你的 app.py(或主入口文件)不能藏在子目录里,Docker 构建...