部署千问应用

更新时间:
复制为 MD 格式

本文以ModelScope社区的千问-7B-Chat模型为例,演示如何使用DataCache。通过DataCache提前拉取千问-7B-Chat模型数据,然后在创建千问的应用Pod时直接挂载模型数据,可以免去在Pod中拉取模型数据的等待时间,加速应用部署。

背景信息

千问-7B(Qwen-7B)是阿里云研发的千问大模型系列的70亿参数规模的模型。基于Transformer的大语言模型,在超大规模的预训练数据上进行训练得到了Qwen-7B。本文使用的千问-7B-Chat是在Qwen-7B的基础上,使用对齐机制打造了基于大语言模型的AI助手。更多信息,请参见Qwen-7B-Chat

前提条件

  • 集群中已部署DataCache CRD

  • 集群所属VPC已绑定公网NAT网关,并配置SNAT条目允许该VPC或下属交换机的资源可以访问公网。

    说明

    如果VPC没有绑定公网NAT网关,您需要在创建DataCache和部署应用时绑定EIP,以便可以拉取公网数据。

准备运行环境

  • 硬件要求

    需使用的GPU规格要求如下。ECI支持的GPU规格,请参见规格说明

    • CPU:无严格限制

    • 内存:>16 GiB

    • GPU:≥1

    • 显存:>16 GB(显存过低可能会出现OOM)

  • 软件环境

    千问-7B-Chat依赖的库和配置较多,ECI已经制作好了一个公共容器镜像,包含了一个基于GradioWebUI,您可以直接使用该镜像或者将其作为基础镜像进行二次开发。镜像地址为registry.cn-hangzhou.aliyuncs.com/eci_open/qwen-webui:1.0.0,大小约为15 GB。

操作步骤

创建DataCache

  1. 访问ModelScope,获取模型ID。

    本示例使用千问-7B-Chat模型的v1.1.4版本。在ModelScope找到目标模型后,在模型详情页面顶部可以复制模型ID。

  2. 编写DataCacheYAML配置文件,然后使用该YAML文件创建DataCache拉取千问-7B-Chat模型。

    kubectl create -f datacache-test.yaml

    datacache-test.yaml的内容示例如下:

    apiVersion: eci.aliyun.com/v1alpha1
    kind: DataCache
    metadata:
      name: qwen
    spec:
      bucket: test  
      path: /model/qwen/ 
      dataSource:
        type: URL 
        options:
          repoSource: ModelScope/Model              # 指定数据源为ModelScope的模型
          repoId: qwen/Qwen-7B-Chat                 # 指定模型ID
          revision: v1.1.4                          # 指定模型版本
      retentionDays: 1
      netConfig: 
        securityGroupId: sg-2ze63v3jtm8e6s******
        vSwitchId: vsw-2ze94pjtfuj9vay******       # 指定已配置SNAT的交换机
  3. 查询DataCache状态。

    kubectl get edc

    当数据下载完成,DataCache的状态为Available时,表示可以使用DataCache。示例如下:

    xxx:~$ kubectl get edc
    NAME    AGE    DATACACHEID        STATUS      PROGRESS    BUCKET    PATH
    qwen    27m    edc-2zeeln22eo /yq Available   100%        test      /model/qwen/

