基于 gitlab-runner 实现调度GPU的资源

本篇目录

    • [1. 客户需求](#1. 客户需求)
    • [2. 需求调研](#2. 需求调研)
    • [3. 实践](#3. 实践)
      • [3.1 方案一:环境变量的方式](#3.1 方案一:环境变量的方式)
      • [3.2 方案二:k8s 自身的spec注入机制](#3.2 方案二:k8s 自身的spec注入机制)
    • [4. 效果](#4. 效果)

该实践来自于客户的一个真实需求

1. 客户需求

客户的某些流水线需要使用GPU资源,但是对于GPU服务器而言,会有多张GPU显卡,而客户只需要将runner的资源调度在其中的一张或者多张显卡,而不是占用整个GPU服务器的显卡资源。

2. 需求调研

  • 通过查看runner的相关文档,对于runner使用GPU资源而言,本身runner是不需要做任何配置的,详见说明 GPU
    (https://docs.gitlab.com/runner/configuration/gpus.html)。
  • 关于GPU(主要针对的英伟达),可以通过 NVIDIA_VISIBLE_DEVICES 环境变量来控制,进行制定数量GPU显卡资源的调度。
  • 针对runner的执行器为 kubernetes 类型而言,可以通过spec的配置注入机制来实现将部分配置聚合在runner 拉起的pod中,从而实现资源的控制,该技术本身是基于k8s的原理来实现的。

3. 实践

3.1 方案一:环境变量的方式

gitlab runner的配置文件调整如下:

复制代码
  config: |
    [[runners]]
      environment = ["FF_USE_ADVANCED_POD_SPEC_CONFIGURATION=true","NVIDIA_VISIBLE_DEVICES=0"]

说明:

  • 对于多张显卡而言,总是从0..n,因此这里的 0 指的是第一张显卡,也就是说runner的作业拉起pod后,会占用第一张显卡。
  • 如果要使用多张显卡,可以参考NVIDIA_VISIBLE_DEVICES 的详细配置。

3.2 方案二:k8s 自身的spec注入机制

相比于方案一,方案二要更灵活一下,但是需要开启 FF_USE_ADVANCED_POD_SPEC_CONFIGURATION flag。具体的配置调整如下:

复制代码
config: |
    [[runners]]
      environment = ["FF_USE_ADVANCED_POD_SPEC_CONFIGURATION=true"]
      [runners.kubernetes]
        namespace = "{{.Release.Namespace}}"
        image = "alpine"
        pull_policy = ["if-not-present"]
        [runners.kubernetes.node_selector]
          "nvidia.com/gpu.present" = "true"
          [[runners.kubernetes.pod_spec]]
            name = "cpu limit"
            patch = '''
              containers:
              - name: build
                resources:
                  limits:
                    nvidia.com/gpu: 1
            '''
            patch_type = "strategic"

patch_type说明:

  • strategic:Kubernetes 的 战略合并 Patch,可以在不破坏原始 YAML 结构的前提下进行合并和修改(推荐)。
  • json:使用 JSON Patch 格式来修改资源。
  • merge:简单的合并 Patch。

4. 效果

调整前

调整后

相关推荐
极小狐1 天前
干掉流水线里的长期密钥:用 OIDC 让 CI/CD 与云以临时凭证对接
microsoft·ci/cd·gitlab·devops·ci·cd·oidc
snow@li1 天前
服务器运维:阿里云安装软件gitlab/智能体协助安装/智能体协同运维
运维·gitlab
极小狐2 天前
CI 流水线提速实战:缓存设计与依赖代理的工程实践
缓存·ci/cd·gitlab·devops
DevOps老兵3 天前
AI Infra实战11:模型部署Pipeline——CI/CD自动化
人工智能·ci/cd·ai·自动化·gitlab
极小狐3 天前
从复制粘贴到可复用组件:极狐GitLab CI/CD 组件目录实战
java·ci/cd·gitlab·devops·组件化
极小狐3 天前
用 Flow 编排 Agent 智能体:极狐GitLab Duo 自定义工作流实战
ai·gitlab·agent·devops·flow·duo
陈皮糖..3 天前
基于 Kubernetes 与 GitLab CI/CD 的云原生自动化交付平台
运维·ci/cd·云原生·架构·kubernetes·自动化·gitlab
11路没有终点4 天前
GitLab CI/CD 高级模式实战:include 模板库 / trigger 子流水线 / matrix 并行
ci/cd·gitlab
11路没有终点4 天前
GitLab CE CI/CD 入门指引手册:从零搭建第一条流水线
ci/cd·gitlab
2501_928996225 天前
Agent 开发的 API 选型:从 Function Calling 到多模型协作的中科热备底层逻辑
服务器·重构·gitlab