一键训练大模型及部署GPU共享推理服务

更新时间: 2023-12-26 16:30:33

一键部署

80

https://www.aliyun.com/solution/tech-solution/one_gpu

方案概览

大模型训练和推理是机器学习和深度学习领域的重要应用,但企业和个人往往面临着GPU管理复杂、资源利用率低,以及AI作业全生命周期管理中工程效率低下等挑战。本方案通过创建ACK集群Pro版,使用云原生AI套件提交模型微调训练任务与部署GPU共享推理服务。适用于机器学习和深度学习任务中的以下场景:

  • 模型训练:基于Kubernetes集群微调开源模型,可以屏蔽底层资源和环境的复杂度,快速配置训练数据、提交训练任务,并自动运行和保存训练结果。

  • 模型推理:基于Kubernetes集群部署推理服务,可以屏蔽底层资源和环境的复杂度,快速将微调后的模型部署成推理服务,将模型应用到实际业务场景中。

  • AI作业生命周期管理:命令行工具Arena实现AI作业生命周期管理,包括模型训练、模型评测、模型推理等环节。Arena可以完全屏蔽底层资源和环境管理、任务调度、GPU分配和监控的复杂性,兼容主流AI框架和工具,例如Tensorflow,还提供多种语言SDK,便于您二次开发。

  • GPU共享推理:支持GPU共享调度能力和显存隔离能力,可将多个推理服务部署在同一块GPU卡上,提高GPU的利用率的同时也能保证推理服务的稳定运行。

方案架构

方案提供的默认设置完成部署后在阿里云上搭建的网站运行环境如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。

image.png

本方案的技术架构包括以下基础设施和云服务:

  • 1个地域:ACK集群、云原生AI套件、文件存储NAS均部署在同一地域下。

  • 1个专有网络VPC:为ACK、NAS、云原生AI套件等云资源形成云上私有网络。

  • 1个ACK集群Pro版:简单、低成本、高可用的Kubernetes集群,支持应用管理,无需您管理控制面板。

  • 云原生AI套件容器服务 Kubernetes 版提供的云原生AI技术和产品方案,以Kubernetes容器服务为底座,支持大模型训练及GPU共享推理服务部署。

  • 1个NAS实例:可共享访问,弹性扩展,高可靠,高性能的分布式文件系统,支持共享访问。

部署准备

10

