安装Volcano

操作步骤

  1. 以root用户登录K8s管理节点,并执行以下命令,查看MindCluster Volcano镜像和版本号是否正确。

    docker images | grep volcanosh
    回显示例如下。
    volcanosh/vc-controller-manager      v1.7.0              84c73128cc55        3 days ago          44.5MB
    volcanosh/vc-scheduler               v1.7.0              e90c114c75b1        3 days ago          188MB

  2. MindCluster Volcano软件包解压目录下的yaml文件,拷贝到K8s管理节点上任意目录。
  3. 如不修改组件启动参数,可跳过本步骤。否则,请根据实际情况修改对应启动yaml文件中MindCluster Volcano的启动参数。常用启动参数请参见表3表4
  4. 配置MindCluster Volcano日志转储。

    安装过程中,MindCluster Volcano日志将外挂到磁盘空间(“/var/log/mindx-dl”),为防止空间被占满,请为MindCluster Volcano配置日志转储,配置项信息参见表1
    1. 在管理节点“/etc/logrotate.d”目录下,执行以下命令,创建日志转储配置文件。
      vi /etc/logrotate.d/文件名

      例如:

      vi /etc/logrotate.d/volcano
      写入以下内容,然后执行:wq命令保存。
      /var/log/mindx-dl/volcano-*/*.log{    
           daily     
           rotate 8     
           size 50M     
           compress     
           dateext     
           missingok     
           notifempty     
           copytruncate     
           create 0640 hwMindX hwMindX     
           sharedscripts     
           postrotate         
               chmod 640 /var/log/mindx-dl/volcano-*/*.log                
               chmod 440 /var/log/mindx-dl/volcano-*/*.log-*            
           endscript 
      }
    2. 依次执行以下命令,设置配置文件权限为640,属主为root。
      chmod 640 /etc/logrotate.d/文件名
      chown root /etc/logrotate.d/文件名
      例如:
      chmod 640 /etc/logrotate.d/volcano
      chown root /etc/logrotate.d/volcano
    表1 MindCluster Volcano日志转储文件配置项

    配置项

    说明

    可选值

    daily

    日志转储频率。

    • daily:每日进行一次转储检查。
    • weekly:每周进行一次转储检查。
    • monthly:每月进行一次转储检查。
    • yearly:每年进行一次转储检查。

    rotate x

    日志文件删除之前转储的次数。

    x为备份次数。

    例如:

    • rotate 0:没有备份。
    • rotate 8:保留8次备份。

    size xx

    日志文件到达指定的大小时才转储。

    size单位可以指定:

    • byte(缺省)
    • K
    • M

    例如size 50M指日志文件达到50 MB时转储。

    说明:

    logrotate会根据配置的转储频率,定期检查日志文件大小,检查时大小超过size的文件才会触发转储。

    这意味着,logrotate并不会在日志文件达到大小限制时立刻将其转储。

    compress

    是否通过gzip压缩转储以后的日志。

    • compress:使用gzip压缩。
    • nocompress:不使用gzip压缩。

    notifempty

    空文件是否转储。

    • ifempty:空文件也转储。
    • notifempty:空文件不触发转储。

  5. (可选)在“volcano-v{version}.yaml”中,配置MindCluster Volcano所需的CPU和内存。CPU和内存推荐值可以参见开源Volcano官方文档的表2volcano-controller和volcano-scheduler的建议值。

    ...
    kind: Deployment
    ...
      labels:
        app: volcano-scheduler
    spec:
      replicas: 1
    ...
        spec:
    ...
              imagePullPolicy: "IfNotPresent"
              resources:
                requests:
                  memory: 4Gi
                  cpu: 5500m
                limits:
                  memory: 8Gi
                  cpu: 5500m
    ...
    kind: Deployment
    ...
      labels:
        app: volcano-controller
    spec:
    ...
        spec:
    ...
              resources:
                requests:
                  memory: 3Gi
                  cpu: 2000m
                limits:
                  memory: 3Gi
                  cpu: 2000m
    ...

  6. (可选)在“volcano-v{version}.yaml”中,配置MindCluster Volcano所使用的插件。请参见开源Volcano官方文档中表3Volcano高级配置参数说明和表4支持的Plugins列表的说明进行操作。

    ...
    data:
      volcano-scheduler.conf: |
        actions: "enqueue, allocate, backfill"
        tiers:
        - plugins:
          - name: priority
            enableNodeOrder: false
          - name: gang
            enableNodeOrder: false
          - name: conformance
            enableNodeOrder: false
          - name: volcano-npu_v6.0.RC2_linux-aarch64  # 其中v6.0.RC2为MindX DL的版本号,根据不同版本,该处编码不同
        - plugins:
          - name: drf
            enableNodeOrder: false
          - name: predicates
            enableNodeOrder: false
            arguments:
              predicate.GPUSharingEnable: false
              predicate.GPUNumberEnable: false
          - name: proportion
            enableNodeOrder: false
          - name: nodeorder
          - name: binpack
            enableNodeOrder: false
    ....

  7. (可选)在“volcano-v{version}.yaml”中,配置MindCluster Volcano使用的集群调度组件为用户提供的重调度时删除Pod的模式、虚拟化方式和交换机亲和性调度。

    ...
    data:
      volcano-scheduler.conf: |
    ...
        configurations:
          - name: init-params
            arguments: {"grace-over-time":"900","presetVirtualDevice":"true","nslb-version":"1.0","shared-tor-num":"2","useClusterInfoManager}
    ...
    表2 参数说明

    参数名称

    默认值

    参数说明

    grace-over-time

    900

    重调度优雅删除模式下删除Pod所需最大时间,单位为秒,取值范围2~3600。配置该字段表示使用重调度的优雅删除模式。优雅删除是指在重调度过程中,会等待Volcano执行相关善后工作,900秒后若Pod还未删除成功,再直接强制删除Pod,不做善后。

    presetVirtualDevice

    true

    采用的虚拟化方式。

    • true:静态虚拟化
    • false:动态虚拟化

    nslb-version

    1.0

    交换机亲和性调度的版本,可以取值为1.0和2.0。

    说明:
    • 交换机亲和性调度1.0版本支持Atlas 训练系列产品Atlas A2 训练系列产品;支持PyTorchMindSpore
    • 交换机亲和性调度2.0版本支持Atlas A2 训练系列产品;支持PyTorch框架。

    shared-tor-num

    2

    交换机亲和性调度2.0中单个任务可使用的最大共享交换机数量,可取值为1或2。仅在nslb-version取值为2.0时生效。

    交换机亲和性调度(1.0或2.0)说明可以参见基于节点的亲和性调度章节。

    useClusterInfoManager

    true

    MindCluster Volcano获取集群信息的方式。取值说明如下:

    • true:读取MindCluster ClusterD上报的ConfigMap
    • false:分别读取MindCluster Ascend Device PluginMindCluster NodeD上报的ConfigMap
    说明:

    默认使用读取MindCluster ClusterD组件上报的ConfigMap。后续版本将不支持读取MindCluster Ascend Device PluginMindCluster NodeD上报的ConfigMap

    • 更多关于开源MindCluster Volcano的配置,可以参见开源Volcano官方文档进行操作。
    • K8s支持使用nodeAffinity字段进行节点亲和性调度,该字段的详细说明请参见Kubernetes官方文档MindCluster Volcano也支持使用该字段,操作指导请参见调度配置章节。

  8. (可选)调度时间性能调优。支持MindCluster Volcano将单任务(训练的vcjob或acjob任务)的4000或5000个Pod调度到4000或5000个节点上的调度时间优化到5分钟左右,若用户想要使用该调度性能,需要在“volcano-v{version}.yaml”上做如下修改。

    • 若要达到5分钟左右的参考时间,需要保证CPU的频率至少为2.60GHz,APIServer时延不超过80毫秒。
    • 如果不使用K8s原生的nodeAffinity和podAntiAffinity进行调度,可以关闭nodeorder插件,进一步减少调度时间。
    data:
      volcano-scheduler.conf: |
    
    ...
          - name: proportion
            enableNodeOrder: false
          - name: nodeorder
            enableNodeOrder: false     # 可选,不使用nodeAffinity和podAntiAffinity调度时,可关闭nodeorder插件
    ...
          containers:
            - name: volcano-scheduler
              image: volcanosh/vc-scheduler:v1.7.0
              command: ["/bin/ash"]
              args: ["-c", "umask 027; GOMEMLIMIT=15000000000 GOGC=off /vc-scheduler      # 新增GOMEMLIMIT=15000000000和GOGC=off字段
                      --scheduler-conf=/volcano.scheduler/volcano-scheduler.conf
                      --plugins-dir=plugins
                      --logtostderr=false
                      --log_dir=/var/log/mindx-dl/volcano-scheduler
                      --log_file=/var/log/mindx-dl/volcano-scheduler/volcano-scheduler.log
                      -v=2 2>&1"]
              imagePullPolicy: "IfNotPresent"
              resources:
                requests:
                  memory: 10000Mi                                                                # 将4Gi修改为10000Mi
                  cpu: 5500m
                limits:
                  memory: 15000Mi                                                       # 将8Gi修改为15000Mi
                  cpu: 5500m
    ...

  9. 在管理节点的yaml所在路径,执行以下命令,启动MindCluster Volcano

    kubectl apply -f volcano-v{version}.yaml

    启动示例如下:

    namespace/volcano-system created
    namespace/volcano-monitoring created
    configmap/volcano-scheduler-configmap created
    serviceaccount/volcano-scheduler created
    clusterrole.rbac.authorization.K8s.io/volcano-scheduler created
    clusterrolebinding.rbac.authorization.K8s.io/volcano-scheduler-role created
    deployment.apps/volcano-scheduler created
    service/volcano-scheduler-service created
    serviceaccount/volcano-controllers created
    clusterrole.rbac.authorization.K8s.io/volcano-controllers created
    clusterrolebinding.rbac.authorization.K8s.io/volcano-controllers-role created
    deployment.apps/volcano-controllers created
    customresourcedefinition.apiextensions.K8s.io/jobs.batch.volcano.sh created
    customresourcedefinition.apiextensions.K8s.io/commands.bus.volcano.sh created
    customresourcedefinition.apiextensions.K8s.io/podgroups.scheduling.volcano.sh created
    customresourcedefinition.apiextensions.K8s.io/queues.scheduling.volcano.sh created
    customresourcedefinition.apiextensions.K8s.io/numatopologies.nodeinfo.volcano.sh created

  10. 执行以下命令,查看组件状态。

    kubectl get pod -n volcano-system
    回显示例如下,出现Running表示组件启动成功。
    NAME                                   READY   STATUS    RESTARTS   AGE
    volcano-controllers-5cf8d788d5-qdpzq   1/1     Running   0          1m
    volcano-scheduler-6cffd555c9-45k7c     1/1     Running   0          1m

参数说明

表3 volcano-scheduler启动参数

参数

类型

默认值

说明

--log-dir

string

日志目录,组件启动yaml中默认值为/var/log/mindx-dl/volcano-scheduler。

--log-file

string

日志文件名称,组件启动yaml中默认值为/var/log/mindx-dl/volcano-scheduler/volcano-scheduler.log。

说明:

转储后文件的命名格式为:volcano-scheduler.log-触发转储的时间.gz,如:volcano-scheduler.log-20230926.gz。

--scheduler-conf

string

/volcano.scheduler/volcano-scheduler.conf

调度组件配置文件的绝对路径。

--logtostderr

bool

false

日志是否打印到标准输出。

  • true:打印。
  • false:不打印。

-v

int

2

日志输出级别:

  • 1:error
  • 2:warning
  • 3:info
  • 4:debug

--plugins-dir

string

plugins

scheduler插件加载路径。

--version

bool

false

是否查询volcano-scheduler版本号。

  • true:查询。
  • false:不查询。
表4 volcano-controller启动参数

参数

类型

默认值

说明

--log-dir

string

日志目录,组件启动yaml中默认值为/var/log/mindx-dl/volcano-controller。

--log-file

string

日志文件名称,组件启动yaml中默认值为/var/log/mindx-dl/volcano-controller/volcano-controller.log。

说明:

转储后文件的命名格式为:volcano-controller.log-触发转储的时间.gz,如:volcano-controller.log-20230926.gz。

--logtostderr

bool

false

日志是否打印到标准输出。

  • true:打印。
  • false:不打印。

-v

int

4

日志输出级别:

  • 1:error
  • 2:warning
  • 3:info
  • 4:debug

--version

bool

false

volcano-controller二进制版本号。

MindCluster Volcano为开源软件,启动参数只罗列目前使用的常见参数,其他详细的参数请参见开源软件的说明。