高性能计算(HPC)与 DevOps
目录
- 1 什么是 HPC?
- 1.1 简单并行模型
- 1.1.1 MapReduce
- 1.2 复杂并行模型
- 1.3 复杂并行 vs 简单并行
- 1.1 简单并行模型
- 2 HPC 集群
- 3 基于 Kubernetes 的 HPC
- 4 Volcano
- 5 参考资料
什么是 HPC?
高性能计算(HPC)通过超级计算机或计算机集群来解决高级计算问题。常见的应用场景包括:
- 模拟与暴力搜索
- 机器学习与神经网络
- 大数据分析
简单并行模型
此类模型中的子任务彼此独立。其执行时间取决于资源数量和任务数。工作节点越多,可并行执行的子任务越多,整体任务耗时越短。典型模型为蒙特卡洛模拟(Monte Carlo Simulation)。
MapReduce
此类模型的常见解决方案是 MapReduce 编程模型。其由两个阶段组成:map
阶段执行过滤与排序,reduce
阶段执行汇总。
执行流程如下:
- 将输入数据分片;
- 每个
mapper
读取不同的数据块并计算结果,写入指定位置; reducer
汇总所有中间结果,得出最终输出。
但原始 MapReduce 存在一些挑战:
- 难以追踪 mapper 的状态,执行时间长、可能失败,需 Job Tracker 协助追踪状态;
- 多节点间需要低延迟、支持多写的网络存储,目前通常使用 NFS。
复杂并行模型
复杂并行模型中的子任务不完全独立,需要彼此同步参数以推进计算。例如神经网络训练:
当前向传播得到不理想结果后,神经网络执行反向传播以更新参数,再继续下一批训练。TensorFlow 将训练集分为多个小批次,每完成一批即更新一次参数,工作节点再拉取新参数执行下一轮训练。
复杂并行 vs 简单并行
简单并行 | 复杂并行 |
---|---|
输出依赖于 map/reduce 逻辑,不确定 | 输出为确定参数,存储在参数设备中 |
子任务彼此独立 | 子任务共享参数,存在依赖 |
有些大数据分析系统混合使用简单与复杂并行模型,对调度器要求更高。例如 Hadoop 支持 reducer 提前启动,即使 mapper 尚未完成。
HPC 集群
一个完整的 HPC 集群包括如下组件:
- 集群配置器:保障节点环境一致性;
- 节点:服务运行载体,预留部分资源;
- 调度器:负责任务队列与资源调度;
- 网络:节点间通信依赖;
- 通用存储:存储应用与用户数据;
- 集群文件系统:高性能共享存储;
- 身份管理:一致的用户访问权限控制;
- 监控系统:资源可视化与调度辅助;
- 对象存储(可选):归档旧数据。
集群配置器
节点环境一致性是 HPC 的关键,通常以服务方式部署,收集基础设施信息、评分并调度资源,即“Metal-As-A-Service(MAAS)”。Kubernetes 可天然实现此功能。
头节点
头节点是用户与集群的交互入口。调度器也运行在头节点上,作为集群“大脑”,接收请求、排队任务、分配资源并追踪任务状态。
计算节点
计算节点负责执行任务,常见计算资源包括 CPU、GPU、TPU。任务执行过程中也可能受内存带宽、网络带宽、存储性能等限制。
网络
复杂并行任务依赖节点间通信,因此网络延迟与带宽至关重要。在云环境中,节点带宽通常有限,我们可选择“网络优化型”节点以改善表现。
存储
存储分为三类:
- 通用存储:应用二进制、日志等,通常使用云块存储;
- 集群文件系统:多个节点共享的高性能文件系统;
- 对象存储:用于归档模型或中间结果,例如保存 CNN 模型供服务加载。
辅助服务
辅助服务提供安全、监控等功能,不参与计算,但可提升集群稳定性。
基于 Kubernetes 的 HPC
尽管 HPC 可运行于裸机或云主机上,我们选择构建在 Kubernetes 之上,原因如下:
- Kubernetes 提供丰富工具支持任务生命周期管理;
- 拥有先进调度系统,支持多调度器;
- 通过标准接口支持软件定义基础设施与资源解耦(如 CNI);
- 实现细粒度计算/通信控制,优化多租户资源利用率。
Volcano
Volcano 是 CNCF 旗下首个云原生批处理计算项目,由华为主导开发。其目标是扩展云原生至大数据、AI、HPC 等场景,具备以下能力:
- 任务全生命周期管理;
- 面向高性能计算的调度策略;
- 支持异构硬件;
- 性能优化策略支持。
尽管 Volcano 满足大部分需求,但存在以下不足:
问题 1:缺乏原生 JobFlow 编排机制
当前不支持原生定义任务依赖关系。例如我们希望将 Monte Carlo 模拟分布执行,并聚合结果,需 2 个任务:一个用于分发模拟任务,一个用于聚合结果。但 Volcano 尚不支持原生 JobFlow。解决方案:
- 自行构建 JobFlow 平台;
- 使用第三方平台(如 BoCloud)。
问题 2:缺乏 Python SDK
量化开发者无法花时间适配平台,因此我们需要提供 Python 封装库,使其可在本地开发调试后,修改配置即可无缝运行于 Volcano 上。
参考资料
- https://en.wikipedia.org/wiki/MapReduce
- https://www.geeksforgeeks.org/hadoop-architecture/
- https://gfycat.com/miniaturedependentcob
- https://data-flair.training/blogs/distributed-tensorflow/
- https://maas.io/blog/hpc-cluster-architecture-part-4
- https://journalofcloudcomputing.springeropen.com/articles/10.1186/s13677-021-00231-z
- https://www.cncf.io/blog/2022/04/07/cloud-native-batch-system-volcano-moves-to-the-cncf-incubator/
- https://github.com/BoCloud/JobFlow