高性能计算(HPC)与 DevOps

目录

什么是 HPC?

高性能计算(HPC)通过超级计算机或计算机集群来解决高级计算问题。常见的应用场景包括:

  • 模拟与暴力搜索
  • 机器学习与神经网络
  • 大数据分析

简单并行模型

此类模型中的子任务彼此独立。其执行时间取决于资源数量和任务数。工作节点越多,可并行执行的子任务越多,整体任务耗时越短。典型模型为蒙特卡洛模拟(Monte Carlo Simulation)。

MapReduce

此类模型的常见解决方案是 MapReduce 编程模型。其由两个阶段组成:map 阶段执行过滤与排序,reduce 阶段执行汇总。

执行流程如下:

  1. 将输入数据分片;
  2. 每个 mapper 读取不同的数据块并计算结果,写入指定位置;
  3. 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。任务执行过程中也可能受内存带宽、网络带宽、存储性能等限制。

网络

复杂并行任务依赖节点间通信,因此网络延迟与带宽至关重要。在云环境中,节点带宽通常有限,我们可选择“网络优化型”节点以改善表现。

存储

存储分为三类:

  1. 通用存储:应用二进制、日志等,通常使用云块存储;
  2. 集群文件系统:多个节点共享的高性能文件系统;
  3. 对象存储:用于归档模型或中间结果,例如保存 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 上。


参考资料

  1. https://en.wikipedia.org/wiki/MapReduce
  2. https://www.geeksforgeeks.org/hadoop-architecture/
  3. https://gfycat.com/miniaturedependentcob
  4. https://data-flair.training/blogs/distributed-tensorflow/
  5. https://maas.io/blog/hpc-cluster-architecture-part-4
  6. https://journalofcloudcomputing.springeropen.com/articles/10.1186/s13677-021-00231-z
  7. https://www.cncf.io/blog/2022/04/07/cloud-native-batch-system-volcano-moves-to-the-cncf-incubator/
  8. https://github.com/BoCloud/JobFlow