GPU 那些事儿
概念解释
MapReduce
为离线批处理服务的模型,分成 Map 任务分发和 Reduce 结果收集两个阶段,能以相同方式处理不同数据来源的大数据作业。
根据数据来源的不同和作业特点分为
- 批计算
- 流计算, 处理连续的大规模数据流,将无界的数据流划分成固定大小的有界批处理子集
- 内存计算, 中间数据需要大量的迭代处理 ,把Map任务中的中间数据保存到内存中。
- 图计算,有依赖关系的多个子任务的 MapReduce 迭代计算形式。
- 交互计算, 对计算延迟敏感,或是包含多种计算模式的复杂作业。
Spark 和 Flink
大数据处理框架,提供基于 MapReduce 模式的批处理、流计算、内存计算和图计算等多种计算模式 ,来处理不同输入形式的大数据作业。
Flink
虽然没有使用 Flink, 但是需要了解 Flink 能做什么。
- 事件驱动型应用
- 数据分析应用
- 数据管道应用
详细查看 Flink 应用场景
Spark
BSP
并行计算模型中, 大同步并行模型,该模型可表示由多个超级步组成的计算过程。在每个超级步中各处理器执行局部计算,再完成点点数据同行,最后全局同步检查来确定所有处理器是否完成运算。
DOT 模型
在BSP基础上,研究者扩展可用于大数据计算计算模型。
采用矩阵形式化描述大数据处理的计算和通信行为. 将计算过程分为三个层次: 数据层、操作层、转换层。
DOTA 模型
中科院徐志伟团队提出, 在原来的 DOT 模型基础上,增加聚合层(A-Layer)回合处理转移层的中间数据并且完成最终结果。
p-DOT 模型
该模型沿用 BSP 的思路把大数据计算任务视为 p 阶段的 DOT 模型。在多次迭代的计算阶段内,p-DOT 模型由数据层、计算层、通信层构成。
并行计算
来自《并行计算》
MPI
MPI 是一个跨语言的通信协议,支持高效方便的点对点、广播和组播。
MPI 属于 OSI 参考模型的第五层或者更高,他的实现可能通过传输层的 sockets 和 TCP 覆盖大部分的层。
MPI 标准不断演化,MPI-1 模型不包括共享内存概念。
MPI 有很多实现,例如 mpich 或者 openmpi
MPS
The Multi-Process Service (MPS) is an alternative, binary-compatible implementation of the CUDA Application Programming Interface (API).
The MPS runtime architecture is designed to transparently enable co-operative multi-process CUDA applications, typically MPI jobs, to utilize Hyper-Q capabilities on the latest NVIDIA (Kepler-based) GPUs.
Kuberentes下 GPU 资源的使用
在一个 1 GPU 上跑多个 Job?, 按照文章的思路是可以实现的。
社区讨论
- https://github.com/NVIDIA/k8s-device-plugin/issues/169
- https://github.com/kubernetes/kubernetes/issues/52757
TKE 上实现 GPU Share 从测试数据以及 GIGAStack 产品,这种方案在正式环境上run起来的
- 论文笔记《GaiaGPU:Sharing GPUs in Container Clouds》
- GaiaStack上的GPU虚拟化技术
- GaiaGPU: Sharing GPUs in Container Clouds 论文地址
- Kubernetes 多卡GPU使用和分析
GPU Sharing Scheduler Extender in Kubernetes 阿里云上实现 GPU Share
- GPU Sharing Scheduler Extender Now Supports Fine-Grained Kubernetes Clusters
- GPU Sharing in Kubernetes 阿里云共享 GPU 的设计。
KubeShare - Share GPU between Pods in Kubernetes 学校试验, 不确定在生产环境稳定运行。
Supporting MIG in Kubernetes k8s-device-plugin 从0.7.0版本开始,支持 MIG(Multi-Instance GPUs)
- release https://github.com/NVIDIA/k8s-device-plugin/tree/v0.7.0#enabling-gpu-support-in-kubernetes
- 社区讨论 https://github.com/NVIDIA/k8s-device-plugin/issues/180
GPU 虚拟化方案
想解决 GPU 资源合理分配问题,先将设备虚拟化。
Kubernetes 多卡GPU使用和分析 文章里将 GPU 节点先进行虚拟化,更改上报给 kubelet 的 DeviceID, 以及在 kubelet 调用 Allocate()
请求时将虚拟 DeviceID 转化为 对应的实际 DeviceID.
[ GPU 虚拟化技术(四) - GPU 分片虚拟化 ](http://cloud.it168.com/a2018/0611/3208/000003208253.shtml?1) 提到分片从两个维度来定义:
- 是对 GPU 在时间片段上的划分,一个物理 GPU 的计算 engine 在几个 vGPU 之间共享,而调度时间片一般都在 1ms - 10ms 左右,
- 是对 GPU 资源的划分,主要是指对 GPU 显存的划分,由于安全隔离的要求,每个 vGPU 独享分配给它的显存,不会与其他 vGPU 共享。
该文章提到更深入的 GPU 分片技术框架。
GPU 非虚拟化方案
todo
NVIDIA GPU OPERATOR
在 Prometheus Proactise之设备插件 device-plugin 提到 Kubernetes 下如何支持新的硬件。
Configuring and Managing nodes with these hardware resources require configuration of multiple software components such as drivers, container runtimes or other libraries which are difficult and prone to errors.
The Nvidia GPU Operator uses the operator framework within kubernetes to automate the management of all NVIDIA software components needed to provison GPU. These components include the NVIDIA drivers (to enable CUDA), Kubernetes device plugin for GPUs, the NVIDIA Container Toolkit, automatic node labelling using GFD, DCGM based monitoring and others.
参考
[1] xtaohub.com: 一切靠自己的 MPI 框架
[2] stackoverflow: How do I use Nvidia Multi-process Service (MPS) to run multiple non-MPI CUDA applications?
[3] Enward: NVIDIA MPS总结
[4] NVIDIA: 《CUDA_Multi_Process_Service_Overview》
深入了解 GPU 硬件架构及运行机制 非常全面的介绍
并行计算 在线课程,必读