# deepshare **Repository Path**: anolis/deepshare ## Basic Information - **Project Name**: deepshare - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-09-08 - **Last Updated**: 2025-09-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DeepShare: 面向多租户GPU集群的弹性调度与资源管理系统 ## 项目概述 本项目针对多租户GPU集群中的资源利用率低和调度公平性问题,提出: 1. **弹性配额管理机制**:区分保障型(Guaranteed)与尽力型(Best-effort)作业 2. **性能干扰感知调度**:基于随机森林的作业混合放置预测模型 3. **低成本抢占策略**:考虑历史抢占成本的动态资源回收 4. **Kubernetes深度集成**:完整实现为K8s调度框架插件 > **核心价值**:相比固定配额策略减少排队时延66%,提升GPU利用率12%,吞吐量提升2倍 ## 技术亮点 ### 1. 多租户弹性配额管理 | 组件 | 算法 | 创新点 | | ---------------- | ------------------ | --------------------------------------- | | 配额保证度计算 | 动态权重分配 | 基于历史使用模式的公平性保障 | | 作业时间预测 | 梯度提升回归 | 用户专属模型+集群通用模型的双层预测架构 | | 抢占成本评估 | 时间加权函数 | 避免频繁抢占同一作业 | **精度**:作业时间预测R²=0.902(优于Lucid等基线) ### 2. 性能干扰感知调度 ```python def colocation_score(job1, job2): # 输入:作业的SM利用率、显存占用等14维特征 features = extract_features(job1, job2) # 随机森林预测性能衰减率 decay = random_forest.predict(features) # 动态调整容忍阈值 threshold = max(D_min, 1 - cluster_pressure) return decay <= threshold ``` - **关键特征**:SM利用率、内存拷贝效率、PCIe带宽等细粒度指标 - **动态阈值**:根据集群负载自动调整性能衰减容忍度 ### 算法流程 - 任务筛选: - 根据Fair算法,筛选出一个job - 节点筛选: - 根据打上的标签,计算cost最小的节点,将任务绑定到cost最小的节点上,并绑定到对应的卡上(需要config-map指定env来支持) - cost函数: ``` nodeCost := sum(w1 * GPUUtilCost + w2 * GPUMemCost)_card GPUMemCost_card := (Used + Request) / Cap GPUUtilCost_card := sum(ai1 * f(UsedUtilAvg + RequestUtilAvg) + ai2 * (UsedUtilStd - RequestUtilStd)^2)_i={util/smactive/smoccupied/fp32} ``` ### 算法初始化 挑选一批job,分两次训练: - 训练一:独占卡训练,收集GPUUtil、GPUMem等利用率的平均值+标准差,以及完成时间 - 训练二:将任务随机地共享调度,每个卡放两个job,收集每个任务的完成时间 计算每个job在每个卡上的cost,最为训练数据的标签 - `cost := 最终完成时间/独占完成时间`(保证cost大于0) 构造训练数据: - 每一条数据为每个job的一次共享: - 自变量:usedavg、requestavg、usedstd、requeststd,其中used为与另一个共享job的指标,request为当前job的指标 - 因变量:cost ### 算法持续学习优化 - 以每个job为视角 - 当job某次完成时,卡利用率低于80%,视为基准,收集预测的GPUUtil、GPUMem等利用率的平均值+标准差,以及完成时间 - 其他情况,为共享调度,收集完成时间 - 计算cost - 构造训练数据 ### 3. 系统架构设计 ```mermaid graph TD A[用户作业] --> B[作业分析模块] B -->|利用率数据| C[调度决策引擎] C --> D[弹性配额管理器] C --> E[干扰预测模型] D --> F[资源分配] E --> F F --> G[K8s节点] ``` ### 实现 - crd-controller: - 创建pod是为pod打上env的config-map: - config-map名称为`${POD_NAME}-nvidia-gpu-env` - pod可通过`scheduler-config-map-manager-svc.kube-gpu-sparse`域名来访问config-map - webhook: - mutation: 打上特定的annotation - addmission:检查有没有打上特定的annotation和env,以及env的配置是否是from config-map - 任务筛选:Queue - 节点筛选: - Filter:根据指定的gpu数量来过滤掉一些节点: - 当选用大于2个gpu时,只调度到65-68节点;当选用大于4个gpu时,一个节点都不给调度 - 当GPU剩余显存空间不足于pod需求时,任务GPU不可用。若节点可用GPU个数少于需求数,过滤该节点 - Score(核心逻辑):计算cost值 - NormalizeScore:计算最小cost的节点,置分数最高,其余节点分数置0 - PreBind:将绑定的GPU卡号写入到config-map(请求config-mai服务) ## 快速开始 ### 环境要求 - Kubernetes ≥ v1.22 - NVIDIA GPU驱动 ≥ 450.80.02 - Prometheus + DCGM监控套件 ### 部署流程 #### 编译打包 - 编译代码 - 使用Dockerfile打包镜像 - 修改yaml最新的镜像版本 #### 1. 安装CRD与控制器 ```bash kubectl apply -f /crd-controller/deploy/crd/ kubectl apply -f /crd-controller/deploy/controller/ ``` #### 2. 部署调度器插件 ```bash # 修改镜像地址后部署 kubectl apply -f yaml/kube-gpu-colocate-scheduler.yaml ``` #### 3. 配置节点信息 ```yaml # yaml/node-conf.yaml示例 nodes: - name: ali-1 ip: 10.8.0.1 gpu: 0 gpu-mem: 32 # 32G model: V100 uuids: ["GPU-dd41b996-e5a4-0795-b048-18843bec604b", "GPU-f8525b10-e569-e1c9-1f68-ee2d4b9392ac"] ``` ## 性能对比 ### 调度效率提升 | 指标 | 固定配额 | DeepShare方案 | 提升幅度 | | ------------------ | -------- | --------- | -------- | | 平均排队时间 | 704.9s | 232.8s | 66%↓ | | GPU平均利用率 | 52% | 65.74% | 12%↑ | | P99.9排队延迟 | 587041s | 115094s | 80%↓ | ## 架构设计 ### 核心组件交互 ```mermaid sequenceDiagram 用户->>+作业管理: 提交作业 作业管理->>+分析模块: 请求资源分析 分析模块-->>-作业管理: 返回利用率数据 作业管理->>+调度器: 加入调度队列 调度器->>+配额管理: 检查资源配额 配额管理-->>-调度器: 返回可用资源 调度器->>+干扰模型: 评估混合作业 干扰模型-->>-调度器: 返回衰减预测 调度器->>K8s: 绑定节点 ``` ## 参与贡献 欢迎提Issue或PR!建议贡献方向: - 支持MIG(Multi-Instance GPU)分区调度 - 扩展异构GPU支持(A100/H100等) - 集成RDMA网络优化 ## 许可证 Apache 2.0 © 2023 zhuangkr