凯发k8国际娱乐官网入口-k8凯发> 云容器引擎 cce> > > > 使用kubeflow和volcano实现典型ai训练任务
更新时间:2023-09-27 gmt 08:00

使用kubeflow和volcano实现典型ai训练任务-凯发k8国际娱乐官网入口

kubernetes已经成为云原生应用编排、管理的事实标准, 越来越多的应用选择向kubernetes迁移。人工智能和机器学习领域天然的包含大量的计算密集型任务,开发者非常愿意基于kubernetes构建ai平台,充分利用kubernetes提供的资源管理、应用编排、运维监控能力。

kubernetes存在的问题

kubeflow在调度环境使用的是kubernetes的默认调度器。而kubernetes默认调度器最初主要是为长期运行的服务设计的,对于ai、大数据等批量和弹性调度方面还有很多的不足。主要存在以下问题:

资源争抢问题

tensorflow的作业包含ps和worker两种不同的角色,这两种角色的pod要配合起来完成整个作业,如果只是运行一种角色pod,整个作业是无法正常执行的,而默认调度器对于pod调度是逐个进行的,对于kubeflow作业tfjob的ps和worker是不感知的。在集群高负载(资源不足)的情况下,会出现多个作业各自分配到部分资源运行一部分pod,而又无法正执行完成的状况,从而造成资源浪费。以下图为例,集群有4块gpu卡,tfjob1和tfjob2作业各自有4个worker,tfjob1和tfjob2各自分配到2个gpu。但是tfjob1和tfjob2均需要4块gpu卡才能运行起来。这样tfjob1和tfjob2处于互相等待对方释放资源,这种死锁情况造成了gpu资源的浪费。

亲和调度问题

分布式训练中,ps和worker存在很频繁的数据交互,所以ps和worker之间的带宽直接影响了训练的效率。 kubernetes默认调度器并不考虑ps和worker的这种逻辑关系,ps和worker是被随机调度的。如下图所示,2个tfjob(1个ps 2 worker),使用默认调度器,有可能会出现(a)、(b)、(c)三种情况的任意一种情况,(c)才是最想要的调度结果。因为在(c)中,ps和worker可以利用本机网络提供传输效率,缩短训练时间。

volcano批量调度系统:加速ai计算的利器

volcano是一款构建于kubernetes之上的增强型高性能计算任务批量处理系统。作为一个面向高性能计算场景的平台,它弥补了kubernetes在机器学习、深度学习、hpc、大数据计算等场景下的基本能力缺失,其中包括gang-schedule的调度能力、计算任务队列管理、task-topology和gpu亲和性调度。另外,volcano在原生kubernetes能力基础上对计算任务的批量创建及生命周期管理、fair-share、binpack调度等方面做了增强。volcano充分解决了上文提到的kubeflow分布式训练面临的问题。

volcano更多信息请参见:。

volcano在华为云的应用

kubeflow和volcano两个开源项目的结合充分简化和加速了kubernetes上ai计算进程。当前已经成为越来越多用户的最佳选择,应用于生产环境。volcano目前已经应用于华为云cce、cci产品以及容器批量计算凯发k8国际娱乐官网入口的解决方案。未来volcano会持续迭代演进,优化算法、增强调度能力如智能调度的支持,在推理场景增加gpu share等特性的支持,进一步提升kubeflow批量训练和推理的效率。

实现典型分布式ai训练任务

下面将展示如何基于kubeflow和volcano,并使用mnist数据集轻松的完成数字图像分类模型的分布式训练。

  1. 登录cce控制台,单击集群名称进入一个集群。
  2. 在cce集群上部署volcano环境。

    单击左侧栏目树中的“插件管理”,单击volcano插件下方的“安装”,在安装插件页面中选择插件的规格配置,并单击“安装”

  3. 部署mnist示例。
    1. 下载kubeflow/examples到本地并根据环境选择指南,命令如下:
      yum install git
      git clone https://github.com/kubeflow/examples.git
    2. 安装python3。
      wget https://www.python.org/ftp/python/3.6.8/python-3.6.8.tgz
      tar -zxvf python-3.6.8.tgz
      cd python-3.6.8 ./configure
      make make install

      安装完成后执行如下命令检查是否安装成功

      python3 -v 
      pip3 -v
    3. 安装jupyter notebook并启动,命令如下:
      pip3 install jupyter notebook
      jupyter notebook --allow-root
    4. putty设置tunnel,远程连接notebook。
    5. 连接成功后浏览器输入localhost:8000,登录notebook。

    6. 根据jupyter的指引,创建分布式训练作业。通过简单的设置schedulername字段的值为“volcano”,启用volcano调度器(以下加粗字体部分):
      kind: tfjob
      metadata:
        name: {train_name}  
      spec:
        schedulername: volcano
        tfreplicaspecs:
          ps:
            replicas: {num_ps}
            template:
              metadata:
                annotations:
                  sidecar.istio.io/inject: "false"
              spec:
                serviceaccount: default-editor
                containers:
                - name: tensorflow
                  command:
                  ...
                  env:
                  ...
                  image: {image}
                  workingdir: /opt
                restartpolicy: onfailure
          worker:
            replicas: 1
            template:
              metadata:
                annotations:
                  sidecar.istio.io/inject: "false"
              spec:
                serviceaccount: default-editor
                containers:
                - name: tensorflow
                  command:
                  ...
                  env:
                  ...
                  image: {image}
                  workingdir: /opt
                restartpolicy: onfailure
  4. 提交作业,开始训练。
    kubectl apply -f mnist.yaml

    等待训练作业完成,通过kubeflow的ui可以查询训练结果信息。至此就完成了一次简单的分布式训练任务。kubeflow的借助tfjob简化了作业的配置。volcano通过简单的增加一行配置就可以让用户启动组调度、task-topology等功能来解决死锁、亲和性等问题,在大规模分布式训练情况下,可以有效的缩短整体训练时间。

分享:
网站地图