在 CloudShell 中开发部署人工智能计算

首先,可以试想一下,要在云上部署一个人工智能训练任务,需要做哪些工作?

在 CloudShell 中开发部署人工智能计算

大体的部署架构如上图所示。首先训练任务需要一个 GPU 的集群,里面需要配置智能训练所需的环境,还需要挂载 CPFS/NAS 这样的存储资源,来存储和共享训练数据。整个过程包括:购买 GPU 实例、购买挂载存储资源、配置实例环境、配置网络环、开发上传训练代码境等等。整个过程费时费力。

工欲善其事必先利其器,在 Cloud Shell 中使用 Jupyter Notebook + FastGPU,可以省时省力的帮助开发者完成开发和部署的工作。

FastGPU

针对人工智能训练的场景,阿里云提供了 FastGPU 工具,是一套构建在阿里云上的人工智能训练的部署工具,提供便捷的接口和自动化工具实现人工智能训练/推理计算在阿里云 IAAS 资源上的快速部署.它包含两套组件:

  • ncluster 运行时组件,它是个 python 库,提供便捷的 API 将线下的人工智能训练/推理脚本快速的部署在阿里云IAAS资源上进行计算
  • ecluster 命令行组件,提供便捷的命令行工具用于管理阿里云上人工智能计算的运行状态和集群的生命周期。

在 CloudShell 中开发部署人工智能计算

使用 FastGPU 进行人工智能训练,用户的起点(source)为数据和训练代码,FastGPU 组件将帮助用户自动完成中间训练过程,包括计算/存储/可视化资源的生命周期的管理等等,用户最终获取训练完成后的模型/日志等(destination)。

可以看到人工智能训练的全部流程(购买实例——启动实例——构建 gpu 环境——部署项目代码——启动训练——运行推理),通过 FastGPU 一个脚本就可以一键完成人工智能训练的整个个过程。整个脚本的编写也十分简单,通过 ncluster 的 make_job,可以创建所需要的资源,还可以方便的定义所需资源数量、实例类型、实例镜像等等。接着通过 upload 方法,可以将本地的文件上传到实例上去,最后通过 run 方法,可以在实例上执行任意命令。比如启动 training,启动 inferrence 等等。

最后通过 FastGPU 提供的第二个组件,ecluster 命令行,来管理任务和资源的运行状态和生命周期。例如启停任务,创建销毁资源等等。比如下图通过 ecluster ls 来展示所有训练的实例资源。

在 CloudShell 中开发部署人工智能计算

CloudShell

Cloud Shell 是阿里云提供的云命令行产品,它是免费的网页版命令行工具,允许用户使用浏览器启动命令行进而管理阿里云资源。在启动时会自动为用户分配一台 Linux 管理机,并预装 Aliyun CLI、Terraform、kubectl、fastgoup 等多种云管理工具。

针对人工智能训练的场景,使用 Cloud Shell 可以快速的完成云上的模型训练、资源管理、应用部署等工作,Cloud Shell 内置了 FastGPU,也是目前 FastGPU 唯一的使用渠道,我们可以通过 FastGPU 来购买配置 GPU 实例,完成训练模型的部署和运行。当然 Cloud shell 还具备很多便捷的特性,首先它是完全免费的,每次使用会自动创建一台 Linux 虚拟机,通过浏览器可以随时随地使用,同时支持绑定 NAS 等存储空间,保证个人文件的永久存储,同时内置了众多工具和开发环境,像数据库工具 Mysql Client、容器群里工具 Kubectl、Heml,编排工具 Terraform、Ansible、代码管理工具 Git 等等,开发环境包括 Node、Java、Go、Python,常用的基本都已经涵盖。最重要的是会保障使用的安全,每个用户分配的虚拟机都是完全独立、相互隔离的。

Jupyter Notebook

Jupyter Notebook 是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果等。使用 Jupyter Notebook 可以方便的一站式开发、部署和运行我们的训练任务。

由于 Jupyter Notebook 是基于网页使用的,因此 Cloud Shell 除了内置 Jupyter Notebook 外,也提供了网页预览的功能,我们可以在 Cloud Shell 直接使用。

首先启动 Jupyter Notebook

jupyter notebook --ip=0.0.0.0 --port=65000 --no-browser --NotebookApp.allow_origin=*

