GPU Volunteer Computing

首先这是个没有实现的东西,只是我的一个设想,其次虽然不想浪费今天发送的机会,但是今天有点心情不好,按倩姐的说法就是有点丧,所以就简单的描述下。

这个Idea来源于bvc (百度第一个最高奖,利用空闲的cpu资源来做计算的服务),我们把这个方案搬到GPU上

  1. 需要先实现GPU的共享机制(按之前的文章,包括业界方案已经可以实现)

  2. 需要有个分布式存储服务用户存储tensorflow的checkpoint文件,用于中断后恢复(也是一大把)

方案:

  1. 对于训练服务,我们可以将训练的Pod混布到Serving服务的GPU卡上,这里可能需要实现特殊的调度策略,假设Serving的容器是request 是1个GPU的情况下(但其实资源使用很低),我们需要能把混布的Pod调度过去;

  2. 需要用Daemonset之类启动个服务监视混布的Pod占用的资源情况,占用值超过设定的值,就把这个pod踢掉,让调度器重新调度

  3. 只对于算子Worker进行以上设计,PS角色还是尽量保证其稳定性(通常PS也不需要GPU),并且worker存日志到分布式存储上,不然重启就没了

结合bvc的实践经验,以及目前普遍的GPU使用情况,闲散资源量足够的情况下,及时是个在线服务,也可以保证足够的稳定性要求,况且我们这里只用于训练,这么一说好像Serving也可以这么玩,前面的负载均衡弄好就行。

用脚本demo示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env bash
#GPU volunteer computing demo
supervisor() {
killOverUseGpu &
runOnNonUseGpu
}
killOverUseGpu(){
#observer everymiute
while true;do
logrotate
ret=$(getSecondAverageGpuUsgae 60)
cnt=0
for i in $ret;
do
gpu=$(echo $i | awk -F ',' '{print $1}')
mem=$(echo $i | awk -F ',' '{print $2}')
if [[ $gpu -gt 80 ]] || [[ $mem -lt 500 ]];then
log "device $cnt is busy,gpu:${gpu}, mem:${mem}"
killGpuContainer $cnt
fi
let cnt=cnt+1
done
sleep 60
done
}
runOnNonUseGpu() {
while true;do
ret=$(getSecondAverageGpuUsgae 300)
cnt=0
for i in $ret;
do
gpu=$(echo $i | awk -F ',' '{print $1}')
mem=$(echo $i | awk -F ',' '{print $2}')
if [[ $gpu -lt 10 ]] && [[ $mem -gt 500 ]];then
log "device $cnt is unuse,gpu:${gpu}, mem:${mem}"
runGpuContainer $cnt
fi
let cnt=cnt+1
done
sleep 300
done


}