2026-05-28 ·
日常编程 ·
159223
真正可恢复的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'。必须确保model和optimizer已实例化,且结构/参数名与保存时完全一致(比如用了nn.DataParallel但恢复时没加,或反之,会导致键不匹配)。
典型恢复流程:
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
先构建好model和optimizer(结构、参数名、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.DataParallel或DistributedDataParallel时,保存的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 多表查询需 ORM(如 SQLAlchemy)或异步驱动(如 Motor)实现,Pydantic 仅负责结构化响应;关键在模型嵌套、查询写法、字段映射三者一致,否则易报 422 或返回 None。 FastAPI 本身不处理多表联合查询,真正干活的是 ORM(如 SQLAlchemy)或异步驱动(如 Motor),Pydantic 只负责把查出来的数据转成带校验的结构化响应。关键在...
2026-05-29 · 日常编程 · 242365
TabularDrift比手动KL散度更可靠,因其采用MMD+RFF非参数检验,不假设分布、兼容混合特征并支持特征贡献分析;需正确配置cat_vars处理类别变量,且predict低延迟需优化。 AlibiDetect 的 TabularDrift 为什么比手动计算 KL 散度更可靠 直接用 scipy.stats.entropy 算训练集和线上 batch 的 KL 散度,结果波动大、阈值难设,...
2026-05-29 · 日常编程 · 119906
ProcessPoolExecutor比手写Process更稳,因其内置进程复用、超时控制、异常透传;避免AttributeError需将函数置于模块顶层且非lambda/嵌套;max_workers应据内存与任务粒度调优,而非盲目设为cpu_count()。 训练模型时 CPU 占用率“过高”不是 bug,而是 multiprocessing 正常工作的表现——它真正在压满多核,而不是像 thr...
2026-05-29 · 日常编程 · 87709
本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,重点说明为何不能在应用包中直接引用宿主机或 docker 卷中的 onnx 文件,并提供可落地的解决方案:将模型文件嵌入 zip 包、正确配置 schema 与 model 定义、确保资源分配充足。 本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,重点说明为何不能在应用包中直接引用宿主机或 docker...
2026-05-29 · 日常编程 · 168394
本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,指出应用包内不可使用宿主机或 docker 卷路径,所有模型文件必须打包进应用 zip 并通过相对路径引用,同时提供可运行的 schema 配置与部署实践要点。 本文详解在 pyvespa 中部署 onnx 模型时常见的路径引用错误,指出应用包内不可使用宿主机或 docker 卷路径,所有模型文件必须打包进应用 zip 并通过...
2026-05-29 · 日常编程 · 124103
Django的DatabaseRouter仅支持分库,无法自动分表,因其只在查询前选择数据库别名,不干预SQL生成与表名替换,分表需手动处理建表、查询、写入及迁移。 分库分表不能靠 Django 的 DatabaseRouter 完全实现,它只负责“路由到库”,不处理“表拆分逻辑”;真正要分表(比如按时间/用户ID哈希),必须手动干预查询、写入和迁移流程。 为什么 DatabaseRouter 只...
2026-05-28 · 日常编程 · 279627
tensorflowjs_converter是唯一官方工具,需先将模型保存为SavedModel格式再转换;Keras模型若含自定义层等则无法直接由.h5转换,必须用save_format="tf";输入输出格式、加载API及权重分片配置须严格匹配。 tensorflowjs_converter 是唯一能完成 Python 模型到浏览器可用 JS 格式转换的官方工具,没有替代方案。直接用 tf.k...
2026-05-28 · 日常编程 · 55594
fvcore.compute_flops算不准自定义模型,主因是动态控制流、未注册算子或输入缺shape;需避免Python控制流、确保输入为具体张量且device一致、用model.eval()和torch.no_grad();jit.script模块需临时移除装饰器或内联展开;推荐用compute_flops而非get_model_flops,并注意单位是flop(4.1e9=4.1 GFLO...
2026-05-28 · 日常编程 · 133964
Flask应用打包前必须确认的三个路径:app.py须置于根目录以避免ModuleNotFoundError;requirements.txt须与Dockerfile同目录或显式指定路径;import路径须适配容器内结构,确保config.py等依赖文件被正确COPY且不在被忽略目录中。 Flask应用打包前必须确认的三个路径 你的 app.py(或主入口文件)不能藏在子目录里,Docker 构建...
2026-05-27 · 日常编程 · 37758
torch.profiler.trace未生成Chrome Trace文件是因为默认不自动保存,需显式调用export_chrome_trace()且record_shapes=True;常见错误是仅使用with profile但未导出,或prof初始化失败。 torch.profiler.trace 为什么没生成预期的 Chrome Trace 文件 默认调用 torch.profiler.pr...
2026-05-27 · 日常编程 · 195231