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


作者也认为:「如何组织通道分配是一个悬而未决的问题 。 我们通过实验认为使用我们的算法非常有效 , 但是给定一组任务 , 找到最优通道数存在更多其它的可能 。 」
4、调度策略
通过使用细粒度的 GPU 共享原语 , Salus 可以将多个作业打包在一起以提高效率 , 优先抢占长时间运行的作业而不是较短的作业(或基于其他优先级标准) , 此外 , 还有很多不同的调度策略值得进一步探索 。 在这篇文章中作者试用了简单的调度策略 , 包括 PACK(目标是优化资源利用)、SRTF(最短剩余时间优先)和 FAIR(在当前任务中平均分配资源) 。
【实验分析】
本文将 Salus 与 TensorFlow 集成进行实验 , 所有的实验都是在一台基于 x86_64 的 Intel Xeon E5-2670 机器上进行的 , 带有 2 个 NVIDIA Tesla P100 GPU 。 每个 GPU 都有 16GB 的片上存储器 , 以及使用 Tensor-Flow v1.5.0 和 CUDA 8.0 。 实验中主要基准是当今 GPU 集群中常用的 FIFO 调度 , 此外还与 NVIDIA MPS 进行了比较 。
首先 , 评估 Salus 对训练的影响 , 对比方法包括 FIFO、SRTF、PACK 和 FAIR 。 图 11 中实验证明了 Salus 允许快速抢占内存 , 同时又允许实现最短剩余时间优先(SRTF)调度策略 。 考虑长作业任务 , 一个大的训练工作已经运行了一段时间 , 然后用户想快速地为较小的网络做一些超参数调整的测试 。 如果没有 Salus , 用户只能等到大的工作完成才能开始新的测试-这是 HOL 阻塞的一个例子 。 而 Salus 能够通过高效切换来实现抢占 , 以运行短作业 , 并在稍后恢复较大的作业 。 图 11(a)中的任务为:当作业 #1 到达时 , 后台作业 #0 立即停止 , Salus 切换到运行新到达的较短作业 。 作业 #2 比作业 #3 来得早 , 但由于作业 #3 较短 , 所以它是先安排的 。 最后 , 由于作业 #5 较短 , 因此作业 #4 被抢占 , 并让作业 #5 运行到完成 。 在该过程中 , 后台作业 #0 仅在没有其他较短作业存在时才被调度 。 图 11(b)是另一个 Salus 快速切换能力的例子 。 它是以秒为单位的内存分配活动的可视化:在作业切换时 , 第二个作业的迭代在第一个作业停止后立即开始 。
『机器学习』MLSys提前看 | 机器学习的分布式优化方法
本文插图

图 11. 使用 SRTF 运行长任务的详细信息 。 在两个切片中 , 时间都是标准化的
图 12 中实验展示了 Salus 如何允许多个 DL 作业之间的秒粒度公平共享 , 而不是分钟粒度 。 在这两种情况下都考虑单一的 GPU 通道 。 一共包括 4 个训练任务:googlenet_100、resnet50_25、alexnet 100 和 resnet50_50 在实验过程中处于活动状态 , Salus 尝试使其 GPU 时间相等 。 同样 , 所有的切换都发生在亚秒的粒度 。

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

图 12. 使用 FAIR 的长任务内存使用情况
其次 , 作者对于 Salus 在超参调参情况下的性能进行了实验 。 作者评估了两组超参调参任务:resnet50_50 和 superres_128 , 分别用于图像分类和图像分辨率增强 。 每组任务包含 300 个作业 , 当 300 个作业全部完成时代表一个任务完成 。 使用 FIFO(在 TensorFlow 中)和 Salus 实现的最大完工时间的比较如图 13 所示 。 在 resnet50_50 的情况下 , Salus 有 1.07 倍的改进 , 而 superres_128 中 Salus 的最大完工时间改进是 2.38 倍 。 在 resnet50_50 中几乎没有什么改进 , 这是因为即使 GPU 有足够的内存将许多作业放在一起 , 计算也很可能成为此时完成任务的瓶颈 。

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

图 13. 超参调参任务情况


推荐阅读