GPU 热迁移
GPU 上下文快照和热迁移目前能做什么,以及没有热迁移时怎么挪动 GPU 工作负载
GPU 热迁移是指把运行中的 GPU 工作负载挪到另一张 GPU 或另一个节点,进程不重启:先给 GPU 上下文做快照,在目标位置恢复,应用接着跑。TensorFusion 的开源组件不包含这项功能,它属于商业版。本页说明现在有什么、没有什么,以及在此之前怎么挪动工作负载。
目前有什么
| 能力 | 现状 |
|---|---|
| 对运行中的 GPU 上下文做快照和恢复 | 开源的 controller 和 hypervisor 不支持。hypervisor API 里有 POST /api/v1/workers/<id>/snapshot 和 POST /api/v1/workers/<id>/resume 两个接口,但都返回 501 Not Implemented。也没有任何 CRD 字段或注解可以发起迁移 |
| 通过重启来挪动工作负载 | 支持。节点合并和碎片整理会驱逐 Pod,让调度器把它放到别处。进程会重启,模型要重新加载 |
| 让某个节点不被自动挪动 | 支持,给 GPUNode 打 tensor-fusion.ai/do-not-disrupt 标签 |
需要热迁移,请联系我们了解商业版。
没有热迁移时怎么挪动工作负载
没有热迁移,挪动就等于换个地方重启。要按“会重启”来安排。
-
让工作负载经得起重启。在 Service 后面至少跑两个副本,或者接受短暂中断。同时加上
PodDisruptionBudget:节点上只要有一个 TensorFusion worker Pod 没有被PodDisruptionBudget覆盖,碎片整理就会跳过这个节点。 -
选择挪动方式:
-
自动。 在资源池上开启碎片整理。它按 cron 定时腾空在用 GPU 较少的节点,一次只驱逐一个 Pod,而且先模拟调度,确认节点上每个 Pod 都有去处才动手。见优化 GPU 效率。
-
手动。 把节点设为不可调度,然后删除占着 GPU 的 Pod。本地 GPU 工作负载删的是应用 Pod;远程 GPU 工作负载删的是 worker Pod,它带有
tensor-fusion.ai/component=worker标签。这个 Pod 必须由会重建它的控制器管理。kubectl cordon <node> kubectl delete pod <pod> -n <namespace> kubectl get pods -n <namespace> -o wide kubectl uncordon <node>新建的 Pod 会出现在另一个节点上。
-
-
不希望某个节点被节点合并和碎片整理处理时,给它的
GPUNode打标签:kubectl label gpunode <node> tensor-fusion.ai/do-not-disrupt=true
TensorFusion 文档