本文以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。具体操作,请参见部署DataCache CRD。
集群所属VPC已绑定公网NAT网关,并配置SNAT条目允许该VPC或下属交换机的资源可以访问公网。
说明如果VPC没有绑定公网NAT网关,您需要在创建DataCache和部署应用时绑定EIP,以便可以拉取公网数据。
准备运行环境
硬件要求
需使用的GPU规格要求如下。ECI支持的GPU规格,请参见规格说明。
CPU:无严格限制
内存:>16 GiB
GPU:≥1
显存:>16 GB(显存过低可能会出现OOM)
软件环境
通义千问-7B-Chat依赖的库和配置较多,ECI已经制作好了一个公共容器镜像,包含了一个基于Gradio的WebUI,您可以直接使用该镜像或者将其作为基础镜像进行二次开发。镜像地址为registry.cn-hangzhou.aliyuncs.com/eci_open/qwen-webui:1.0.0,大小约为15 GB。
操作步骤
创建DataCache
访问ModelScope,获取模型ID。
本示例使用通义千问-7B-Chat模型的v1.1.4版本。在ModelScope找到目标模型后,在模型详情页面顶部可以复制模型ID。
编写DataCache的YAML配置文件,然后使用该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的交换机
查询DataCache状态。
kubectl get edc
当数据下载完成,DataCache的状态为Available时,表示可以使用DataCache。示例如下:
部署通义千问应用
编写应用的YAML配置文件,然后使用该YAML文件部署通义千问应用。
kubectl create -f qwen.yaml
qwen.yaml的内容示例如下,可以创建一个包含1个Pod副本的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/" # 挂载模型数据
确认应用部署状态。
kubectl get deployment qwen-web kubectl get Pod
示例如下,可以看到通义千问应用已经部署成功。
确认模型数据的挂载情况。
kubectl exec -it <POD_NAME> -- bash ls /data/model
示例如下,可以看到容器的
/data/model
目录下已挂载模型数据。查看Pod绑定的EIP地址。
kubectl describe pod <pod_name>
在返回的Pod详情的Annotations中可以获取Pod绑定的EIP地址。
测试模型效果
在Pod所属安全组中添加入方向规则,开放8888端口。
打开浏览器,访问通义千问的Web页面。
本文示例的通义千问应用已单独绑定了EIP,可以直接输入Pod的EIP地址和容器开放的端口进行访问,例如
39.106.XX.XX:8888
。输入文本,测试通义千问-7B-Chat的模型效果。
示例如下: