在已经实现了k8s层面的GPU按小数申请支持的情况下(阿里是按内存数量支持),我们需要有个实际的资源限制的方案。
目前不太有好的办法控制gpu的算力(其实有,局限性比较大)。我们先控制下gpu显存的使用,具体实现就不方便贴了,讲下思路和效果
- 首先需要了解cuda api,所有框架如果细看代码都会发现底层是使用的cuda api去操作nvidia 的gpu,python只是个binding
- 需要了解hook 系统api的方法( 搜索关键词ring3 hook)
我们从tensorflow的运行日志去翻代码 找设备初始化信息的地方 Found device ,跟进去,可以发现实际是调用了cuMemGetInfo这个函数获取的信息。 (这个页面中mem相关的函数都建议看下)
那么我们只需要重新写个so,实现这个函数就可以了,这个函数根据我们自己的逻辑设置最大的内存上限,与此同时由于cuMemGetInfo ( size_t free, size_t total ) 这个函数还返回了free的情况,所以我们也需要记录free的值,可以hook掉cuMemAlloc ,申请的时候记录下各个容器的使用情况,也可以利用外围的监控程序获取信息
最终实现的效果,设置环境变量后tensorflow看到的内存值是我们设置的值
1 | root@cnn2-1553057347-worker-0:~# export GPU_MEMORY=2147483648 |