部署千问应用

  1. 编写应用的YAML配置文件,然后使用该YAML文件部署千问应用。

    kubectl create -f qwen.yaml

    qwen.yaml的内容示例如下,可以创建一个包含1Pod副本的Deployment,Pod使用GPU规格,并挂载了千问模型。Pod内容器使用包含千问WebUI应用的镜像,容器启动后会运行python Qwen-7B/web_demo.py --server_port 8888启动WebUI。

    说明

    以下YAML示例中,系统会自动创建并为Pod绑定一个EIP。如果您的集群所属VPC已绑定公网NAT网关,可去掉该Annotation,在Pod创建成功后,您可以配置DNAT条目实现外部访问Pod。实际业务场景中,建议创建Service来统一提供Pod访问入口。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: qwen-web
      labels:
        app: qwen
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: qwen
      template:
        metadata:
          name: qwen
          labels:
            app: qwen
            alibabacloud.com/eci: "true" 
          annotations:
            k8s.aliyun.com/eci-use-specs: "ecs.gn7i-c8g1.2xlarge"    # 指定GPU规格
            k8s.aliyun.com/eci-data-cache-bucket: "test"             # 指定DataCache Bucket
            k8s.aliyun.com/eci-data-cache-provisionedIops: "35000"   # 设置ESSD AutoPL云盘预配置的读写IOPS
            k8s.aliyun.com/eci-data-cache-burstingEnabled: "true"    # 设置ESSD AutoPL云盘开启Brust,加速应用启动
            k8s.aliyun.com/eci-with-eip: "true"                      # 自动创建并绑定EIP,以便外部可以访问
        spec:
          containers:
          - name: qwen
            image: registry.cn-hangzhou.aliyuncs.com/eci_open/qwen-webui:1.0.0  # 使用制作好的千问镜像
            resources:
                limits:
                  nvidia.com/gpu: "1"           # 设置容器所需的GPU数
            command: ["/bin/sh"]
            args: ["-c","python Qwen-7B/web_demo.py --server_port 8888"]    # 启动WebUI
            volumeMounts:
            - name: "model-qwen"
              mountPath: "/data/model/"         # 模型数据在容器内的挂载路径
          volumes: 
          - name: "model-qwen"
            hostPath:             
              path: "/model/qwen/"    # 挂载模型数据
  2. 确认应用部署状态。

    kubectl get deployment qwen-web
    kubectl get Pod

    示例如下,可以看到千问应用已经部署成功。

    :~$ kubectl get deployment qwen-web
    NAME        READY   UP-TO-DATE   AVAILABLE   AGE
    qwen-web    1/1     1            1           5m20s
    :~$ kubectl get pod
    NAME                          READY   STATUS    RESTARTS   AGE
    qwen-web-b9d9fd9db-bhkpn      1/1     Running   0          5m24s
  3. 确认模型数据的挂载情况。

    kubectl exec -it <POD_NAME> -- bash
    ls /data/model

    示例如下,可以看到容器的/data/model目录下已挂载模型数据。

    :~$ kubectl get pod
    NAME                        READY   STATUS    RESTARTS   AGE
    qwen-web-b9d9fd9db-bhkpn    1/1     Running   0          5m24s
    :~$ kubectl exec -it qwen-web-b9d9fd9db-bhkpn -- bash
    root@qwen-web-b9d9fd9db-bhkpn:/workspace# ls /data/model
    LICENSE.md                          config.json              lost+found                        model-00005-of-00008.safetensors  modeling_qwen.py
    NOTICE.md                           configuration.json       model-00001-of-00008.safetensors  model-00006-of-00008.safetensors  qwen.tiktoken
    README.md                           configuration_qwen.py    model-00002-of-00008.safetensors  model-00007-of-00008.safetensors  qwen_generation_utils.py
    cache_autogptq_cuda_256.cpp         cpp_kernels.py           model-00003-of-00008.safetensors  model-00008-of-00008.safetensors  tokenization_qwen.py
    cache_autogptq_cuda_kernel_256.cu   generation_config.json   model-00004-of-00008.safetensors  model.safetensors.index.json      tokenizer_config.json
  4. 查看Pod绑定的EIP地址。

    kubectl describe pod <pod_name>

    在返回的Pod详情的Annotations中可以获取Pod绑定的EIP地址。

    :~$ kubectl describe pod qwen-web-b9d9fd9db-bhkpn
    Name:         qwen-web-b9d9fd9db-bhkpn
    Namespace:    default
    Priority:     0
    Service Account: default
    Node:         virtual-kubelet-cn-beijing-h/172.16.0.131
    Start Time:   Thu, 02 Nov 2023 05:54:06 +0000
    Labels:       alibabacloud.com/eci=true
                  app=qwen
                  pod-template-hash=b9d9fd9db
    Annotations:  ProviderCreate: done
                  k8s.aliyun.com/allocated-eipAddress: 39.106.xxx
                  k8s.aliyun.com/allocated-eipInstanceId: eip-2zepokv0m(xxx)

测试模型效果

  1. Pod所属安全组中添加入方向规则,开放8888端口。

  2. 打开浏览器,访问千问的Web页面。

    本文示例的千问应用已单独绑定了EIP,可以直接输入PodEIP地址和容器开放的端口进行访问,例如39.106.XX.XX:8888

  3. 输入文本,测试千问-7B-Chat的模型效果。

    在 Qwen-7B-Chat 的 Gradio Web UI 聊天界面中,用户在输入框中发送介绍一下你自己,模型回复了一段中文自我介绍,说明自己是一个 AI 助手,能够提供定义与解释、翻译、总结文本、生成文本、写故事、分析情绪、开发算法、编写代码等服务,表明模型已正常运行。