本文主要为您介绍如何创建和使用带有 NPU 资源的 Kubernetes 集群。

前提条件

您需要开通容器服务、资源编排(ROS)服务和访问控制(RAM)服务。

说明 容器服务 Kubernetes 集群部署依赖阿里云资源编排 ROS 的应用部署能力,所以创建 Kubernetes 集群前,您需要开通 ROS。

背景信息

与大型算法模型中 CPU 相比,NPU 处理器最明显的优势是信息处理能力快。NPU 采用了“数据驱动并行计算”架构,颠覆了 CPU 所采用的传统冯·诺依曼计算机架构,这种数据流类型的处理器大大提升了计算能力与功耗的比率。NPU
特别适合处理视频、图像类的海量多媒体数据的场景,不仅速度比 CPU 要高出 100 ~ 1000 倍,同时功耗也远远低于 CPU。

您可以通过阿里云 Kubernetes 集群 + ALI NPU 运行机器学习,图像处理等高运算密度等任务,实现快速部署和弹性扩缩容等功能。

说明 如果想了解 ALI NPU 的相关信息,请参见 AliNPU Website。

本文将以创建 Kubernetes 集群时,添加 ecs.ebman1.26xlarge 实例为例说明如何使用 NPU。

创建集群过程中,容器服务会进行如下操作:

  • 创建 ECS,配置管理节点到其他节点的 SSH 的公钥登录,通过 CloudInit 安装配置 Kubernetes 集群。
  • 创建安全组,该安全组允许 VPC 入方向全部 ICMP 端口的访问。
  • 如果您不使用已有的 VPC 网络,会为您创建一个新的 VPC 及 VSwitch,同时为该 VSwitch 创建 SNAT。
  • 创建 VPC 路由规则。
  • 创建 NAT 网关及 EIP。
  • 创建 RAM 子账号和 AccessKey,该子账号拥有 ECS 的查询、实例创建和删除的权限,添加和删除云盘的权限,SLB 的全部权限,云监控的全部权限,VPC
    的全部权限,日志服务的全部权限,NAS 的全部权限。Kubernetes 集群会根据用户部署的配置相应的动态创建 SLB,云盘,VPC路由规则。
  • 创建内网 SLB,暴露 6443 端口。
  • 创建公网 SLB,暴露 6443、8443和 22 端口(如果您在创建集群的时候选择开放公网 SSH 登录,则会暴露 22 端口;如果您选择不开放公网 SSH 访问,则不会暴露
    22 端口)。

使用限制

  • 随集群一同创建的负载均衡实例只支持按量付费的方式。
  • Kubernetes 集群仅支持专有网络 VPC。
  • 每个账号默认可以创建的云资源有一定的配额,如果超过配额创建集群会失败。请在创建集群前确认您的配额。

    如果您需要提高配额,请提交工单申请。

    • 每个账号默认最多可以创建 5 个集群(所有地域下),每个集群中最多可以添加 40 个节点。如果您需要创建更多的集群或者节点,请提交工单申请。
      说明 Kubernetes 集群中,VPC 默认路由条目不超过48条,意味着 Kubernetes 集群使用 VPC 时,默认节点上限是 48 个,如果需要更大的节点数,需要您先对目标
      VPC 开工单,提高 VPC 路由条目,再对容器服务提交工单。

    • 每个账号默认最多可以创建 100 个安全组。
    • 每个账号默认最多可以创建 60 个按量付费的负载均衡实例。
    • 每个账号默认最多可以创建 20 个EIP。
  • ECS 实例使用限制:
    • 仅支持 CentOS 操作系统。
    • 支持创建按量付费和包年包月的 ECS 实例。
    说明 实例创建后,您可以通过 ECS 管理控制台将按量付费转预付费,请参见按量付费转包年包月。

