開發與維運

在 CloudShell 中開發部署人工智能計算

首先,可以試想一下,要在雲上部署一個人工智能訓練任務,需要做哪些工作?

大體的部署架構如上圖所示。首先訓練任務需要一個 GPU 的集群,裡面需要配置智能訓練所需的環境,還需要掛載 CPFS/NAS 這樣的存儲資源,來存儲和共享訓練數據。整個過程包括:購買 GPU 實例、購買掛載存儲資源、配置實例環境、配置網絡環、開發上傳訓練代碼境等等。整個過程費時費力。

工慾善其事必先利其器,在 Cloud Shell 中使用 Jupyter Notebook + FastGPU,可以省時省力的幫助開發者完成開發和部署的工作。

FastGPU

針對人工智能訓練的場景,阿里雲提供了 FastGPU 工具,是一套構建在阿里雲上的人工智能訓練的部署工具,提供便捷的接口和自動化工具實現人工智能訓練/推理計算在阿里雲 IAAS 資源上的快速部署.它包含兩套組件:

  • ncluster 運行時組件,它是個 python 庫,提供便捷的 API 將線下的人工智能訓練/推理腳本快速的部署在阿里雲IAAS資源上進行計算
  • ecluster 命令行組件,提供便捷的命令行工具用於管理阿里雲上人工智能計算的運行狀態和集群的生命週期。

使用 FastGPU 進行人工智能訓練,用戶的起點(source)為數據和訓練代碼,FastGPU 組件將幫助用戶自動完成中間訓練過程,包括計算/存儲/可視化資源的生命週期的管理等等,用戶最終獲取訓練完成後的模型/日誌等(destination)。

可以看到人工智能訓練的全部流程(購買實例——啟動實例——構建 gpu 環境——部署項目代碼——啟動訓練——運行推理),通過 FastGPU 一個腳本就可以一鍵完成人工智能訓練的整個個過程。整個腳本的編寫也十分簡單,通過 ncluster 的 make_job,可以創建所需要的資源,還可以方便的定義所需資源數量、實例類型、實例鏡像等等。接著通過 upload 方法,可以將本地的文件上傳到實例上去,最後通過 run 方法,可以在實例上執行任意命令。比如啟動 training,啟動 inferrence 等等。

最後通過 FastGPU 提供的第二個組件,ecluster 命令行,來管理任務和資源的運行狀態和生命週期。例如啟停任務,創建銷燬資源等等。比如下圖通過 ecluster ls 來展示所有訓練的實例資源。

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 右上角,打開對應端口的網頁預覽。

實操示例

我們來看一個真實的使用 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,並自動開始訓練等等。

完整的操作示例,您可以參考雲上極速部署手勢識別訓練任務和場景應用的直播視頻。

Leave a Reply

Your email address will not be published. Required fields are marked *