在PyTorch模型的GPU之间调度作业

问题描述

我正在尝试建立一个系统,该系统可以根据请求训练深度模型。用户进入我的网站,单击一个按钮,然后开始培训过程。

但是,我有两个GPU,我不确定哪种是在两个GPU之间排队/处理作业的最佳方法:在至少有一个GPU可用的情况下启动作业,如果当前没有GPU,则将该作业排队可用。我想针对每个工作请求使用一个GPU。

这是我可以和芹菜一起做的吗?我过去曾使用过此方法,但不确定如何处理与GPU相关的问题。

非常感谢!

解决方法

不确定celery,因为我从未使用过它,但从概念上讲似乎是合理的(无论如何,这个问题还是很开放的):

  • 创建仅负责将任务分配给某些GPU并接收请求的线程
  • 如果有任何GPU是免费的,请立即为其分配任务
  • 如果两个人都被占用了估计时间,则可能需要花费时间来完成任务(神经网络训练)
  • 将其添加到GPU的时间大约最短

时间估计

给定固定数量的样本和纪元,可以很好地近似当前任务的ETA。如果不是这种情况(例如提前停止),将会变得越来越困难,并且需要进行启发式搜索。

GPU过载时(例如每个GPU队列中有5个任务),我要做的是:

  • GPU上目前正在进行停止进程
  • 对几批数据运行新流程以粗略估计完成此任务可能需要多长时间
  • 询问所有任务的估计量

现在,这取决于流量。如果它很大并且会经常中断正在进行的进程,则您只需将新任务添加到任务量最少的GPU队列中(这里也需要一些启发式,假设您现在已经估计了可能的请求量)只有2个GPU,可能不会很大)。