跳转至

利用云端计算资源

有时候你需要处理大量的数据,单机的计算资源无法满足这个需求。

抑或某个机器学习的任务需要特殊计算资源例如GPU来加速运算。但是本机没有这个计算资源。

或者你需要同时运行大量的相似任务,例如在某一个模型训练过程中尝试不同的参数组合。

在以上情况下,将本地的计算任务运行在云端是一个好的解决方案。ConvectHub也支持这些功能。

使用Dask gateway

Dask 是一个轻量化的并行计算框架。本地的代码只需经过很少的改动就可以运行在分布式的环境中。is lightweight distributed computing framework written in python and allow running python code utilizing multiple machines with/without minimal code change.

ConvectHub支持用户按需启动dask集群来加速运算。

如需启动一个集群,在notebook中运行如下代码

from dask_gateway import Gateway
gateway = Gateway()

options = gateway.cluster_options()
options

Untitled

完成启动参数配置后,用户可以启动一个计算集群。

Untitled

cluster = gateway.new_cluster(options)
cluster

用户可以通过可视化界面来动态缩放worker的数量。

cluster.scale(1)

启动完集群后,可以从本机连接到远程的计算集群

client = cluster.get_client()

最后,我们可以试着提交一些计算任务

import dask.array as da
x = da.random.random((10000, 10000), chunks=(1000, 1000))
y = x + x.T
z = y[::2, 5000:].mean(axis=1)
z.compute()

如果有结果返回则证明集群工作正常。

如需学习如何使用dask加速运算,参考文档doc

远程执行一个notebook任务

用户可以将一个notebook作为远程计算任务提交。这个功能在如下情况下都很有用:

  1. 用户想要同时运行大量的相似任务,例如机器学习训练中不同的参数组合。在单机运行这些任务实在过于费时。
  2. 用户想要使用远程的计算资源。例如,使用比本地更多的CPU或者内存来加速运算。

如需提交任务,点击Run as pipeline

Untitled

选择容器运行的image。作为一个最佳实践,应尽量保持本地和远程执行notebook的环境保持一致。同时可以申请运行任务的资源例如CPU内存GPU的数量。

Untitled

成功提交之后,可以点击连接查看任务执行的详情。

Untitled

Untitled

通过详情页的连接,可以直接下载执行完成之后的notebook文件。

Untitled

Untitled

利用多个notebook创建管道任务

你可以利用多个notebook文件来创建一个可以重复运行的管道任务。这个功能对将一个复杂任务分解为若干小的步骤很有用。例如,在一个机器学习任务中,大致包含数据处理,特征工程,模型训练。模型评估这几个小的任务。在这种情况下,可以针对每个小的任务撰写一个专门的notebook。这样可以有更清晰的代码结构和管理。

如需创建一个新的管道任务,在启动器页面上选择"Generic pipeline editor",随后将文件管理器内的notebook文件拖拽到编辑区。可以将不同的notebook文件连起来来创建依赖关系。

右键某一个节点,选择详情编辑,可以对这个notebook的运行环境,资源需求,参数配置进行编辑。这个功能和上述的远程执行一个notebook任务是一致的。

Untitled

编辑完成之后,单机"Run pipeline"就会将这个管道任务提交。

Untitled

提交成功之后,可以通过链接查看具体的执行情况。也可以下载生成的notebook文件。

Untitled

在管道任务中使用预制组件

在创建管道任务时,加入一些针对特定任务的预制组件对增加开发效率是很有用的。例如,一个可以接受销量作为输入,输出一个时序预测模型来预测未来销量的与之组件,对加快开发一个需要预测功能的数据科学解决方案是有益的。

ConvectHub支持导入任意kubeflow pipeline components,作为预制组件。

导入组件

如需导入组件,首先需要找到组件的YAML文件的URL,例如https://raw.githubusercontent.com/kubeflow/pipelines/master/components/contrib/XGBoost/Train_and_cross-validate_regression/from_CSV/component.yaml是一个利用xgboost来做机器学习的组件。

选择"New URL Component Catalog",然后在Configuration板块下添加这个URL

Untitled

使用预制组件

在完成导入之后,创建一个新的管道任务

Untitled

在左边的工具栏上,可以看到刚才导入的预制组件,我们可以将它们拖拽到编辑区。右键详情编辑,可以设置组件节点的运行环境,资源和参数。

Untitled

我们可以将这些组件和Notebook节点组合使用,从而生成更加复杂的管道任务。

分布式GPU训练

当我们训练大型机器学习模型时,使用多块GPU是分厂常见的。我们支持使用Kubeflow Training Operators,来完成分布式GPU训练。

提交一个分布式任务一般分为三个步骤:1. 将分布式训练代码打包为一个docker镜像;2. 通过yaml文件描述训练所需要的环境,例如GPU的数量,计算资源的需求等;3. 提交并且等待任务完成。

例如,如需分布式训练一个MNIST的分类器,首先我们将训练所需的脚本代码通过docker打包。

FROM pytorch/pytorch:1.0-cuda10.0-cudnn7-runtime

RUN pip install tensorboardX==1.6.0
RUN mkdir -p /opt/mnist

WORKDIR /opt/mnist/src
ADD mnist.py /opt/mnist/src/mnist.py

RUN  chgrp -R 0 /opt/mnist \
  && chmod -R g+rwX /opt/mnist

ENTRYPOINT ["python", "/opt/mnist/src/mnist.py"]

随后将该镜像推送到registry。

docker build . -t mnist-simple:latest


docker tag mnist-simple:latest <YOUR_REPO>/mnist-simple:latest
docker push <YOUR_REPO>/mnist-simple:latest

完成后,我们定义如下的一个任务配置 job.yaml

apiVersion: "kubeflow.org/v1"
kind: "PyTorchJob"
metadata:
  name: "pytorch-dist-mnist-nccl"
spec:
  pytorchReplicaSpecs:
    Master:
      replicas: 1
      restartPolicy: OnFailure
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          containers:
            - name: pytorch
        image: <YOUR_REPO>/mnist-simple:latest
              args: ["--backend", "nccl"]
              resources: 
                limits:
                  nvidia.com/gpu: 1
    Worker:
      replicas: 1
      restartPolicy: OnFailure
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          containers: 
            - name: pytorch
              image: <YOUR_REPO>/mnist-simple:latest
              args: ["--backend", "nccl"]
              resources: 
                limits:
                  nvidia.com/gpu: 1

我们在如上的配置中声明使用一个master和一个worker节点,它们各自有一个GPU。 随后通过命令行提交任务

kubectl create -f job.yaml

可以通过如下的命令来监视提交任务的状态

kubectl get -o yaml pytorchjobs pytorch-simple

欲了解更多使用Training Operators Doc的细节,我们推荐参考官方文档。