本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.
文 @ 不愿透露姓名的小P同学
0 前言
本篇文章介绍如何支持 海量数据点的训练曲线可视化 ,主要从以下两个方面展开:
海量数据点的训练曲线可视化对于观察和开发调试机器学习训练的意义
实现支持海量数据可视化的技术实现思路
1 支持海量数据点训练曲线可视化的意义
随着机器学习算法的不断发展,在训练过程中产生的数据量也不断增长,开发者常常需要根据海量训练数据中包含的关键指标和变化趋势来判断训练的结果好坏。因此,支持海量数据点训练曲线可视化对于提升开发者进行机器学习算法开发效率有着积极意义。
1.1 可靠记录海量数据
训练过程中的数据被可靠地记录下来是追溯训练过程和获得训练关键指标信息的基础。开发者对于数据可视化的首要诉求就是把每一个数据点都稳妥地记录下来——没有数据支撑的训练是毫无意义的。
保存少量数据是相对容易的,无论是日志输出还是通过特定格式文件存储都是常规手段。但这些手段在面对海量数据时就显得捉襟见肘了,我们很难高效地基于这些数据存储方式进行可视化查看。开发者通常会耗费大量精力在此类工作流程的搭建和维护上。
1.2 高效存储海量数据
有了可靠记录数据的手段之后,如何高效存储这些数据也是一大难题。开发者通常会使用不同的物理环境进行反复的训练调试,然而,通过分布在各个物理环境上的文件系统和存储介质来保存数据是低效的。对于开发者来说, 高效地存储各个训练的海量数据 可以大大降低基于这些数据进行可视化的难度。
1.3 实时查看训练曲线
训练数据可视化的核心便是 查看训练曲线 。训练曲线可以直观地展现训练过程中关键指标的变化趋势。如果能在训练过程中实时查看曲线,开发者便可以及时判断出训练的优劣,更快发现训练的问题。
2 支持海量数据点可视化的实现思路
传统的训练数据可视化解决方案采用如图 1 所示的架构:训练端和可视化端位于同一个文件系统下,通过特定格式的数据文件交换数据,无法满足不同物理环境下不同训练的海量数据点可视化需求。
图 1:传统可视化解决方案
如图 2 所示,本文设计的实现思路从训练端、服务端和 Web 端三个方面实现整个海量数据可视化系统的需求:
训练端 主要满足 可靠记录海量数据 的要求
服务端 主要满足 高效存储海量数据 的要求
Web 端 主要满足 实时查看训练曲线 的要求
图 2: 训练端、服务端和 Web 端的可视化解决方案
2.1 训练端记录数据的实现
训练端记录数据的实现思路是封装一个类似于 TensorBoard 的模块,在训练代码中直接或者借助 Hook 机制调用模块的接口记录数据。
这个模块的核心实现思路包括队列异步记录、实时批量上传和本地缓存这三个主要部分。
2.1.1 队列异步记录
在模块的接口中使用同步模式直接进行数据的记录流程,会大大降低训练线程的训练效率,同时受本地 IO 或者网络 IO 效率的影响,数据记录的性能稳定性也会有较大幅度抖动。
如图 3 所示,引入数据队列,采用独立线程异步记录数据的思路可以在不影响训练线程的条件下,保证数据记录的可靠性。训练线程作为数据生产者,只负责将数据放入队列,记录线程则可以使用较重的逻辑实现去处理数据。
图 3: 训练端队列异步记录数据的原理图
2.1.2 实时批量上传
数据点在训练过程中是源源不断产生的。记录线程从数据队列拿到单独的数据点之后可以不停地向服务端同步数据,服务端则可以获得训练端实时数据,对数据进行存储,或者提供给数据使用者进行可视化展示。
这种高实时性的实现会对服务端的并发性能提出较高要求,在服务高峰期会极大影响服务端可用性。采用批量模式上传数据的思路可以在牺牲较少实时性的前提下大大降低服务端的并发性能要求,也可以降低训练端网络 IO 产生的额外性能开销。
图 4: 训练端实时批量上传数据的原理图
2.1.3 本地缓存
强依赖服务端存储数据会大大降低数据记录的可靠性。在服务端停服升级或者故障情况下,训练端产生的数据会因为上传失败而丢失。
为了避免这个问题,我们可以同时引入另一个队列和缓存线程来实现本地缓存特性,保障训练过程中的数据会同时在本地文件上进行备份,借助 Protocol Buffers 协议进行编码来提高缓存文件的序列化读写性能,批量刷写数据到缓存文件来降低本地文件 IO 的性能损耗。在服务端恢复可用时,本地缓存的文件还可以使用恢复线程批量上传到服务端进行存储。
图 5: 训练端本地缓存数据的原理图
2.2 服务端存储和查询数据的实现
服务端作为数据处理的下游,充当了训练端和 Web 端的桥梁。
服务端作为海量数据的存储引擎,可以统一存储来自各个训练端的数据,也可以同时为多个 Web 端提供数据查询来支持可视化。
2.2.1 消息队列保证高并发性能
由于训练端上传的数据没有非常高的实时性要求,可以引入消息队列进行数据存储逻辑的解耦合,从而大大提高服务的高并发性能。
同时,因为引入额外组件,为保证服务的高可用,在消息队列故障的时候可以进行服务降低,直接存储数据到数据库。
图 6: 服务端通过消息队列保证高并发性能的原理图
2.2.2 随机采样
服务端通常可以直接把所有的数据提供给 Web 端进行可视化,但在数据量过大的场景下,Web 端浏览器的性能会无法满足流畅进行可视化展示的需求。因此,服务端在查询时可以进行 数据采样 来保证 Web 端的使用体验。
随机采样的核心实现思路是找到并保留关键数据点,采用一定的规则对普通数据点进行采样处理。关键数据点可以通过极值和首尾来判定,普通数据点的采样则可以按照固定的区间间隔取值。
图 7: 服务端随机采样的原理图
2.3 Web端可视化数据的实现
在了解了如何存储海量的训练数据点和采样的实现方式后,我们考虑如何在 Web 端实现训练曲线的可视化。
ECharts 是一款基于 JavaScript 的数据可视化图表库,提供直观、生动、可交互、可个性化定制的数据可视化图表。我们使用 ECharts 折线图来实现训练曲线图的可视化渲染,通过 HTTP 协议接口获取采样后的训练数据,通过配置 option 可以渲染出如下的折线图:
图 8: 训练曲线可视化图
也可以将多条曲线放在同一个图中,方便进行对比,例如:
图 9: 多条训练曲线可视化图
通过自定义悬浮提示功能显示当前轮次对应不同曲线的具体值,可以更好的对数据进行对比:
图 10: 带悬浮提示的训练曲线可视化图
如图 8~10 所示,通过 HTTP 协议获取数据可以很好地对当前已产生的训练数据进行可视化渲染,但 HTTP 协议通信只能由客户端发起,做不到服务器主动向客户端推送实时产生的数据。为了更好的支持训练过程中实时更新曲线图,可以建立 WebSocket 连接,这样就可以将训练过程中产生的新的数据主动推送给前端,从而及时追加到曲线图中。
在数据量比较大时,可以通过 X 轴、Y 轴上的缩放条或区域缩放功能进行缩放,以支持更多细节的观察和对比。
该方案的问题在于数据量过大(如十万级别)时渲染性能不佳,特征点不易发现。针对该问题,我们实现了 平滑度 的功能,通过调整平滑度,在保留特征点的前提下过滤不影响曲线走势的点,保留目标个数的数据点。这样可以提升渲染性能,方便更好地观察训练曲线走势和特征点。
图 11: 训练曲线平滑展示可视化图
3 总结
支持海量数据点训练曲线可视化对于提升开发者的机器学习算法开发效率有着重要意义。本文从记录数据、存储数据和查看曲线三方面具体阐述了海量数据点训练曲线可视化在开发者具体工作流程中的需求要点,从训练端、服务端和 Web 端三个部分介绍了实现思路。
希望本文对读者理解为什幺要支持以及如何支持海量数据点的训练曲线可视化有帮助。
Be First to Comment