『机器学习』MLSys提前看 | 机器学习的分布式优化方法( 五 )



『机器学习』MLSys提前看 | 机器学习的分布式优化方法
本文插图

图 9.Multi-DGX-1 DNN 中 Blink 训练结果
【文章小结】
本文提出的 Blink 是一个快速通用的集体通信库 , 用于加速分布式机器学习 。 为了处理在现代 GPU 硬件中普遍存在的拓扑异质性 , Blink 使用动态包生成树以最大化链路利用率 。 与目前最先进的、基于环的集体通信协议(如 NCCL2)相比 , Blink 可以实现高达 8 倍的模型同步速度 , 并将端到端 DNN 模型训练时间减少 40% 。
Salus: Fine-Grained GPU Sharing Primitives for Deep Learning Applications
Efficient inference and model serving topic
https://arxiv.org/pdf/1902.04610v1.pdf
随着深度学习(deep learning , DL)应用的普及 , GPU 计算正变得越来越流行 。 然而 , 与传统资源(如 CPU 或网络)不同 , 现代 GPU 本身并不支持细粒度共享原语(最细的颗粒度就是整个 GPU) 。 因此 , 实现诸如分时和抢占等公共策略的代价是非常昂贵的 。 更糟糕的是 , 当一个 DL 应用程序不能完全使用 GPU 的资源时 , GPU 不能在多个应用程序之间有效地共享 , 从而导致 GPU 利用率低下 。 虽然这种访问 GPU 的排他性简化了硬件设计并使其变得高效 , 但它导致了两个主要的低效率:首先 , 粗粒度、一次一个的 GPU 分配模型阻碍了 GPU 集群管理器的调度能力;其次 , 并非所有的 DL 作业都能一直充分利用 GPU 。 此外 , 日益流行的 DL 模型的自动超参数调整趋势进一步强调了提高 GPU 利用率的必要性 。 这种自动超参调整可以被视为「预训练」的过程 。 它通常是通过为超参数探测并行生成许多训练作业来完成的 , 其中许多作业一旦被认为质量低劣就会被杀死 。
为了解决这些问题 , 这篇文章的作者提出 Salus , 一种使细粒度的共享 GPU 与灵活的调度策略共存的方法 。 Salus 通过公开两个 GPU 共享原语来实现这一点:快速任务切换和内存共享 。 前者确保可以在 GPU 上快速切换当前活动的 DL 作业 , 从而实现高效的时间共享和抢占 。 后者通过在同一设备上打包更多的小 DL 作业来确保高利用率 。 DL 应用程序独特的内存使用模式是在 Salus 中高效实现这些原语的关键:识别三种不同的内存使用类型 , 并在处理它们时应用不同的管理策略 。 将这两个原语组合在一起 , 可以使用细粒度时空共享来实现各种解决方案 。
【SALUS 详解】
1、总体结构
Salus 被实现为一个单一的执行服务 , 它整合了所有 GPU 访问 , 从而支持 GPU 共享 , 同时避免了 GPU 上进程之间代价高昂的上下文切换 。 因此 , 任何未修改的 DL 作业都可以使用 DL 框架特定的适配器利用 Salus , 如图 10 所示 。 从用户角度来说 , Salus 相当于一个虚拟计算资源 。 而从用户角度 , 框架的 API 并没有什么变化 , 无需增加新操作 。
Salus 已经开源:https://github.com/SymbioticLab/Salus
『机器学习』MLSys提前看 | 机器学习的分布式优化方法
本文插图

图 10. Salus 位于 DL 框架和 DL 堆栈中的硬件之间 , 对用户是透明的
当在用户脚本中创建 DL 作业时 , DL 框架中的 Salus 适配器在 Salus 中创建相应的会话(1a) 。 在创建过程中 , DL 作业的计算图也被转移到 Salus 。 然后 , 会话继续从存储器管理器(1b)请求通道 。 根据系统中的当前作业 , 此进程可以阻塞从而会话将排队 。 在作业运行过程中 , 无论是训练还是推断 , 迭代都由用户脚本生成并转发到 Salus 中的相应会话(2a) 。 然后 , 它们由迭代调度器(2b)根据其关联的 GPU 通道进行调度 , 并发送给 GPU 执行 。 Salus 执行服务通过 DL 作业的迭代粒度调度实现 GPU 共享 。


推荐阅读