ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

拆解Flex:ai本地虚拟化的3大核心组件:CUDA劫持、GPU设备插件与Volcano调度扩展

拆解Flex:ai本地虚拟化的3大核心组件:CUDA劫持、GPU设备插件与Volcano调度扩展 拆解Flex:ai本地虚拟化的3大核心组件CUDA劫持、GPU设备插件与Volcano调度扩展【免费下载链接】flexaiFlex:ai是一个面向AI容器场景的开源项目其核心能力包含两大部分分别是XPU虚拟化和多级智能调度。其中XPU虚拟化分为本地XPU虚拟化和跨节点拉远虚拟化本地XPU虚拟化支持将1台服务器上的XPU算力卡虚拟化分割出多个虚拟算力单元实现单张算力卡在多个容器的共享。跨节点拉远虚拟化支持通过RDMA或TCP网络访问远端节点上的算力卡。多级智能调度支持对切分出的虚拟卡进行Binpack等资源级调度以及对AI训推任务进行分时调度等能力。项目地址: https://gitcode.com/ModelEngine/flexaiFlex:ai是一个面向 AI 容器场景的开源项目其本地 GPU 虚拟化能力可将 1 张算力卡切分为最多 20 个虚拟 GPUvGPU实现多容器共享同一张卡。本文将拆解支撑该能力的 3 大核心组件CUDA 劫持、GPU 设备插件与Volcano 调度扩展帮你快速理解 GPU 算力切分、显存隔离与 Binpack 资源调度的完整链路适合刚接触 K8s GPU 共享与 XPU 虚拟化的新手阅读。Flex:ai 本地虚拟化一张 GPU 卡如何变出 20 个 vGPU传统 K8s 集群中一张 GPU 卡只能被一个 Pod 独占大量推理小任务排队等待整卡资源利用率极低。Flex:ai 的本地 XPU 虚拟化解决的正是这个问题能力说明 算力切分单卡切分为 1~20 个 vGPU每个 vGPU 可设定算力百分比5% 的倍数 显存隔离按 Gi 为单位限制每个 vGPU 可用显存vgpu-memory.1Gi⚡ 资源级调度对虚拟卡做 Binpack 等调度策略提升装箱率⏱️ 分时调度面向 AI 训推任务的时间维度调度整套能力由 3 个组件协作完成CUDA 劫持client-update让容器内的 CUDA 调用受到算力/显存限制GPU 设备插件gpu-device-plugin把 vGPU 作为 K8s 资源注册给 kubeletVolcano 调度扩展vc-scheduler huawei-xpu.so 插件决定哪个 vGPU 任务调度到哪张卡。三者关系可以概括为设备插件卖资源、调度器分资源、CUDA 劫持限资源。组件一CUDA 劫持——让容器看不见整卡工作原理备份、替换、监控三连CUDA 劫持是 Flex:ai 本地虚拟化的执行层。它通过 DaemonSet 以节点级方式部署 cuda-client-update.sh对系统中的 CUDA 驱动库做三件事详见 cuda-client-update.sh#L44-L64备份将原始libcuda.so备份到/opt/xpu/lib/libcuda-original.so替换用包装库 libcuda_direct.so 顶替系统 CUDA 库容器内所有 CUDA API 调用都被劫持到该库监控主循环每 5 秒通过 SHA256 比对校验文件自动修复被覆盖的文件并维护 gpu-monitor 监控工具见 cuda-client-update.sh#L93-L115。算力限流PID 控制器动态调节被劫持后vGPU 的算力上限由 GpuCoreLimiter 实现它内置一个 PID 控制器以约 167ms 为周期观测当前容器的 GPU 实际占用动态计算注入的延迟量把利用率钉在申请的vgpu-cores百分比上下波动。显存侧则由 memory_limiter.h 完成限制。CUDA 层面的钩子实现位于 cuda_hooks.cpp。 简单说你申请 20% 算力 3Gi 显存劫持层就保证该容器最多只能用这么多其他容器的性能不受影响。组件二GPU 设备插件——把 vGPU 注册为 K8s 资源vGPU 资源模型3 个关键字段设备插件 gpu-device-plugin 通过 K8s Device Plugin 接口xpu.sock向 kubelet 注册三类虚拟资源定义见 gpu.go#L28-L33资源名含义取值huawei.com/vgpu-number申请的 vGPU 卡数1 起≤ 节点物理卡数huawei.com/vgpu-cores算力切分百分比0~1005 的倍数huawei.com/vgpu-memory.1Gi显存占用单位 Gi高可用的注册机制插件主循环 main.go#L34-L63 值得新手学习它通过 inotify 监听 kubelet 的kubelet.sockkubelet 重启后自动重连同时启动设备缓存DeviceCache与一个 gRPC PIDs 服务service_impl.go供容器内的xpu-client-tool查询该进程绑定的 vGPU 配置——这正是劫持层拿到我的算力/显存限额的来源。 部署侧通过 Helm Chart 一键拉起gpupool/values.yaml 中同时定义了gpuDevicePlugin、gpuClientUpdate、xpuExporter三个组件对应模板见 gpu-device-plugin-daemonset.yaml 与 gpu-client-update-daemonset.yaml。组件三Volcano 调度扩展——虚拟卡的 Binpack 智能调度设备插件解决了资源从哪来而任务调度到哪张卡由 Volcano 完成。Flex:ai 在标准 Volcanocontroller scheduler webhook 三件套基础上做了 XPU 扩展编译产物为 huawei-xpu.so、vc-scheduler、vc-controller-manager 与 vc-webhook-manager一键部署清单位于 volcano-development.yaml其中调度器镜像配置见 volcano-development.yaml#L4198。它的两个核心角色Binpack 资源级调度huawei-xpu.so作为 Volcano 调度插件让 vGPU 任务尽量装进同一张物理卡减少碎片最大化剩余卡的可用度Webhook 准入改造vc-webhook-manager自动把 Pod 的调度器改写为 Volcano并注入 PodGroup 等元数据业务方无需关心调度细节。3 大组件协同一次 vGPU 申请的全链路当一个 Pod 申请 vGPU 资源时三个组件按以下顺序接力申请Pod YAML 中声明huawei.com/vgpu-*资源见下文示例准入Volcano webhook 拦截请求改写 schedulerName 并补全调度元数据调度vc-scheduler加载huawei-xpu.so插件按 Binpack 策略为 vGPU 挑选物理卡与节点分配GPU 设备插件从该卡的可用 vGPU 中分配额度容器内xpu-client-tool经 gRPC 拿到核心/显存限额限流CUDA 劫持层libcuda_direct.so依据 PID 控制器持续限算力、按配额限显存gpu-monitor可实时查看利用率是否贴合设定值。resources: requests: huawei.com/vgpu-number: 1 huawei.com/vgpu-cores: 20 huawei.com/vgpu-memory.1Gi: 3 limits: huawei.com/vgpu-number: 1 huawei.com/vgpu-cores: 20 huawei.com/vgpu-memory.1Gi: 3⚠️ 规格限制一张 GPU 卡最多切 1~20 个 vGPU单容器申请的 vGPU 数不超过节点物理卡数。快速上手Flex:ai 本地虚拟化部署关键步骤完整教程见 GPU-Virtual-Service/README.md新手只需记住 4 步环境准备openEuler 22.03cgroup v1 K8s 1.31.1 NVIDIA 驱动与 container-toolkit并配置容器运行时拉起调度组件导入vc-controller/vc-scheduler/vc-webhook-manager镜像后执行kubectl apply -f volcano-development.yaml拉起虚拟化组件打包 gpupool Helm Charthelm package gpupool给节点打gpupool.com/gpu-readytrue标签后helm install验证效果部署 vLLM 推理服务后用watch nvidia-smi观察整卡占用或在容器内执行gpu-monitor -p 1确认利用率在vgpu-cores设定值附近波动。延伸Flex:ai 的完整版图——不止本地虚拟化本地虚拟化之外Flex:ai 还包含跨节点拉远虚拟化基于 RDMA/TCP 通过网络访问远端节点的算力卡。gpu-remoting 子项目通过LD_PRELOAD注入 CUDA hook 库将容器内的 CUDA 调用透明转发到远端服务器执行并配套共享内存存储模块加速数据管道。Flex:ai 拉远虚拟化存储模块代码结构图其共享内存设计通过Shared_Memory在渲染端renderer与计算端compute之间传递 batch 数据与模型参数避免重复拷贝总结3 个组件各管一段组件解决的问题关键文件CUDA 劫持容器内算力/显存限流cuda-client-update.shGPU 设备插件vGPU 资源注册与分配cmd/main.goVolcano 扩展vGPU 的 Binpack 调度与准入volcano-development.yaml对于新手而言理解 Flex:ai 本地虚拟化的最佳路径是先跑通 Helm 部署 → 再读设备插件的资源注册逻辑 → 最后看劫持层的 PID 限流实现。三者各司其职共同把一张卡独占变成了一张卡 20 用让 AI 推理集群的 GPU 利用率真正提了上去。【免费下载链接】flexaiFlex:ai是一个面向AI容器场景的开源项目其核心能力包含两大部分分别是XPU虚拟化和多级智能调度。其中XPU虚拟化分为本地XPU虚拟化和跨节点拉远虚拟化本地XPU虚拟化支持将1台服务器上的XPU算力卡虚拟化分割出多个虚拟算力单元实现单张算力卡在多个容器的共享。跨节点拉远虚拟化支持通过RDMA或TCP网络访问远端节点上的算力卡。多级智能调度支持对切分出的虚拟卡进行Binpack等资源级调度以及对AI训推任务进行分时调度等能力。项目地址: https://gitcode.com/ModelEngine/flexai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表