
Burn Learner 深度指南用 SupervisedTraining 构建可配置、可断点续训的深度学习训练循环【免费下载链接】burnBurn is a next generation tensor library and Deep Learning Framework that doesnt compromise on flexibility, efficiency and portability.项目地址: https://gitcode.com/GitHub_Trending/bu/burnBurn 将深度学习训练中重复出现的样板逻辑——指标采集、日志、检查点、多设备调度——统一封装进burn-traincrate其核心入口是SupervisedTraining与Learner这两个结构。本篇以 burn-book 的 Learner 章节 为主线结合crates/burn-train的源码实现与 基础工作流训练章节 的完整示例讲解如何配置训练循环、按参数组差异化调度学习率与优化器以及理解训练产物的目录布局。读完本文你将能独立搭建一个具备多指标、断点续训、梯度累积与多设备支持的生产级训练流程。burn-train一次封装覆盖训练全流程burn-traincrate源码位于 crates/burn-train的目标是提供一个精心设计且灵活的训练循环让项目无需从零手写训练组件。日常使用中绝大多数交互都发生在一个核心结构上SupervisedTraining。在 基础工作流 中已经出现过它的基本形态let training SupervisedTraining::new(artifact_dir, dataloader_train, dataloader_test) .metrics((AccuracyMetric::new(), LossMetric::new())) .with_default_checkpointers() .num_epochs(config.num_epochs) .summary();SupervisedTraining::new接收三个参数产物目录artifact_dir、训练 dataloader 与验证 dataloader。之后通过链式调用逐一配置训练循环注册指标metrics、启用默认检查点with_default_checkpointers、设定 epoch 数num_epochs以及打印训练摘要summary。需要说明的是当前 API 隐含了一个假设你的模型从训练集学习并在另一个数据集上验证。这是监督学习、无监督学习与微调fine-tuning最常见的学习范式如果你的需求更复杂可以参考 自定义训练循环 一节直接接管循环逻辑。完整上手从配置结构到 launch 启动训练以 MNIST 分类为例training.md 展示了端到端的训练代码。首先用Configderive 声明实验配置#[derive(Config, Debug)] pub struct TrainingConfig { pub model: ModelConfig, pub optimizer: AdamConfig, #[config(default 10)] pub num_epochs: usize, #[config(default 64)] pub batch_size: usize, #[config(default 4)] pub num_workers: usize, #[config(default 42)] pub seed: u64, #[config(default 1.0e-4)] pub learning_rate: f64, }在train函数中依次完成四件事准备产物目录确保artifact_dir存在所有检查点、日志与指标都会落到该目录下随后把配置保存为config.json保证实验可复现。初始化设备与数据对运行设备调用device.seed(config.seed)固定随机种子device.autodiff()得到带自动微分的设备模型初始化在这台设备上进行。用MnistBatcher构造训练与验证 dataloader示例中用测试集充当验证集仅作演示不建议实际使用。装配训练循环SupervisedTraining::new(...)注册 Accuracy 与 Loss 两类指标同时作用于训练与验证通过with_default_checkpointers()定期把模型、优化器与学习率调度器的状态以 burnpack 文件形式保存便于中断后续训。launch 并保存结果把Learner::new(model, optim, lr)交给training.launch(...)训练结束后返回训练好的模型into_record()取出权重记录并save成.bpk文件。记录record保存的是纯张量数据因此任何后端、任何精度都能加载这些权重。let result training.launch(Learner::new( model, config.optimizer.init(), config.learning_rate, )); result .model .into_record() .save(format!({artifact_dir}/model)) .expect(Trained model should be saved successfully);值得注意的细节Learner::new的第三个参数实际上是学习率调度器传入f64浮点数时会被自动转换为常数学习率调度器。与许多框架不同学习率不属于优化器配置而是在每次优化器 step 时作为参数传入这避免了修改优化器内部状态更符合函数式风格。该设计在 Learner 源码 中可以看到lr_scheduler: impl IntoModuleLrScheduler并且lr_module由lr_step()每次推进。完整的可运行实现位于 examples/guide 与 examples/mnist 示例项目中。SupervisedTraining 配置项全解析原文档给出的配置项表格覆盖了训练循环的几乎所有开关以下逐项展开并结合源码说明其作用配置项说明训练指标Training Metric注册一个训练阶段的指标验证指标Validation Metric注册一个验证阶段的指标训练指标绘图Training Metric Plot注册带绘图的训练指标要求指标为数值型验证指标绘图Validation Metric Plot注册带绘图的验证指标要求指标为数值型指标记录器Metric Logger配置指标记录方式默认写入文件渲染器Renderer配置指标渲染方式默认为 CLI 终端输出梯度累积Grad Accumulation配置应用梯度前累积的 step 数文件检查点File Checkpointer配置模型、优化器与调度器状态的保存方式训练轮数Num Epochs设置 epoch 数量设备Devices设置训练使用的设备支持多设备检查点恢复Checkpoint从检查点重启训练应用日志Application logging配置应用日志安装器默认写入experiment.log训练策略Training Strategy使用自定义训练策略在保留SupervisedTraining全部能力的前提下运行你自己的训练循环指标与输出类型指标通过模型的输出来计算。Burn 提供两种开箱即用的输出类型ClassificationOutput与RegressionOutput它们实现了指标计算所需的 trait。分类输出在 classification.rs 中定义包含三个字段loss形状[batch_size]、outputlogits 或概率形状[batch_size, num_classes]与targets真实类别索引形状[batch_size]。该类型通过Adaptor适配到多种指标输入Accuracy、TopKAccuracy、Perplexity、AUROC、Precision/Recall/FBetaScore经ConfusionStatsInput以及 Loss。也就是说注册AccuracyMetric与LossMetric后训练循环会自动从ClassificationOutput中提取所需数据无需手工拆分。多标签分类场景另有MultiLabelClassificationOutput支持 HammingScore 等指标。训练步与验证步TrainStep与InferenceStep是模型接入训练循环的两个关键 trait定义于 train_val.rsTrainStep::step执行前向与反向传播返回TrainOutput——其中封装了GradientsParams与输出条目。反向传播得到的是返回的梯度而非挂在每个参数上的梯度与 PyTorch 不同TrainOutput::new内部通过GradientsParams::from_grads(grads, module)完成梯度与参数的映射。InferenceStep::step只做前向用于验证。验证阶段使用不带 autodiff 的设备因此不会记录计算图。两个 trait 都允许覆写optimize/optimize_multi方法若需要在优化器更新前后对模型做自定义操作如权重裁剪可在此扩展。参数组Parameter Groups按路径或 ID 差异化配置优化器与调度器实际训练中经常需要对模型的不同部分使用不同的学习率或优化器设置。Burn 的ParamGroup通过路径或 ID路由模块参数优化器与学习率调度器使用相同的匹配规则但可以独立配置。原文档给出的组合式调度器与优化器示例let lr_scheduler_base ComposedLrSchedulerConfig::new() .cosine(CosineAnnealingLrSchedulerConfig::new(1.0, 2000)) .linear(LinearLrSchedulerConfig::new(1e-8, 1.0, 2000)) .linear(LinearLrSchedulerConfig::new(1e-2, 1e-6, 10000)); let lr_scheduler lr_scheduler_base.init().unwrap().with_group( ParamGroup::from_predicate(conv), LinearLrSchedulerConfig::new(1e-6, 1e-3, 14000) .build() .unwrap(), ); let optim AdamWConfig::new() .with_cautious_weight_decay(true) .with_weight_decay(5e-5) .init(); let result training.launch(Learner::new( model, optim, lr_scheduler, ));这里展示了两层参数组用法基础调度器链ComposedLrSchedulerConfig依次叠加了余弦退火初始 1.02000 步与两段线性调度1e-8→1.0 共 2000 步、1e-2→1e-6 共 10000 步形成多阶段的学习率曲线。组级覆盖通过ParamGroup::from_predicate(conv)匹配名称含conv的参数为它们单独指定一段 1e-6→1e-3 共 14000 步的线性调度优化器则使用 AdamW 并开启 cautious weight decay权重衰减 5e-5。从源码结构看优化器侧由ModuleOptimizer承载参数路由训练循环在同一个step内完成所有参数的更新与状态维护无需手工拆分梯度容器或分步更新部分模块——这是 自定义训练循环 一节与优化器文档的共同约定。关于组专属优化器、匹配优先级、梯度裁剪与优化器状态等细节请参阅 Optimizer 章节的参数组部分。学习率调度器的完整清单Constant、Linear、Cosine Annealing、Exponential、Noam、Step、Composed、Sequential参见 lr-scheduler 章节。训练产物Artifacts 目录结构与检查点机制创建SupervisedTraining实例时传入的目录会承载全部训练产物。原文档给出了注册了 Accuracy 与 Loss 指标、以 burnpack 格式保存检查点时的典型布局├── experiment.log ├── checkpoint │ ├── model-1.bpk │ ├── optim-1.bpk │ └── scheduler-1.bpk │ ├── model-2.bpk │ ├── optim-2.bpk │ └── scheduler-2.bpk ├── train │ ├── epoch-1 │ │ ├── Accuracy.log │ │ └── Loss.log │ └── epoch-2 │ │ ├── Accuracy.log │ │ └── Loss.log └── valid ├── epoch-1 │ ├── Accuracy.log │ └── Loss.log └── epoch-2 ├── Accuracy.log └── Loss.log各部分的含义experiment.log应用日志文件默认由应用日志安装器写入checkpoint/每轮或按检查点策略指定的频率分别保存model-*.bpk、optim-*.bpk与scheduler-*.bpk三者构成可完整恢复的训练状态。文件检查点FileCheckpointer负责自动删除符合策略的旧检查点防止目录无限膨胀train/与valid/分别存放训练与验证阶段每个 epoch 的指标日志如Accuracy.log、Loss.log。检查点的读取与写入逻辑集中在 Learner 的检查点实现LearningCheckpointer持有模型、优化器、调度器三个异步检查点AsyncCheckpointer由CheckpointingStrategy决定每个 epoch 是保存还是删除load_checkpoint会依次恢复三者的记录。从源码注释可以确认检查点是与设备无关的 burnpack 记录文件字节恢复时模型保持 learner 现有参数的设备优化器状态则在下一步迁移到各参数所在设备。另外该本地目录可以按需与远程文件系统同步若使用 burn-remote 等远程执行能力目录同步是分布式实验的常见配套手段。何时改用自定义训练循环burn-train封装了大量便利但当前 API 的训练集 验证集假设并非适用于所有场景。当你需要更精细的循环控制例如每步执行自定义前后处理多图梯度累积使用GradientsAccumulator手动累积GradientsParams或纯粹偏好自己控制每个 epoch 的迭代逻辑可以直接实现自己的循环见 自定义训练循环。手写循环的关键差异点包括梯度由backward()返回而非挂载在参数上需要通过GradientsParams::from_grads(grads, model)映射到参数验证阶段调用model.valid()切换到无 autodiff 设备以关闭梯度追踪。可运行的参考实现在 examples/custom-training-loop 示例中。小结SupervisedTrainingLearner是 Burn 官方推荐的标准训练范式前者通过链式 builder 提供指标、日志、检查点、梯度累积、多设备与自定义训练策略等全套配置后者将模型、优化器与学习率调度器组合为一次launch调用。参数组机制让你能对模型不同部分差异化配置优化器与调度器而清晰的文件化产物布局保证了实验的可复现性与断点续训能力。若标准范式无法满足需求自定义训练循环 则提供了完全的控制权作为兜底方案。【免费下载链接】burnBurn is a next generation tensor library and Deep Learning Framework that doesnt compromise on flexibility, efficiency and portability.项目地址: https://gitcode.com/GitHub_Trending/bu/burn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考