
Lightning Fabric 实验追踪与可视化实战用fabric.log/fabric.log_dict记录指标并接入多 Logger【免费下载链接】pytorch-lightningPretrain, finetune ANY AI model of ANY size on 1 or 10,000 GPUs with zero code changes.项目地址: https://gitcode.com/gh_mirrors/py/pytorch-lightning本篇技术指南以 Lightning Fabric 的日志记录logging机制为核心讲解如何在自定义训练循环中通过Fabric.log与Fabric.log_dict记录标量指标、选择并配置TensorBoardLogger、CSVLogger、LitLogger、WandbLogger 等多种 Logger以及在 TensorBoard 等面板中实时查看结果、控制日志频率和同时使用多个 Logger。读完本文你将掌握一套可直接复制进 Fabric 训练循环的完整指标追踪方案并理解其底层实现rank-zero 日志、Tensor 自动转标量、自动版本号等是如何工作的。为什么需要追踪指标在模型开发过程中我们通常需要记录一些关心的数值例如validation_loss以此可视化模型的学习过程。Lightning 官方文档有一个非常形象的比喻模型开发就像开一辆没有车窗的车图表和日志就是让我们知道车该往哪儿开的车窗。使用 Lightning Fabric你可以可视化几乎任何想记录的内容数字、文本、图片乃至音频。其中指标metric可视化是理解模型在整个开发过程中表现如何的最基础、也最强大的方式。追踪指标两步接入 Fabric在 Lightning Fabric 中指标记录只涉及两个步骤选一个 Logger然后在代码里调用log/log_dict。Step 1选择并配置 Loggerfrom lightning.fabric import Fabric from lightning.fabric.loggers import TensorBoardLogger # Pick a logger and add it to Fabric logger TensorBoardLogger(root_dirlogs) fabric Fabric(loggerslogger)可供选择的 Logger 包括TensorBoardLogger—— 官方推荐的本地 Logger将日志以 TensorBoard 格式写入本地文件系统实现位于 src/lightning/fabric/loggers/tensorboard.pyCSVLogger—— 以 CSV 格式写入本地文件系统实现位于 src/lightning/fabric/loggers/csv_logs.pyLitLogger —— 对接 Lightning.ai 平台的实验追踪与产物管理详见 docs/source-fabric/guide/loggers/litlogger.rstWandbLogger —— 对接 Weights Biases 平台支持图片、音频、视频等富媒体与 Artifact详见 docs/source-fabric/guide/loggers/wandb.rst。所有内置 Logger 都从 src/lightning/fabric/loggers/logger.py 中的抽象基类Logger派生统一实现log_metrics、log_hyperparams、log_graph、save、finalize等接口因此切换 Logger 时无需改动训练循环里的记录代码。Step 2在代码中调用Fabric.logvalue ... # Python scalar or tensor scalar fabric.log(some_value, value)如果需要一次性记录多个指标使用Fabric.log_dictvalues {loss: loss, acc: acc, other: other} fabric.log_dict(values)从源码看Fabric.log本质上只是log_dict的单指标特例见 src/lightning/fabric/fabric.pydef log(self, name: str, value: Any, step: Optional[int] None) - None: self.log_dict(metrics{name: value}, stepstep) def log_dict(self, metrics: Mapping[str, Any], step: Optional[int] None) - None: metrics convert_tensors_to_scalars(metrics) for logger in self._loggers: logger.log_metrics(metricsmetrics, stepstep)这里有三个值得注意的底层细节Tensor 自动脱离计算图并转成标量传入的torch.Tensor会先经过convert_tensors_to_scalars位于 src/lightning/fabric/utilities/apply_func.py递归处理自动调用.item()转成 Python 标量如果 Tensor 含有多于一个元素会抛出ValueError提示无法转成标量。因此你不必担心记录的是带梯度的 Tensor。一次调用写所有 Loggerlog_dict会遍历fabric上注册的全部 Logger逐个调用其log_metrics这正是同时使用多个 Logger能够零成本实现的原因。step参数可选大多数 Logger 实现会在每次调用时自动递增 step你也可以显式传入自己的步数例如以 epoch 或 global step 为基准。在 Dashboard 中查看日志如何查看指标取决于你选择的 Logger绝大多数 Logger 都提供可实时浏览所记录内容的 Dashboard。以文档示例中的TensorBoardLogger为例启动方式如下tensorboard --logdir./logs如果你的运行环境是 notebook如 Google Colab、Kaggle 或 Jupyter则使用以下魔法命令%reload_ext tensorboard %tensorboard --logdir./logs关于日志落盘位置TensorBoardLogger的日志会写入os.path.join(root_dir, name, version)目录name默认是lightning_logs因此root_dirlogs时日志实际位于logs/lightning_logs/version_0/等路径下。若传入了sub_dir参数还会继续在该目录下追加子目录见 src/lightning/fabric/loggers/tensorboard.py。CSVLogger则会在对应目录下生成metrics.csv文件列名会按字典序排序并自动维护表头见 tests/tests_fabric/loggers/test_csv.py。控制日志记录频率如果在每一个迭代都记录指标会显著拖慢训练速度。通过在循环中加入频率控制可以大幅降低日志带来的额外开销for iteration in range(num_iterations): if iteration % log_every_n_steps 0: value ... fabric.log(some_value, value)除了在应用层控制频率外CSVLogger还提供了flush_logs_every_n_steps参数默认 100控制每隔多少步把内存中的指标刷写到磁盘见 src/lightning/fabric/loggers/csv_logs.py 与 tests/tests_fabric/loggers/test_csv.py 的test_flush_n_steps用例。TensorBoardLogger则可通过构造函数透传max_queueflush 前待写日志的队列大小和flush_secs多少秒后强制 flush等SummaryWriter关键字参数来控制刷盘时机。同时使用多个 Logger你可以在不改动训练循环中任何日志代码的前提下同时挂载任意多个 Loggerfrom lightning.fabric import Fabric from lightning.fabric.loggers import CSVLogger, TensorBoardLogger tb_logger TensorBoardLogger(root_dirlogs/tensorboard) csv_logger CSVLogger(root_dirlogs/csv) # Add multiple loggers in a list fabric Fabric(loggers[tb_logger, csv_logger]) # Calling .log() or .log_dict() always logs to all loggers simultaneously fabric.log(some_value, value)常见组合是TensorBoard 负责实时可视化 CSV 负责轻量归档两者写盘互不干扰。由于Fabric.log_dict内部会遍历self._loggers逐个写入见上文 src/lightning/fabric/fabric.py因此无论挂几个 Logger调用方式始终是同一个fabric.log。深入源码Logger 的关键行为与实现细节只从 rank 0 记录避免多进程重复写盘在多卡如 DDP场景下所有进程都会执行训练循环。若每个进程都写日志会产出重复或损坏的日志文件。Fabric 通过rank_zero_only与rank_zero_experiment装饰器解决这一问题只有全局 rank 0 的进程会真正写入指标其余 rank 拿到的是一个_DummyExperiment所有方法都是空操作见 src/lightning/fabric/loggers/logger.py。这体现在TensorBoardLogger.log_metrics、CSVLogger.log_metrics等实现均标注了rank_zero_only见 src/lightning/fabric/loggers/tensorboard.py、src/lightning/fabric/loggers/csv_logs.py。自动版本号与目录结构两个内置 Logger 都实现了自动版本管理不传version时会扫描root_dir/name下已有的version_*目录取最大版本号加一见TensorBoardLogger._get_next_version与CSVLogger._get_next_version。这也意味着不指定版本号时多次运行会自动创建新的version_N目录互不覆盖而手动指定整数版本且目录中已存在该版本的指标文件时会被覆盖并给出警告。相关行为在测试中有完整覆盖tests/tests_fabric/loggers/test_csv.pytest_automatic_versioning、test_manual_versioning、test_named_version等tests/tests_fabric/loggers/test_tensorboard.pytest_tensorboard_automatic_versioning、test_tensorboard_manual_versioning、test_tensorboard_named_version。前缀与超参数记录TensorBoardLogger和CSVLogger都支持prefix参数会在所有指标 key 前统一添加前缀连接符为-用于区分同名指标见 src/lightning/fabric/utilities/logger.py 的_add_prefix。此外TensorBoardLogger.log_hyperparams支持记录超参数嵌套字典会被拍平为a/b形式的键见 src/lightning/fabric/utilities/logger.py 的_flatten_dictcallable、Namespace、多维数组等非标量类型会被自动字符串化default_hp_metric参数控制未显式传入指标时是否写入占位指标hp_metric。注意TensorBoard 中带超参数与不带超参数的日志互不兼容切换记录方式时需要清掉旧日志。CSVLogger目前不支持log_hyperparams调用会直接抛出NotImplementedError见 src/lightning/fabric/loggers/csv_logs.py 与 tests/tests_fabric/loggers/test_csv.py。延伸接入云端平台 Logger如果希望把指标同步到云端面板Fabric 生态还提供两类 LoggerLitLoggerpip install litlogger自动检测 Lightning.ai 凭据除了fabric.log/fabric.log_dict外还支持log_hyperparams、log_model自动上传 checkpoint、log_file记录任意文件、save_logs捕获终端输出并通过logger.url获取实验页面地址WandbLoggerpip install wandb先执行wandb login your-api-key从wandb.integration.lightning.fabric导入配置project后即可复用同一套fabric.log调用额外支持图片、文本、表格、Artifact 等富媒体记录。两者的详细用法分别参见 docs/source-fabric/guide/loggers/litlogger.rst 与 docs/source-fabric/guide/loggers/wandb.rst。无论选用哪种训练循环中的记录代码始终保持fabric.log/fabric.log_dict不变这正是 Fabric 日志抽象的核心价值记录逻辑与后端解耦一行代码切换可视化平台。【免费下载链接】pytorch-lightningPretrain, finetune ANY AI model of ANY size on 1 or 10,000 GPUs with zero code changes.项目地址: https://gitcode.com/gh_mirrors/py/pytorch-lightning创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考