
深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载导读本文以 MXNet 的mxnet.callback模块python/mxnet/callback.py为对象系统讲解训练过程中最常用的回调组件模型检查点保存do_checkpoint、训练指标日志log_train_metric、训练速度与指标监控Speedometer、批次进度条ProgressBar以及验证指标日志LogValidationMetricsCallback。读完本文你将掌握这些回调的每个参数含义与默认值、它们与fit中batch_end_callback/epoch_end_callback的接入方式并能理解回调底层依赖的BatchEndParam数据结构与save_checkpoint落盘机制从而在真实训练任务中灵活组合、自定义回调。说明mxnet.callback属于 MXNet 的 legacy API 体系其 API 参考文档位于 docs/python_docs/python/api/legacy/callback/index.rst本文内容即对应该文档所覆盖的模块全部公共组件。回调在 MXNet 训练循环中的定位MXNet 的 Module/Model 训练 APImodule.fit、model.fit允许用户通过回调callback在训练的关键节点插入自定义逻辑。回调本质上是一个可调用对象训练循环会在批次结束batch end或 epoch 结束epoch end时调用它并传入一个描述当前训练状态的参数对象。这个参数对象是定义在 python/mxnet/model.py 中的BatchEndParamBatchEndParam namedtuple(BatchEndParams, [epoch, nbatch, eval_metric, locals])其四个字段分别表示epoch当前所处的 epoch 序号从 0 开始nbatch当前已处理的批次计数eval_metric当前的评估指标对象可通过get_name_value()取出形如(name, value)的指标列表locals训练循环的局部命名空间。所有mxnet.callback组件都遵循这一约定Speedometer、ProgressBar、LogValidationMetricsCallback接收param并读取param.nbatch、param.epoch、param.eval_metric而do_checkpoint因为是 epoch 级回调接收的是(iter_no, sym, arg, aux)四元组分别代表 epoch 序号、网络符号、参数权重与辅助状态。理解这一约定是自定义回调的前提。do_checkpoint周期性保存模型检查点do_checkpoint(prefix, period1)是训练中最常用的回调之一用于每隔若干 epoch 将模型持久化到磁盘。参数说明参数类型默认值含义prefixstr必填检查点文件名的前缀periodint1保存检查点的间隔epoch 数文件名约定每个检查点由两个二进制文件组成模型描述文件{prefix}-symbol.json网络的 Symbol 结构参数文件{prefix}-{epoch:04d}.params权重与偏置等参数epoch 为 4 位补零编号。例如do_checkpoint(mymodel, 1)会在每个 epoch 结束时依次生成mymodel-0001.params、mymodel-0002.params等文件。源码实现period int(max(1, period)) def _callback(iter_no, sym, arg, aux): if (iter_no 1) % period 0: save_checkpoint(prefix, iter_no 1, sym, arg, aux) return _callback注意两点实现细节period会被强制转换为不小于 1 的整数即传入0或负数时自动回退到每个 epoch 都保存只有当(iter_no 1) % period 0时才落盘epoch 计数从 1 开始写入文件名。底层落盘机制do_checkpoint内部调用的save_checkpoint定义在 python/mxnet/model.pydef save_checkpoint(prefix, epoch, symbol, arg_params, aux_params, remove_amp_castTrue): if symbol is not None: symbol.save(f{prefix}-symbol.json, remove_amp_castremove_amp_cast) save_dict {(farg:{k}) : v.as_in_context(cpu()) for k, v in arg_params.items()} save_dict.update({(faux:{k}) : v.as_in_context(cpu()) for k, v in aux_params.items()}) param_name f{prefix}-{epoch:04}.params nd.save(param_name, save_dict)可以看到参数文件内部以arg:与aux:前缀区分参数weights/bias与辅助状态如 BN 的 moving mean/variance且保存前会把所有参数迁移到 CPU 上下文remove_amp_castTrue表示在保存前移除 AMP 训练引入的amp_cast/amp_multicast算子。对应的加载接口是load_checkpoint(prefix, epoch)它从prefix-symbol.json与prefix-epoch.params恢复符号与参数。使用示例import mxnet as mx module.fit(iterator, num_epochn_epoch, epoch_end_callbackmx.callback.do_checkpoint(mymodel, 1))运行输出示例Start training with [cpu(0)] Epoch[0] Resetting Data Iterator Epoch[0] Time cost0.100 Saved checkpoint to mymodel-0001.params Epoch[1] Resetting Data Iterator Epoch[1] Time cost0.060 Saved checkpoint to mymodel-0002.params建议在长时间训练中使用period 1例如每 5 或 10 个 epoch 保存一次避免高频 I/O 拖慢训练同时保留最近几个检查点便于中断恢复与最优模型回溯。log_train_metric周期性输出训练指标log_train_metric(period, auto_resetFalse)用于按批次周期性地将当前训练评估指标写入日志通过 Pythonlogging模块输出格式为Iter[epoch] Batch[nbatch] Train-{name}{value}。参数说明参数类型默认值含义periodint必填每隔多少个批次输出一次训练指标auto_resetboolFalse每次输出后是否重置评估指标源码实现def _callback(param): if param.nbatch % period 0 and param.eval_metric is not None: name_value param.eval_metric.get_name_value() for name, value in name_value: logging.info(Iter[%d] Batch[%d] Train-%s%f, param.epoch, param.nbatch, name, value) if auto_reset: param.eval_metric.reset()当auto_resetTrue时每次输出后指标会清零重新累计因此日志中反映的是「本周期内的指标」当auto_resetFalse时指标自 epoch 开始一直累加日志反映「从 epoch 开始至今的累计指标」。实践中若关心训练曲线的细节波动建议开启auto_reset若关注整体收敛趋势保持默认关闭即可。使用示例module.fit(iterator, num_epochn_epoch, batch_end_callbackmx.callback.log_train_metric(10))Speedometer训练速度与评估指标周期监控Speedometer(batch_size, frequent50, auto_resetTrue)是实践中用得最多的训练监控回调每隔frequent个批次输出一次吞吐速度samples/sec与当前评估指标。参数说明参数类型默认值含义batch_sizeint必填每个批次的样本数用于换算吞吐速度frequentint50每隔多少个批次输出一次日志auto_resetboolTrue每次输出后是否重置评估指标输出行为当评估指标存在且auto_resetTrue时输出格式为Epoch[%d] Batch [%d-%d]\tSpeed: %.2f samples/sec随后逐项附加{name}{value}当auto_resetFalse时格式变为Epoch[%d] Batch [0-%d]即指标是累计值当没有评估指标时仅输出速度信息Iter[%d] Batch [%d]\tSpeed: %.2f samples/sec。源码实现Speedometer内部维护init、tic、last_count三个状态首个批次只做初始化记录起始时间此后每个frequent的倍数批次用frequent * batch_size / (time.time() - tic)计算平均吞吐当检测到last_count count说明进入新 epoch批次计数回绕时会重置状态。代码中还针对极短时间间隔做了ZeroDivisionError保护此时速度输出为inf。使用示例# 每 10 个批次打印一次速度与指标batch_size 为 1 module.fit(iterator, num_epochn_epoch, batch_end_callbackmx.callback.Speedometer(1, 10))运行输出示例Epoch[0] Batch [10] Speed: 1910.41 samples/sec Train-accuracy0.200000 Epoch[0] Batch [20] Speed: 1764.83 samples/sec Train-accuracy0.400000 Epoch[0] Batch [30] Speed: 1740.59 samples/sec Train-accuracy0.500000将batch_size正确设置为训练批次大小速度读数才是每秒实际处理的样本数若指标名不止一个例如同时有accuracy与loss日志会按(name, value)顺序全部输出。ProgressBar逐批次进度条ProgressBar(total, length80)用于在每个 epoch 内以进度条形式显示已完成批次的比例适合交互式终端或 Notebook 中直观观察训练进度。参数说明参数类型默认值含义totalint必填每个 epoch 的总批次数lengthint80进度条的最大字符长度源码实现count param.nbatch filled_len int(round(self.bar_len * count / float(self.total))) percents math.ceil(100.0 * count / float(self.total)) prog_bar * filled_len - * (self.bar_len - filled_len) logging.info([%s] %s%s\r, prog_bar, percents, %)进度条以表示已完成部分、-表示未完成部分并附带整数百分比。使用示例progress_bar mx.callback.ProgressBar(total2) mod.fit(data, num_epoch5, batch_end_callbackprogress_bar)运行输出示例[--------] 50.0% [] 100.0%注意total必须与数据迭代器每 epoch 实际产生的批次数一致否则进度百分比会失真。LogValidationMetricsCallbackepoch 结束输出验证指标LogValidationMetricsCallback()是一个极简的无参回调在每次 epoch 结束时将验证集评估指标写入日志输出格式为Epoch[%d] Validation-{name}{value}。源码实现def __call__(self, param): if not param.eval_metric: return name_value param.eval_metric.get_name_value() for name, value in name_value: logging.info(Epoch[%d] Validation-%s%f, param.epoch, name, value)当eval_metric为空时直接返回不会报错。它通常与Speedometer训练集指标搭配训练阶段用Speedometer观察每批指标epoch 结束时用LogValidationMetricsCallback观察验证集指标从而对比训练与验证的差距以判断过拟合。回调的组合与自定义扩展多回调组合batch_end_callback与epoch_end_callback均接受回调列表可同时挂载多个回调from mxnet import callback as cb module.fit(iterator, num_epochn_epoch, batch_end_callback[cb.Speedometer(batch_size128, frequent50), cb.ProgressBar(totalnum_batches_per_epoch)], epoch_end_callback[cb.do_checkpoint(mymodel, period5), cb.LogValidationMetricsCallback()])提示MXNet 生态中还存在基于回调机制的扩展例如 python/mxnet/contrib/tensorboard.py 中的LogMetricsCallback可把训练指标写入 TensorBoard用法同样是通过batch_end_callback挂载可作为参考实现。编写自定义回调任何遵循回调约定的可调用对象都可以作为回调。作为 batch 级回调定义一个接收param的函数即可并通过param.nbatch、param.epoch、param.eval_metric.get_name_value()获取状态def log_lr(param): lr param.locals.get(optimizer, None) if lr is not None and param.nbatch % 100 0: logging.info(Epoch[%d] Batch[%d] lr%f, param.epoch, param.nbatch, lr.learning_rate) module.fit(iterator, num_epoch10, batch_end_callbacklog_lr)作为 epoch 级回调则需要匹配do_checkpoint的(iter_no, sym, arg, aux)签名。自定义回调时务必查阅 BatchEndParam 的字段定义确保读取的属性真实存在。小结mxnet.callback以极简的接口覆盖了训练监控的四个核心诉求——持久化do_checkpoint、指标输出log_train_metric、速度监控Speedometer、进度可视化ProgressBar并通过LogValidationMetricsCallback衔接验证环节。这些组件的统一输入约定param对象由 python/mxnet/model.py 中的BatchEndParam定义底层落盘与加载分别由save_checkpoint/load_checkpoint完成。掌握这些回调的参数语义与实现细节即可在训练脚本中按需组合并轻松扩展出自定义的监控与持久化逻辑。赞分享深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载相关推荐PPT Master 的 AI 图像对比库以受控变量方法建立渲染、色板与版式三维度参考体系PPT Master 的 AI 图像对比库以受控变量方法建立渲染、色板与版式三维度参考体系 PPT Master 在 skills/ppt master/re人工智能深度学习机器学习torchtune.training 训练基建 API 全解检查点、分布式、显存优化与指标日志torchtune.training 训练基建 API 全解检查点、分布式、显存优化与指标日志 本篇技术文章基于 torchtune 官方 API 参考文档大模型微调RLHF分布式训练模型量化Horovod检查点机制分布式训练模型保存与恢复Horovod检查点机制分布式训练模型保存与恢复 概述 在分布式深度学习训练中检查点Checkpoint机制是确保训练过程可靠性和可恢复性的关键技术。H深度学习机器学习分布式训练上一篇FastChat边缘计算部署终极指南移动端与嵌入式设备完全适配方案下一篇MMPopupView与键盘交互实现完美弹窗输入体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考