目前 Cloud Shell 只允许在固定几个端口上进行网页预览,因此 Jupyter Notebook 需要启动到支持预览的几个端口上。然后在 Cloud Shell 右上角,打开对应端口的网页预览。

在 CloudShell 中开发部署人工智能计算

在 CloudShell 中开发部署人工智能计算

实操示例

我们来看一个真实的使用 FastGPU 部署人工智能训练的代码示例

#!/usr/bin/env python

import argparse
import ncluster
import os
import time
from ncluster import ncluster_globals

# setting parameters
INSTANCE_TYPE = 'ecs.gn6v-c8g1.2xlarge'
NUM_GPUS = 1

ncluster.set_backend('aliyun')
parser = argparse.ArgumentParser()
parser.add_argument('--name', type=str, default='fastgpu-gtc-demo',
                    help="name of the current run, used for machine naming and tensorboard visualization")
parser.add_argument('--machines', type=int, default=1,
                    help="how many machines to use")
args = parser.parse_args()

def main():
  print('start job ...')
  start_time = time.time()

  # 1. create infrastructure
  supported_regions = ['cn-huhehaote', 'cn-shanghai', 'cn-zhangjiakou', 'cn-hangzhou', 'cn-beijing']
  assert ncluster.get_region() in supported_regions, f"required AMI {IMAGE_NAME} has only been made available in regions {supported_regions}, but your current region is {ncluster.get_region()} (set $ALYUN_DEFAULT_REGION)"
  
  ncluster_globals.set_should_disable_nas(True)

  job = ncluster.make_job(name=args.name,
                          run_name=f"{args.name}-{args.machines}",
                          num_tasks=args.machines,
                          instance_type=INSTANCE_TYPE,
                          disable_nas=True,
                          spot=True,
                          install_script='') 

  init_ncluster = time.time()
  print('init ncluster:', init_ncluster - start_time)

  # 2. upload code
  job.upload('GTC')
  job.run('cd GTC && conda activate torch_1.3_cu10.0_py36') 
  upload_data = time.time()
  print('upload_data time:', upload_data - init_ncluster)

  # 3. run the training job
  job.tasks[0].run('conda activate torch_1.3_cu10.0_py36')
  job.tasks[0].run('./train.sh 2>&1 | tee logs.log', non_blocking=False)
  train_time = time.time()
  print('training time:', train_time - unzip_time)

  # 4. run the inference job
  job.tasks[0].run('python inference.py 2>&1 | tee logs.inference.log', non_blocking=False)
  print('inference time:', time.time() - train_time)

  eclapse_time = time.time() - start_time
  print(f'training and inference deploy time is: {eclapse_time} s.')

  # 5. stop the instance (optional)
  # job.stop()

if __name__ == '__main__':
  main()

示例中首先定义了一些参数变量,包括实例类型,这里采用的是采用单机单卡 V100 的实例,配置了实例名称、实例数量,这里简单起见,就只生产 1 台机器。

然后通过 make_job 来创建基础设施,示例中没有设置 image_name 镜像名称,会使用默认镜像,是 CentOS 的阿里 AI 云加速镜像,里面集成了 TensorFlow/pytorch 等各种框架。然后关闭了 NAS 绑定,同时通过 Spot 来表示生产一个抢占式实例。

这里通过 run 方法,可以在生产出来的实例上执行命令。接着通过 upload 方法上传训练脚本的文件夹(示例中的训练脚本放到了 GTC 文件夹下)。upload 方法默认会将文件上传到实例的根目录下。然后开始 run training,先激活 python 特定深度学习环境。然后调用训练脚本:train.py。训练完成后,执行推理脚本。

最后,可以通过 stop 方法来停止任务,这时 GPU 实例也会被停止,停止实例本身不会产生费用了。

这样一个部署和运行的脚本就写好了。最后执行该脚本。FastGPU 会自动的检测有效可用的可用区,自动创建 VPC、虚拟机、安全组以及 ECS,并自动开始训练等等。

完整的操作示例,您可以参考云上极速部署手势识别训练任务和场景应用的直播视频。

上一篇:Effective Objective-C 2.0 Tips 总结 Chapter 1 & Chapter 2


下一篇:Sass和compass 安装 和配合grunt实时显示 [Sass和compass学习笔记]