创建 NPU 型 Kubernetes 集群

  1. 登录容器服务管理控制台。
  2. 在 Kubernetes 菜单下,单击左侧导航栏的集群 > 集群,单击页面右上角的创建 Kubernetes 集群
  3. 选择集群模板页面,选择异构计算专有集群页面,并单击创建,进入Kubernetes 专有版页面。
    本例中创建的是异构计算专有集群,您也可以在选择集群模板是选择异构计算托管托管集群并进行以下操作。选择集群模板

    说明 为了创建 NPU 集群,通常情况下,Worker 节点使用 NPU 类型的 ECS。集群其他参数配置,请参见创建 Kubernetes 集群。

  4. 设置 Worker 节点的配置信息。本例中将 Worker 节点作为 NPU 工作节点,选择 NPU 计算型实例规格 ecs.ebman1.26xlarge。
    • 若您选择新增实例,则需要选择 Worker 节点的系列和规格,以及需要创建的 Worker 节点的数量(本示例创建 2 个 NPU 节点,实例类型为 ecs.ebman1.26xlarge)。
      设置节点
    • 若您选择添加已有实例,则需要预先在此地域下创建 NPU 云服务器。请参见实例规格族。
  5. 完成其他配置后,单击创建集群,启动部署。
    集群创建成功后,单击左侧导航栏中的集群 > 节点,进入节点列表页面。

    选择所需的集群,选择创建集群时配置的 Worker 节点,单击操作列的更多 > 详情,查看该节点挂载的 NPU 设备。

配置私有镜像密钥

如果您需要使用阿里云提供的 NPU 类型的 Docker 镜像,可以联系与您对接的客户经理或销售人员,获取一个已授权的账号。下载 Docker 镜像并在 Kubernetes
集群中配置私有镜像密钥。

  1. 在 Kubernetes 菜单下,单击左侧导航栏的集群 > 集群,进入集群列表页面。
  2. 选择所需的集群并单击操作更多 > 通过 CloudShell 管理集群
    集群连接成功后,界面显示如下:显示结果
  3. 执行以下命令,创建一个 docker-registry 类型的 secret。
    kubectl create secret /
    docker-registry regsecret /
    --docker-server=registry.cn-shanghai.aliyuncs.com /
    --docker-username=<your_username>
    --docker-password=<your_password>
    说明

    • regsecret:指定密钥的键名称,可自行定义。
    • --docker-server:指定 Docker 仓库地址。
    • --docker-username:获取的账号。
    • --docker-password:获取的密码。

  4. 在 Pod 的配置文件中添加 secret,拉取NPU类型的私有镜像。
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-npu
    spec:
      containers:
      - name: <容器名称>
        image: registry.cn-shanghai.aliyuncs.com/hgai/<NPU类型的docker镜像>
      imagePullSecrets:
      - name: <secret名称>
    说明

    • imagePullSecrets 是声明拉取镜像时需要指定密钥。
    • regsecret 必须和步骤3生成密钥的键名一致。
    • image 中的 Docker 仓库名称必须和 --docker-server 中的 Docker 仓库名一致。

使用 NPU 资源

如果某一个 Pod 需要使用 NPU 资源,需要在resources.limits定义aliyun.com/npu的值。

apiVersion: v1
kind: Pod
metadata:
  name: <pod名称>
spec:
  containers:
    - name: <容器名称>
      image: <镜像名称>
      resources:
        limits:
          aliyun.com/npu: <请求npu资源数>

运行 TensorFLow 的 NPU 实验环境

您可以在集群中使用 NPU 资源完成模型训练。本例中,将会启动一个使用 NPU 资源的 Pod 进行模型训练。

  1. 连接集群,请参见在CloudShell上通过kubectl管理Kubernetes集群 。
    在 CloudShell 界面执行以下操作。

    cat > test-pod.yaml <<- EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-npu-pod
    spec:
      restartPolicy: Never
      imagePullSecrets:
        - name: regsecret
      containers:
        - name: resnet50-npu
          image: registry.cn-shanghai.aliyuncs.com/hgai/tensorflow:v1_resnet50-tensorflow1.9.0-toolchain1.0.2-centos7.6
          resources:
            limits:
              aliyun.com/npu: 1 # requesting  NPUs
    EOF

  2. 执行如下命令,创建 Pod。
    kubectl apply -f test-pod.yaml

  3. 执行以下命令,查看 Pod 的状态。
    kubectl get po test-npu-pod
    说明 如果Pod 为 Error 状态,请执行kubectl logs test-npu-pod命令监听 Pod 日志,并排查修改。

执行结果

等待一段时间后,您可以通过执行如下命令查看 Pod 的状态。

kubectl get po test-npu-pod

如果查看到 Pod 的状态为 Completed,再执行如下命令查看日志。

kubectl logs test-npu-pod

此时看到日志显示结果如下,表示训练任务完成。

2019-10-30 12:10:50.389452: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 AVX512F FMA
100%|##########| 98/98 [00:26<00:00,  3.67it/s]
resnet_v1_50, result =  {'top_5': 0.9244321584701538, 'top_1': 0.7480267286300659}