开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值

    • 本方案的云资源支持按量付费,且默认设置均采用按量付费引导操作。请确保您的账户余额大于等于100元。

    • 完成本方案的部署及体验,预计产生费用约为12~16元(假设您配置ACK集群、云原生AI套件和NAS实例时选择本文指导的规格资源,且资源运行时间不超过1小时。实际情况可能会因您操作过程中使用的资源规格和流量差异,而导致费用有所变化,请以控制台显示的实际报价以及最终账单为准)。

      产品

      费用来源

      规格

      预估费用参考

      容器服务 Kubernetes 版

      CLB Ingress费用

      标准型I(slb.s2.small)

      实例费用:0.34/小时

      流量费用:0.8/GB

      CLB API Server费用

      标准型I(slb.s1.small)

      0.1元/时

      NAT费用

      公网NAT网关

      • 实例费:0.195元/时

      • 容量单位CU费:0.195元/CU

      EIP费用

      不涉及

      • EIP配置费:0.04元/小时

      • 流量费用:0.8元/GB

      ECS费用

      ecs.gn7i-c16g1.4xlarge、ecs.gn7i-c8g1.2xlarge或者ecs.gn7i-c32g1.8xlarge

      本方案ROS资源栈的费用明细显示三台不同规格ECS实例的总价。但本方案仅需一台ECS实例,创建时系统会根据可用区的库存规格选择创建一台。

      不同规格对应价格分为别10.345元/小时、9.785元/小时、13.56元/小时。具体价格以实际出账为准。

      集群管理费用

      不涉及

      0.64元/小时

      弹性公网 IP

      EIP费用

      不涉及

      EIP配置费:0.02元/小时

      流量费用:0.8元/GB

      文件存储 NAS

      NAS费用

      通用型NAS

      存储容量费用:0.35元/GB/月

      按量费用:11.12~14.895元/时

      CU容量费用产品:1个

      流量费用产品:3个

  3. 阿里云账号拥有操作资源的最高权限,从云资源安全角度考虑,建议您创建RAM用户。RAM用户需要获得相关云服务的访问权限才能完成方案部署,详情如下:

    1. 访问RAM控制台-用户页面,单击创建用户,填写相关信息,勾选控制台访问OpenAPI 调用访问,自定义密码并选择无需重置密码,创建一个RAM用户。

    2. 在RAM用户列表的操作列,单击目标RAM用户对应的添加权限。在添加权限面板,在选择权限策略的系统策略区域,搜索并新增如下权限,然后单击确定

      涉及的云服务:资源编排 ROS、容器服务 Kubernetes 版、专有网络 VPC、云服务器 ECS、访问控制 RAM、费用中心 BSS、文件存储 NAS、弹性公网 IP、NAT 网关、Cloud Shell。

      每次支持最多绑定5条策略,请分多次操作添加如下权限。

      云服务

      需要的权限

      描述

      资源编排 ROS

      AliyunROSFullAccess

      管理资源编排服务 ROS的权限。

      容器服务 Kubernetes 版

      AliyunCSFullAccess

      首次登录容器服务 Kubernetes 版时,需要为服务账号授予的系统默认角色。

      专有网络 VPC

      AliyunVPCFullAccess

      管理专有网络 VPC的权限。

      云服务器 ECS

      AliyunECSFullAccess

      管理云服务器服务 ECS的权限。

      访问控制 RAM

      AliyunRAMFullAccess

      管理访问控制 RAM的权限,即管理用户以及授权的权限。

      费用中心 BSS

      AliyunBSSReadOnlyAccess

      只读访问费用中心 BSS的权限。

      文件存储 NAS

      AliyunNASFullAccess

      管理文件存储 NAS的权限。

      弹性公网 IP

      AliyunEIPFullAccess

      管理弹性公网IP(EIP)的权限。

      NAT 网关

      AliyunNATGatewayFullAccess

      管理NAT 网关(NAT Gateway)的权限。

      弹性伸缩服务 ESS

      AliyunESSFullAccess

      管理弹性伸缩服务(ESS)的权限

      Cloud Shell

      AliyunCloudShellFullAccess

      管理云命令行(Cloud Shell)的权限。

      创建RAM用户后,您可以使用RAM用户登录阿里云控制台,开始本方案的部署和体验。

      RAM用户的使用请参见创建RAM用户创建自定义权限策略为RAM用户授权

    3. 单击云资源访问权限,然后单击同意授权

      此页权限为可供容器服务 ACK使用的角色。授权后,ACK拥有对您云资源相应的访问权限。

一键部署

10

您可以通过下方提供的ROS一键部署链接,来自动化地完成以下资源的创建和配置。部署完成后,您可以参见教程实现并体验如何训练大模型以及部署GPU共享推理服务。

  • 创建一个名为ai-test的ACK集群Pro版

  • 创建一个容量型NAS实例

ROS部署前置资源

  1. 单击一键部署前往ROS控制台,系统自动打开使用新资源创建资源栈的面板。在页面最上方选择部署地域,例如华东1(杭州),然后设置配置项,单击创建

    说明

    因资源量有限,可能会出现所选地域下无可选可用区的情况,您可以切换部署地域如华北2(北京)、西南1(成都)继续尝试。

    配置项

    说明

    示例

    资源栈名称

    支持自定义。

    stack_2023-06-12_cBesTX8FB

    集群名称

    支持自定义。不能与现有ACK集群重名。

    ai-test

    可用区

    选择集群可用区。本方案使用一台指定规格的ECS实例,包括ecs.gn7i-c16g1.4xlarge、ecs.gn7i-c8g1.2xlarge和ecs.gn7i-c32g1.8xlarge。如果当前可用区为空,请切换地域重新选择。

    可用区K

    设置节点登录密码

    设置节点登录密码。

    自行设置

    NAS 可用区

    选择NAS可用区。

    可用区E

  2. 在页面右上角,打开自动刷新开关,每隔5秒自动刷新一次,观察资源创建情况。

    资源栈信息页签,显示状态创建成功,表示快速创建成功。

    若在资源栈信息页签,显示状态不为创建成功,表示快速创建不成功。可以根据界面提示单击创建一键诊断,查看详细信息。

    image.png

安装云原生AI套件

5

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群ai-test,然后在左侧导航栏,选择应用>云原生AI套件

  3. 云原生AI套件页面,单击一键部署

  4. 在部署页面,参考下图所示完成设置。然后单击部署云原生AI套件

    image.png

配置NAS共享存储并下载数据

20

