ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

tensorboardX 实践指南:用简单函数调用为 PyTorch 训练写出 TensorBoard 事件

tensorboardX 实践指南:用简单函数调用为 PyTorch 训练写出 TensorBoard 事件 人工智能大模型音乐生成音频预训练【免费下载链接】jukeboxCode for the paper Jukebox: A Generative Model for Music项目地址https://gitcode.com/gh_mirrors/ju/jukebox点击查看免费下载tensorboardX 是一个面向 PyTorch以及 Chainer、MXNet、Caffe2 等框架的 TensorBoard 事件写入库其设计目标正如项目 README 所概括的Write TensorBoard events with simple function call。它把 TensorFlow 生态中的SummaryWriter用法移植到非 TensorFlow 环境中让研究人员无需引入 TensorFlow 依赖即可获得完整的 TensorBoard 可视化体验。本文以仓库内 tensorboardX/README.md 为主线结合 writer.py、summary.py、event_file_writer.py 等源码完整讲解安装、API、底层原理与真实项目实践。tensorboardX 演示脚本运行效果一、tensorboardX 是什么tensorboardX 的核心价值在于把 TensorBoard 的写入端从 TensorFlow 中解放出来。项目 README 明确列出其支持的摘要类型包括scalar训练损失、学习率等单值曲线image/figure训练图像与 matplotlib 图histogram权重、梯度分布audio/video音频与视频样本text日志文本支持 Markdown 渲染graph/onnx_graph模型结构图embedding高维特征向量的投影可视化pr_curve精确率-召回率曲线mesh3D 网格与点云hyper-parameters超参数对比hparams 插件从源码结构看整个包由若干职责单一的子模块组成writer.py提供高层SummaryWriter/FileWriterAPIsummary.py负责把各类数据编码为Summaryprotobufevent_file_writer.py负责异步落盘record_writer.py负责 tfrecord 格式的底层写入x2num.py负责把不同框架的张量统一转换为 numpy 数组。这套分层使得上层 API 与底层存储解耦也保证了后续扩展新摘要类型的便利性。二、安装与环境要求README 给出的安装方式有两种。方式一pip 安装pip install tensorboardX方式二从源码构建git clone https://github.com/lanpa/tensorboardX cd tensorboardX python setup.py install对应本仓库即tensorboardX/目录构建入口为 setup.py。README 说明该库在 anaconda2 / anaconda3 环境下配合 PyTorch 1.1.0、torchvision 0.3、tensorboard 1.13.0 进行过测试。此外仓库 setup.py 中声明的运行时依赖为numpyprotobuf 3.6.1six测试与演示环境还会用到pytest、matplotlib、crc32c等。值得注意的是setup.py中的PostInstallCommand会在安装时先调用 compile.sh 动态编译仓库tensorboardX/proto/下的 protobuf 定义event.proto、summary.proto、graph.proto等这是把 protobuf 消息结构固化进包的关键步骤。可选加速crc32cREADME 特别指出可以可选安装crc32c中可以看到实现逻辑若环境能导入原生的crc32c库则直接使用其crc32函数否则回退到内置的纯 Python 查表实现CRC_TABLE与crc_update/crc_finalize。CRC-32C 校验用于保证事件文件tfrecord 格式中每个 record 的数据完整性。三、快速上手官方 Demo 逐行解析README 附带的 examples/demo.py 是理解 tensorboardX 的最佳起点。以下为完整代码与 README 中的示例一致并补充了源码层面的说明import torch import torchvision.utils as vutils import numpy as np import torchvision.models as models from torchvision import datasets from tensorboardX import SummaryWriter resnet18 models.resnet18(False) writer SummaryWriter() sample_rate 44100 freqs [262, 294, 330, 349, 392, 440, 440, 440, 440, 440, 440] for n_iter in range(100): dummy_s1 torch.rand(1) dummy_s2 torch.rand(1) # data grouping by slash writer.add_scalar(data/scalar1, dummy_s1[0], n_iter) writer.add_scalar(data/scalar2, dummy_s2[0], n_iter) writer.add_scalars(data/scalar_group, {xsinx: n_iter * np.sin(n_iter), xcosx: n_iter * np.cos(n_iter), arctanx: np.arctan(n_iter)}, n_iter) dummy_img torch.rand(32, 3, 64, 64) # output from network if n_iter % 10 0: x vutils.make_grid(dummy_img, normalizeTrue, scale_eachTrue) writer.add_image(Image, x, n_iter) dummy_audio torch.zeros(sample_rate * 2) for i in range(x.size(0)): # amplitude of sound should in [-1, 1] dummy_audio[i] np.cos(freqs[n_iter // 10] * np.pi * float(i) / float(sample_rate)) writer.add_audio(myAudio, dummy_audio, n_iter, sample_ratesample_rate) writer.add_text(Text, text logged at step: str(n_iter), n_iter) for name, param in resnet18.named_parameters(): writer.add_histogram(name, param.clone().cpu().data.numpy(), n_iter) # needs tensorboard 0.4RC or later writer.add_pr_curve(xoxo, np.random.randint(2, size100), np.random.rand(100), n_iter) dataset datasets.MNIST(mnist, trainFalse, downloadTrue) images dataset.test_data[:100].float() label dataset.test_labels[:100] features images.view(100, 784) writer.add_embedding(features, metadatalabel, label_imgimages.unsqueeze(1)) # export scalar data to JSON for external processing writer.export_scalars_to_json(./all_scalars.json) writer.close()运行该脚本python examples/demo.py然后启动 TensorBoard需要预先安装 TensorFlow 的 tensorboard 组件tensorboard --logdir runs其中每个 API 的对应实现均可在 writer.py 中找到add_scalar/add_scalars前者写入单条标量记录后者把字典中多个子标签写入同一主标签下add_scalars在源码中会为每个子标签创建独立的FileWriter目录logdir/main_tag/tag并同时在内存scalar_dict中累积数据供后续export_scalars_to_json导出见 writer.py。add_image接收形状(C, H, W)的张量默认dataformatsCHW在 summary.py 中会把 float 数据乘以 255 转换为 uint8 再编码为Summary.Imageproto。add_audio音频张量取值必须落在 [-1, 1]sample_rate默认 44100 Hz。add_text记录任意字符串TensorBoard 的 Text 插件支持 Markdown 渲染。add_histogram遍历 ResNet18 的每个命名参数记录其数值分布bins参数默认为tensorflow在 writer.py 中SummaryWriter.__init__会预生成一组从 1E-12 到 1E20、按 1.1 倍递增的对数桶作为默认分箱。add_pr_curve传入二值标签与预测概率默认 127 个阈值num_thresholds127由compute_curve计算 PR 曲线见 summary.py。add_embedding把 100 个 784 维 MNIST 特征向量连同标签和图像一起写入TensorBoard 的 Projector 插件即可交互式查看高维投影。export_scalars_to_json把已记录的标量以{writer_id: [[timestamp, step, value], ...]}格式导出为 JSON 文件供外部程序进一步处理。close()冲刷并关闭所有 writer是保证事件文件完整落盘的收尾操作。四、SummaryWriter 核心 API 与参数详解4.1 构造参数SummaryWriter的构造签名与参数含义可在 writer.py 中查到参数默认值说明logdirNone事件文件保存目录。为None时自动生成runs/日期时间_主机名目录每次运行各不相同。推荐传入分层目录如runs/exp1、runs/exp2以便在 TensorBoard 中直接对比多次实验comment追加到默认logdir后的注释后缀仅当未指定logdir时生效purge_stepNone训练崩溃后恢复时用于清除 global_step 大于等于该值的事件避免 TensorBoard 显示中断期间的脏数据。崩溃前后两次运行应使用同一个logdirmax_queue10待写入事件队列长度超过该值会强制触发一次落盘flush_secs120后台线程每隔多少秒将积压事件冲刷到磁盘filename_suffix追加到事件文件名末尾的后缀write_to_diskTrue置为False时改用DummyFileWriter只记录不落盘见 writer.py4.2 训练循环内的常用写入from tensorboardX import SummaryWriter writer SummaryWriter(runs/exp1) # 指定目录 # 或 writer SummaryWriter(commentLR_0.1_BATCH_16) for i in range(100): # 标量 writer.add_scalar(loss/train, loss, i) # 用 / 分组TensorBoard 中自动归类 writer.add_scalars(loss/group, {train: a, val: b}, i) # 图像单张 (C,H,W) 或批量 (N,C,H,W) writer.add_image(input, img_tensor, i, dataformatsCHW) writer.add_images(batch, img_batch, i, dataformatsNCHW) # 直方图 writer.add_histogram(w1, model.fc1.weight.data, i) # 音频 / 视频需 moviepy writer.add_audio(sample, audio_tensor, i, sample_rate22050) writer.add_video(clip, video_tensor, i, fps4) # 形状 (N,T,C,H,W) # 文本 writer.add_text(note, fepoch {i} done, i) # 模型图PyTorch 0.3.1见 README 说明 writer.add_graph(model, input_to_model(dummy_x,)) writer.close()要点add_image的dataformats支持CHW、HWC、HW由 utils.py 中的convert_to_HWC统一转换为 HWC 再编码灰度图会自动复制为三通道。add_graph底层通过torch.jit.trace追踪模型再经 pytorch_graph.py 中的graph()解析为GraphDefprotoREADME 注明该功能要求tensorboardX1.6且pytorch1.1。若模型导出报错可通过operator_export_typeRAW等参数降级处理。add_embedding会为每次调用在logdir/step/tag/下生成tensors.tsv、metadata.tsv、sprite.png需方形图像以及projector_config.pbtxt配置文件具体逻辑见 embedding.py。4.3 进阶功能PR 曲线、自定义图与超参数# PR 曲线需 TensorBoard 0.4RC 或更新版本 writer.add_pr_curve(precision_recall, labelsnp.random.randint(2, size100), predictionsnp.random.rand(100), global_step0) # 自定义标量图布局 layout {Taiwan: {twse: [Multiline, [twse/0050, twse/2330]]}, USA: {dow: [Margin, [dow/aaa, dow/bbb, dow/ccc]]}} writer.add_custom_scalars(layout) # 超参数面板hparams 插件 with SummaryWriter() as w: for i in range(5): w.add_hparams({lr: 0.1 * i, bsize: i}, {hparam/accuracy: 10 * i, hparam/loss: 10 * i})add_hparams的实现writer.py会把hparam_dict与metric_dict编码为实验、会话开始、会话结束三条 summary并在独立的时间戳子目录中写入让 TensorBoard 的 HParams 插件能够按超参数筛选实验其 proto 定义见 api.proto 与 plugin_hparams.proto。add_mesh则面向 3D 网格/点云可视化vertices形状为(B, N, 3)colors取值在 [0, 255]faces为三角形顶点索引若在 TensorBoard 中看不到渲染结果源码注释建议尝试把顶点坐标归一化到 [-1, 1]。五、底层原理事件文件是如何生成的理解写入链路有助于诊断数据丢失或刷新不及时等问题。从源码结构看一次add_*调用经历了如下调用链SummaryWriter.add_* → FileWriter.add_summary (writer.py) → EventFileWriter.add_event (event_file_writer.py) → _EventLoggerThread (后台守护线程) → EventsWriter.write_event → RecordWriter.write (record_writer.py)几个关键实现细节异步写入event_file_writer.py 中的_EventLoggerThread是一个 daemon 线程事件先进入Queue(max_queue_size)后台线程按flush_secs周期批量写入并冲刷磁盘从而避免训练主循环被 IO 阻塞。文件命名EventsWriter.init生成的日志文件名为events.out.tfevents.timestamp.hostnamefilename_suffix其中还预置了file_versionbrain.Event:2的起始事件。record 格式RecordWriter.write 对每条序列化后的 Event 写入8 字节长度头 CRC32C(头) 数据 CRC32C(数据)的 tfrecord 结构这正是 TensorBoard 能够直接读取的原因。多后端支持record_writer.py通过register_writer_factory注册了s3://前缀的写入器需要boto3其余路径回退到本地文件系统。多框架数据适配x2num.py 的make_np能自动识别 PyTorch Tensor/Variable、numpy 数组、标量、列表以及 Caffe2 的 blob 名字符串、Chainer 与 MXNet 张量统一转为 numpy 数组同时通过check_nan对 NaN/Inf 输入给出警告。六、真实项目实践Jukebox 中的日志封装tensorboardX 并非玩具它被真实地集成进了本仓库的 Jukebox 音乐生成项目。在 jukebox/utils/logger.py 中Logger类在 rank 0 进程上创建SummaryWriter并封装了与 tensorboardX API 一一对应的日志方法from tensorboardX import SummaryWriter class Logger: def __init__(self, logdir, rank): if rank 0: self.sw SummaryWriter(f{logdir}/logs) ... def add_audio(self, tag, aud, sample_rate22050): if self.rank 0: self.sw.add_audio(tag, aud, self.iters, sample_rate) def add_images(self, tag, img, dataformatsNHWC): if self.rank 0: self.sw.add_images(tag, img, self.iters, dataformatsdataformats) def add_scalar(self, tag, val): if self.rank 0: self.sw.add_scalar(tag, val, self.iters)可见 Jukebox 训练时会把生成的音乐片段通过add_audio采样率 22050 Hz写入 TensorBoard 直接试听把超参数通过add_text(hps, str(hps))记录把验证集指标通过add_scalar记录见 jukebox/train.py 中logger.add_scalar(ftest_{key}, ...)的调用。这为读者提供了一个训练循环内调用 tensorboardX的成熟模板分布式训练中只在主进程写入避免重复日志。七、使用技巧与注意事项目录即分组README 强调用/分隔符组织 tag如data/scalar1TensorBoard 会自动按目录折叠用runs/exp1、runs/exp2等分层 logdir 则可在界面中直接对比实验。slider 刻度若想为图像历史滑块增加更多刻度显示更多历史帧README 的 Tweaks 一节指向了 tensorboard 相关的 issue 与 PR 讨论即通过调整 TensorBoard 前端滑块的分辨率参数实现属于前端定制范畴。导出 JSONexport_scalars_to_json(path)可将内存中的标量一次性导出为 JSON适合与外部绘图或自动报告管线对接注意add_scalars的数据在导出后会被清空self.scalar_dict {}。内存注意源码注释提醒add_scalars会把标量保留在内存中极端场景可能撑爆 RAM。崩溃恢复训练中断后重启时传入purge_step可清除global_step T的脏事件前提是前后两次运行使用同一logdir。关闭与刷新训练结束务必调用writer.close()或使用with SummaryWriter() as w:上下文管理器见 writer.py否则后台队列中的事件可能未及落盘。环境兼容README 提到demo_graph.py需要tensorboardX1.6与pytorch1.1add_pr_curve需要 TensorBoard 0.4RC 或更新版本add_video依赖moviepyadd_image依赖pillowadd_figure依赖matplotlib。八、进一步探索仓库提供了丰富的示例、测试与文档供继续深入官方演示脚本tensorboardX/examples/demo.py覆盖 scalar、image、audio、text、histogram、pr_curve、embedding、video 的全部用法另有demo_custom_scalars.py、demo_embedding.py、demo_graph.py、demo_hparams.py等专题示例位于 tensorboardX/examples/tensorboardX 目录。单元测试tensorboardX/tests 下的test_summary.py、test_summary_writer.py、test_embedding.py、test_pytorch_graph.py等可用于验证各 API 生成的 protobuf 是否符合预期。文档tensorboardX/docs 目录收录了 Sphinx 格式的tensorboard.rst、tutorial.rst、utils.rst等使用教程。设计参考README 的 Reference 一节说明本项目在事件写入层参考了tensorboard_logger与dmlc/tensorboard的既有实现本仓库的 record_writer.py 头部注释也标注了代码来源读者对照这些历史实现可以更清楚 tensorboardX 的演进脉络。总之tensorboardX 通过一个SummaryWriter对象打通了训练代码 → 事件文件 → TensorBoard 面板的完整链路。对 PyTorch 用户而言它几乎是开箱即用的训练可视化标配结合本文的源码级拆解与 Jukebox 的真实封装案例你可以把它无缝接入自己的训练脚本并在需要时深入定制。赞分享人工智能大模型音乐生成音频预训练【免费下载链接】jukeboxCode for the paper Jukebox: A Generative Model for Music项目地址https://gitcode.com/gh_mirrors/ju/jukebox点击查看免费下载相关推荐Python命令行工具的革命性解决方案pipsi如何优雅解决全局安装难题Python命令行工具的革命性解决方案pipsi如何优雅解决全局安装难题 你是否曾为安装Python命令行工具而头疼过那些烦人的版本冲突、权限问题还有系统开发工具MXNet contrib.tensorboard 实战用 LogMetricsCallback 将训练/评估指标写入 TensorBoardMXNet contrib.tensorboard 实战用 LogMetricsCallback 将训练/评估指标写入 TensorBoard mxnet.c深度学习机器学习人工智能告别训练数据碎片化TensorBoard事件文件合并完全指南告别训练数据碎片化TensorBoard事件文件合并完全指南 你是否曾因多轮训练产生的分散事件文件Event Files而难以追踪模型优化轨迹当训练中断数据可视化机器学习前端后端上一篇为什么选择Attributed框架深入解析其类型安全优势下一篇xpander.ai实战构建DevOps智能助手轻松管理AWS基础设施创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表