ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

用 Rerun 在 Jupyter Notebook 中实时训练并可视化 2D 神经场:notebook_neural_field_2d 实战指南

用 Rerun 在 Jupyter Notebook 中实时训练并可视化 2D 神经场:notebook_neural_field_2d 实战指南 用 Rerun 在 Jupyter Notebook 中实时训练并可视化 2D 神经场notebook_neural_field_2d 实战指南【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun本篇指南以 Rerun 仓库中的 notebook_neural_field_2d 示例为核心讲解如何在 Jupyter 环境中用rerun-sdk[notebook]直接嵌入 Rerun 查看器并驱动一个多层感知机MLP神经场去拟合一张 2D 图片同时把训练损失与网络解码出的图像实时流式可视化。读完本文你将掌握 Rerun 的 Notebook 集成安装、蓝图Blueprint布局编排、按迭代时间轴记录标量与图像、以及神经场训练监控的完整实战链路。概述Rerun 与 Notebook 生态的无缝集成Rerun 可以直接运行在 Jupyter Notebook 内部且不止于 Jupyter——Google Colab、VSCode Notebook 等多种交互式环境均受支持。这意味着你可以把训练循环和可视化调试放进同一个文档流里每跑一个 cell训练进度就实时推送到内嵌的 Rerun 查看器中。要使用这一能力需要单独的支撑包rerun-notebook。通常通过 Rerun SDK 的notebookextra 一条命令完成安装pip install rerun-sdk[notebook]关于依赖关系仓库中的 rerun_notebook/README.md 给出了更详细的解释rerun-notebook是rerun-sdkNotebook 集成的实现包内部封装了 Rerun Viewer 编译为 Wasm 的产物约 31MiB以及将其绑定为 Jupyter widget 的胶水代码re_viewer_bg.wasm与widget.js。单独拆分这个包是为了避免让主 SDK 的体积翻倍同时让rerun-sdk使用 Maturin、rerun-notebook使用 hatch 各自保持简单的构建后端。示例背景用神经场拟合一张 2D 图片本 Notebook 演示的是一个经典且直观的神经场Neural Field问题用一个简单的神经网络去拟合一张 2D 图片。神经场本质上是一个多层感知机MLP可选地搭配位置编码positional input encoding图片被均匀采样网络的任务是根据给定的像素坐标 (u, v) 预测该位置的 RGB 颜色训练过程中我们记录 loss并周期性密集查询网络把编码在网络权重中的图像重新解码出来实时可视化训练效果。利用 Notebook 的交互性你可以就地尝试不同的学习率、不同的损失函数、不同的网络架构直观地观察这些超参数对训练过程的影响——这正是本示例最有价值的实验场景。快速开始在 Jupyter 中运行第一步安装依赖进入示例目录安装 requirements 即可其中已包含 Jupyter、Rerun SDK 与 Notebook 支撑包pip install -r requirements.txt对应的 requirements.txt 内容如下ipython8.12 # ipython 8.13 or greater doesnt work with python 3.8 jupyter rerun-sdk[notebook] torch # Lots of reported incompatibilities across recent versions for these 3 deps. # The following seems to be the most recent recommendations for a stable experience. # See e.g. https://github.com/jupyter/notebook/issues/6721 jupyter_client8 pyzmq25 tornado6.5.5其中有三条值得注意的版本约束jupyter_client8、pyzmq25、tornado6.5.5。这是社区针对近期 Jupyter 生态依赖不兼容问题总结出的稳定组合详见 requirements 中的注释在复现本示例时建议保持这些上限约束以免遇到 Jupyter 通信层pyzmq/tornado的已知问题。第二步启动 Notebookjupyter notebook neural_field_2d.ipynb随后在浏览器中打开生成的 Notebook 页面从上到下依次执行 cell 即可。整个 Notebook 只有 6 个 cell流程分为四段导入与初始化 → 定义神经场类 → 初始化并可视化神经场 → 训练神经场。核心实现拆解1. 神经场网络定义Notebook 用 PyTorch 实现了一个极简的神经场类 NeuralField它由位置编码可选 MLP 激活函数三部分构成class NeuralField(torch.nn.Module): Simple neural field composed of positional encoding, MLP, and activation function. def __init__( self, num_layers: int, dim_hidden: int, dim_in: int 2, dim_out: int 3, activation: str sigmoid, pe_sigma: float | None None, ) - None: super().__init__() ... sizes [dim_in] [dim_hidden for _ in range(num_layers - 1)] [dim_out] self.linears torch.nn.ModuleList() for in_size, out_size in itertools.pairwise(sizes): self.linears.append(torch.nn.Linear(in_size, out_size)) if self.pe_sigma is not None: torch.nn.init.normal_(self.linears[0].weight, 0.0, self.pe_sigma)关键点在于pe_sigma位置编码强度当pe_sigmaNone时第一层使用relu激活当pe_sigma不为None时第一层使用sin作为激活并以pe_sigma为标准差做正态初始化——这实际上把第一层线性层变成了一个随机傅里叶特征映射random Fourier features。pe_sigma直接决定了神经场开箱即用的空间变化频率值越大场能轻松表示的细节越丰富但场在训练区域之外的 extrapolation外推行为也会越剧烈。这在可视化实验里会非常直观地体现出来。2. 初始化与蓝图布局Notebook 创建了 4 个参数各异pe_sigma分别为 5 / 15 / 30 / 100其余相同num_layers5, dim_hidden128的神经场用于对比位置编码强度的影响。随后通过rr.init(rerun_example_cube)初始化 Rerun 记录并使用rerun.blueprint声明式地搭建查看器布局blueprint rrb.Blueprint( rrb.Vertical( rrb.Grid( rrb.Spatial2DView(nameTarget, origintarget), *[rrb.Spatial2DView(namestr(field), originffield_{i}) for i, field in enumerate(fields)], ), rrb.TimeSeriesView( nameLosses, origin/, plot_legendrrb.Corner2D.LeftTop, ), row_shares[0.7, 0.3], ), collapse_panelsTrue, )这段布局对应仓库中 blueprint 模块的两个核心容器 containers.pyVertical纵向容器、Grid网格容器与两个核心视图 spatial2d_view.py、time_series_view.py上方Grid占 70% 高度并排显示 1 个Target目标图 4 个神经场解码图下方TimeSeriesView占 30% 高度显示所有 loss 曲线图例置于左上角Corner2D.LeftTopcollapse_panelsTrue折叠左右面板把屏幕空间全部留给可视化内容。接着用rr.notebook_show(blueprintblueprint, width1050, height600)把查看器内嵌到 Notebook 输出中。从 SDK 源码 recording_stream.py 可以看到notebook_show会阻塞直到内嵌 Viewer 初始化完成并准备好接收数据此后的所有rr.log调用都会把数据实时推送到查看器因此把它放在数据开始流动之前非常关键。3. 把神经场解码为图像log_field_as_image是可视化的核心辅助函数它在 (u, v) 坐标的[min_uv, max_uv]范围内生成稠密网格点逐点查询网络输出重整为 RGB 图像后通过rr.log(entity_path, rr.Image(...))记录torch.no_grad() def log_field_as_image(entity_path, field, min_uv, max_uv, uv_resolution) - None: u_values torch.linspace(min_uv[0], max_uv[0], uv_resolution[0]) v_values torch.linspace(min_uv[1], max_uv[1], uv_resolution[1]) uv_points torch.cartesian_prod(u_values, v_values) 0.5 / torch.tensor(uv_resolution) predictions field(uv_points) image_prediction torch.clamp(predictions.reshape(uv_resolution[0], uv_resolution[1], 3), 0, 1) image_prediction image_prediction.permute(1, 0, 2) rr.log(entity_path, rr.Image(image_prediction.numpy(forceTrue)))注意两点细节采样范围是(-0.1, -0.1)到(1.1, 1.1)即在 [0,1] 单位正方形之外留了 10% 的余量用来观察神经场在训练区域之外的外推行为坐标点加0.5 / resolution的偏移对应像素中心的语义保证解码图像与真实采样一致。初始时刻rr.set_time(iteration, sequence0)就记录一次各字段的初始图像此时网络权重未训练图像完全由位置编码决定。4. 训练循环与实时日志训练 cell 使用 Adam 优化器默认参数为num_iterations3000README 与代码注释建议跑到10000以获得更好拟合、batch_size1000、learning_rate1e-3、每 10 次迭代记录一次图像。目标图片通过requests从 Rerun 示例数据集下载tiger.jpg可切换为注释中的bird.jpg归一化到 [0,1] 后作为target实体记录。每个 iteration 的核心逻辑target_uvs torch.rand(batch_size, 2) # 均匀采样像素坐标 target_jis (target_uvs * torch.tensor([target_image.shape[1], target_image.shape[0]])).int() target_rgbs target_image[target_jis[:, 1], target_jis[:, 0]] # 采样目标颜色 for field_id in field_ids: field fields[field_id] total_iterations[field_id] 1 predicted_rgbs field(target_uvs) loss torch.nn.functional.mse_loss(target_rgbs, predicted_rgbs) rr.set_time(iteration, sequencetotal_iterations[field_id]) rr.log(floss/field_{field_id}, rr.Scalars(loss.item())) loss.backward() optimizer.step() if iteration % log_image_period 0: for field_id in field_ids: log_field_as_image(ffield_{field_id}, fields[field_id], (-0.1, -0.1), (1.1, 1.1), (100, 100))这里体现了 Rerun 时序数据模型的正确用法rr.set_time(iteration, sequence...)设置自定义时间轴timeline后续 log 都挂在该时间戳上loss 用rr.Scalars记录到loss/field_i实体配合初始化时rr.log(..., rr.SeriesLines(names..., aggregation_policy...), staticTrue)注册的序列样式使用Average 聚合策略多条 loss 曲线在同一张时序图中可读性极佳图像按log_image_period10的周期更新形成每 10 步刷新一帧解码图的训练动画整个循环包裹在try/except KeyboardInterrupt中中途中断也能保留已记录的数据重复运行该 cell 会从上次状态继续训练total_iterations累加想要重置则重新运行上一个 cell。深入原理Notebook 集成在底层是如何工作的rr.notebook_show并不是简单地把图片贴进 Notebook。从 SDK 的 notebook 实现如 recording_stream.py 与 _legacy_notebook.py可以看到两条技术路径现代路径默认基于anywidget机制的 Jupyter widget。查看器Wasm 编译产物作为 widget 资源注入单元格Rerun SDK 通过 Jupyter comms 通道把日志数据持续推送给内嵌 viewer。notebook_show会阻塞到 viewer 就绪之后所有 log 调用即时送达。Legacy 路径legacy_notebook_show/as_html将当前录制数据整体编码为 base64 的.rrd嵌入一个 HTML 模板再放进 iframe 加载https://app.rerun.io默认地址可用app_url覆盖若调用过rr.start_web_viewer_server()则指向 localhost。该方式对 anywidget 支持不完善的环境更友好但每次展示都会做一次阻塞式 flush。对于资产Wasm/JS的加载方式rerun-notebook支持通过环境变量RERUN_NOTEBOOK_ASSET控制需在import rerun_notebook之前设置RERUN_NOTEBOOK_ASSETinline将资产内联后通过 comms 直接传输最可移植但已知在 Google Colab 等环境存在内存泄漏与性能问题RERUN_NOTEBOOK_ASSETserve-local在内核生命周期内于本地启动线程提供资产Wasm 可流式编译启动更快且可被浏览器缓存适合本地 JupyterRERUN_NOTEBOOK_ASSEThttps://your-hosted-asset-url.com/widget.js从自托管 URL 加载需同时提供相邻路径的re_viewer_bg.wasm并配置好 CORS。实验建议把 Notebook 当作训练调参台README 明确指出本示例的核心价值在于交互式实验。建议你按以下思路改造训练 cell观察不同超参数对收敛行为的影响位置编码强度对比pe_sigma在 5、15、30、100 下的表现——过小则网络难以表达高频细节图像模糊过大则训练初期抖动剧烈、外推区域出现强烈的纹波学习率把learning_rate从1e-3调大或调小一两个数量级观察 loss 曲线的收敛速度与震荡网络容量修改num_layers与dim_hidden感受表达能力与拟合速度的权衡训练轮数num_iterations从 3000 提到 10000让图像细节持续逼近原图损失函数将mse_loss换成其他损失观察视觉质量差异。得益于rr.ScalarsTimeSeriesView的实时联动你无需等待训练结束即可判断当前配置是否有效KeyboardInterrupt随时可以中断并保留已记录的所有中间帧。小结notebook_neural_field_2d 是一个把训练 可视化 交互调参压缩进单个 Notebook 的典型范例它同时演示了 Rerun Notebook 集成的安装与运行、Blueprint 声明式布局、自定义时间轴上的标量/图像日志以及神经场的原理与超参数影响。掌握这一模式后你可以把它推广到任何循环内可视化的深度学习工作流——实时监控 loss、权重、梯度乃至任意中间表征让调试回归直觉。相关文件索引示例说明README.mdNotebook 本体neural_field_2d.ipynb依赖清单requirements.txtNotebook 集成实现包说明rerun_notebook/README.mdnotebook_show源码recording_stream.pyLegacy HTML 渲染实现_legacy_notebook.py蓝图容器与视图containers.py、spatial2d_view.py、time_series_view.py【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进