1. 查找NAS实例的挂载点

  1. 登录文件存储NAS控制台,在左侧导航栏选择文件系统 > 文件系统列表,在页面顶部选择NAS实例所在地域华东1(杭州)。

  2. 文件系统列表页面,找到系统自动ROS自动创建的NAS实例,即在文件系统 ID列包含ack-ai-nas的NAS文件系统。

    image.png

  3. 单击目标文件系统ID进入文件详情页面,单击挂载使用,在挂载点地址挂载命令列,复制并记录此处的值供后续步骤使用。

    image.png

2. 配置目标ai-test集群的存储卷PV和存储声明PVC

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群ai-test,然后在左侧导航栏,选择存储 > 存储卷

  3. 存储卷页面右上方,单击创建

  4. 创建存储卷对话框中,参考如下图示进行参数配置,选择挂载点域名为您上一步查询的挂载点地址,然后单击创建,创建名为training-data的存储卷。

    image.png

  5. 在左侧导航栏,选择存储 > 存储声明,在存储声明页面右上方,单击创建,在创建存储声明对话框中,参考如下图示进行参数配置,然后单击创建,创建名为training-data的存储声明。

    image.png

3. 下载数据到NAS中

  1. 在左侧导航栏,选择节点管理 > 节点,单击节点名称进入节点的ECS实例详情页面。记录此处节点的弹性公网IP,例如121.41.XX.XX

  2. 在控制台顶部单击云命令行入口,通过以下命令登录GPU节点。此处使用创建集群时,设置的节点登录密码。

    image.png

    ssh root@121.41.XX.XX

    image.png

  3. 使用前面记录复制的NAS文件的挂载命令,挂载NAS。

    sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 0bbfb4915a-sdm14.cn-hangzhou.nas.aliyuncs.com:/ /mnt
  4. 执行以下命令,下载bloom模型和训练数据。

    cd /mnt/
    wget http://ai-training-data.oss-cn-hangzhou.aliyuncs.com/bloom-560m-sft-data.tar

    出现如下提示,表明数据下载完成。image.png

    然后执行以下命令,解压下载文件。

    tar -xvf bloom-560m-sft-data.tar

4. 在GPU节点上配置集群证书

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群ai-test进入集群信息页面,单击连接信息,在内网访问页签下,复制内网访问凭证。

  3. 执行以下命令,将集群的内网访问的证书内容复制到节点的config文件中。

    mkdir -p ~/.kube
    vi ~/.kube/config

5. 在GPU节点上安装arena客户端

执行下列命令,在GPU节点上安装arena客户端。

# 下载arena客户端并安装
cd /root && wget https://aliacs-k8s-cn-hongkong.oss-cn-hongkong.aliyuncs.com/arena/arena-installer-0.9.9-ce4a78d-linux-amd64.tar.gz
tar -xzvf arena-installer-0.9.9-ce4a78d-linux-amd64.tar.gz
cd arena-installer
bash install.sh  --only-binary

出现如下提示,表明arena客户端安装成功。

image.png

提交Bloom模型微调训练任务和GPU共享模型推理服务

20

1. 提交Bloom模型微调训练任务

  1. 执行以下命令,提交一个Bloom模型的微调训练任务。训练任务大概需要运行8分钟。

    arena submit pytorchjob \
      --name=bloom-sft \
      --gpus=1 \
      --image=registry.cn-hangzhou.aliyuncs.com/acs/deepspeed:v0.9.0-chat \
      --data=training-data:/model \
      --tensorboard \
      --logdir=/model/logs \
      "cd /model/DeepSpeedExamples/applications/DeepSpeed-Chat/training/step1_supervised_finetuning && bash training_scripts/other_language/run_chinese.sh /model/bloom-560m-sft"

    训练任务提交成功后,任务状态将显示RUNNING。

  2. 执行以下命令,查看当前通过Arena提交的所有作业。

    arena list

    预期输出:

    NAME       STATUS   TRAINER     DURATION  GPU(Requested)  GPU(Allocated)  NODE
    bloom-sft  RUNNING  PYTORCHJOB  17m       1               1               192.168.26.152
  3. 执行以下命令,获取作业详情。

    arena get bloom-sft

    预期输出:

    Name:        bloom-sft
    Status:      RUNNING
    Namespace:   default
    Priority:    N/A
    Trainer:     PYTORCHJOB
    Duration:    1m
    CreateTime:  2023-07-20 15:06:19
    EndTime:
    
    Instances:
      NAME                STATUS   AGE  IS_CHIEF  GPU(Requested)  NODE
      ----                ------   ---  --------  --------------  ----
      bloom-sft-master-0  Running  1m   true      1             cn-hangzhou.192.168.XX.XX
    
    Tensorboard:
      Your tensorboard will be available on:
      http://192.168.XX.XX:32560

    记录此处GPU节点名称cn-hangzhou.192.168.XX.XX,用于后续部署推理服务。同时,记录此处Tensorboard的Web服务地址http://192.168.XX.XX:32560,此处端口号为32560,以您的输出显示为准。

  4. 将上一步记录的端口号加入GPU实例的入方向安全组,例如32560。image.png

  5. 通过浏览器访问Tensorboard。在浏览器中输入http://112.124.XX.XX:32560,此处将IP地址替换为GPU节点公网IP。image.png

    等待任务训练完成,大概需要10分钟。训练完成后,微调后的模型存储在NAS中的bloom-560m-sft目录下。

  6. 执行以下命令,在GPU节点上查看目录。

    # 进入微调后的模型目录, training.log 为训练日志
    cd /mnt/bloom-560m-sft/
    # 目录内容如下
    .
    ├── config.json
    ├── merges.txt
    ├── pytorch_model.bin
    ├── training.log
    └── vocab.json

2. 提交GPU共享模型推理服务

使用中文数据集对bloom-560m模型进行了监督微调,接下来可以通过GPU显存共享的能力,将多个推理服务部署在同一块GPU卡上以提高GPU的利用率。下文介绍如何使用Arena,将步骤一微调后的模型部署成推理服务。

  1. 执行以下命令,开启GPU共享调度能力和显存隔离能力,替换下列节点为您的GPU节点名称。

    kubectl label node cn-beijing.192.168.XX.XX ack.node.gpu.schedule=cgpu

    如需关闭GPU共享调度能力,您可以将标签设置为ack.node.gpu.schedule=default

  2. 执行以下命令,查看集群GPU资源。

    arena top node

    预期输出:

    NAME                       IPADDRESS      ROLE    STATUS  GPU(Total)  GPU(Allocated)
    cn-beijing.192.168.x.xxx   101.XX.XX.162  <none>  Ready   1           0
    ---------------------------------------------------------------------------------------------------
    Allocated/Total GPUs of nodes which own resource nvidia.com/gpu In Cluster:
    0/1 (0.0%)
  3. 执行以下命令,提交一个bloom的推理服务,部署2个副本,每个副本使用8G显存。

    arena serve custom \
      --name=bloom-infernece \
      --gpumemory=8 \
      --version=alpha \
      --replicas=2 \
      --restful-port=8080 \
      --data=training-data:/model \
      --image=registry.cn-hangzhou.aliyuncs.com/acs/djl-serving:v0.23.0 \
      "djl-serving -m /model/bloom-inference"
  4. 查看提交的任务的详细信息。

    • 执行以下命令,查看GPU使用情况。

      arena top node

      预期输出:

      image.png

    • 执行以下命令,查看提交任务的详细信息。

      arena serve get bloom-infernece

      Pod成功部署后,状态将变为Running。

      预期输出:

      image.png

      预期输出表明,两个推理服务的副本成功运行在同一张GPU卡上,同时记录此处的Address 172.16.243.170。

  5. 等待推理服务启动后,在GPU节点上执行以下命令,在本地调用推理服务。将下列IP替换为上一步记录的Address地址。

    curl -X POST http://172.16.243.170:8080/predictions/bloom_inference -H "Content-type: text/plain" -d "四川美食"

    预期输出:

    "generated_text":"四川美食》介绍四川的特色小吃,包括美食、名菜、小吃、酒馆、小吃一条街等,这些小吃构成了四川的饮食文化。<|endoftext|>"

完成及清理

5

清理资源

在本方案中,您使用了ROS资源栈和NAS文件存储系统。测试完方案后,您可以参考以下规则处理对应产品的实例,避免继续产生费用:

释放资源栈下的资源,释放创建的ACK集群、NAS件存储系统等。

  1. 登录ROS控制台,在左侧导航栏,选择资源栈

  2. 资源栈页面的顶部选择部署的资源栈所在地域,找到资源栈,然后在其右侧操作列,单击删除

    本方案会自动创建两个资源栈,一个由您部署时创建,另一个以k8s-开头,由ACK创建集群时创建。请删除非k8s-开头的资源栈,删除此资源栈时将自动删除k8s-开头的资源栈。

  3. 删除资源栈对话框,选择删除方式释放资源,然后单击确定,根据提示完成资源释放。