本文以部署QwQ-32B模型为例,演示如何使用DataCache快速部署QwQ-32B模型。通过DataCache提前拉取QwQ-32B模型数据,然后在部署QwQ-32B模型推理服务时直接挂载模型数据,可以免去在Pod中拉取模型数据的等待时间,加速QwQ-32B部署。
为什么使用ECI部署QwQ-32B
前提条件
集群中已部署DataCache CRD。
集群所属VPC已绑定公网NAT网关,并配置SNAT条目允许该VPC或下属交换机的资源可以访问公网。
说明如果VPC没有绑定公网NAT网关,您需要在创建DataCache和部署应用时绑定EIP,以便可以拉取公网数据。
准备运行环境
规格推荐
推荐使用ecs.gn7i-4x.8xlarge、ecs.gn7i-4x.16xlarge、ecs.gn7i-c32g1.32xlarge及以上GPU规格(4 * A10及以上)。ECI支持的GPU规格,请参见规格说明。
说明选择规格时,请先确认集群所在地域和可用区支持该规格。更多信息,请参见ECS实例规格可购买地域总览。
软件环境
大模型部署依赖的库和配置较多,vLLM是目前一个主流的大模型推理引擎,本文使用vLLM进行推理服务的部署。ECI已经制作好了一个公共容器镜像,您可以直接使用该镜像或者将其作为基础镜像进行二次开发,镜像地址为
registry.cn-beijing.aliyuncs.com/eci_open/vllm-openai:v0.7.2
,镜像大小约为16.5 GB。
步骤一:创建DataCache
首次使用时,需要提前创建DataCache,以免去在Pod中拉取模型数据的等待时间,加速部署QwQ-32B。
访问ModelScope,获取模型ID。
本示例使用QwQ-32B模型的master版本。在ModelScope找到目标模型后,在模型详情页面顶部可以复制模型ID。
编写DataCache的YAML配置文件,然后使用该YAML文件创建DataCache拉取QwQ-32B模型。
kubectl create -f datacache-test.yaml
datacache-test.yaml的内容示例如下:
apiVersion: eci.aliyun.com/v1alpha1 kind: DataCache metadata: name: qwq-32b spec: bucket: default path: /models/qwq-32b dataSource: type: URL options: repoSource: ModelScope/Model # 指定数据源为ModelScope的模型 repoId: Qwen/QwQ-32B # 指定模型ID netConfig: securityGroupId: sg-2ze*********** vSwitchId: vsw-2ze************ eipCreateParam: # 如果交换机没有配置SNAT接入公网,需要自动创建并绑定EIP bandwidth: 5 # EIP带宽
查询DataCache状态。
kubectl get edc
当数据下载完成,DataCache的状态为Available时,表示可以使用DataCache。阿里云为QwQ-32B模型提供了热加载能力,能实现DataCache秒级制作完成。
NAME AGE DATACACHEID STATUS PROGRESS BUCKET PATH qwq-32b 21s edc-2ze2qu723g5arodr**** Available 100% default /models/qwq-32b
步骤二:部署QwQ-32B模型推理服务
编写应用的YAML配置文件,然后使用该YAML文件部署QwQ-32B推理应用。
kubectl create -f qwq-32b-server.yaml
qwq-32b-server.yaml的内容示例如下,Pod使用GPU规格,并挂载了QwQ-32B模型。Pod内的容器使用包含vLLM的镜像,容器启动后会运行
vllm serve /models/QwQ-32B --port 8000 --trust-remote-code --served-model-name qwq-32b --tensor-parallel=4 --max-model-len 8192 --gpu-memory-utilization 0.95 --enforce-eager
启动OpenAI-Compatible Server。说明以下YAML示例中,系统会自动创建并为Pod绑定一个EIP。如果您的集群所属VPC已绑定公网NAT网关,可去掉该Annotation,在Pod创建成功后,您可以配置DNAT条目实现外部访问Pod。实际业务场景中,建议创建Service来统一提供Pod访问入口。
apiVersion: v1 kind: Pod metadata: name: qwq-32b-server labels: alibabacloud.com/eci: "true" annotations: k8s.aliyun.com/eci-use-specs: ecs.gn7i-4x.8xlarge,ecs.gn7i-4x.16xlarge,ecs.gn7i-c32g1.32xlarge # 指定GPU实例规格,指定多规格可以降低库存不足的概率 k8s.aliyun.com/eci-gpu-driver-version: tesla=535.161.08 # 指定使用的GPU驱动版本 k8s.aliyun.com/eci-with-eip: "true" # 自动创建并绑定EIP,以便外部可以访问 k8s.aliyun.com/eci-extra-ephemeral-storage: "20Gi" # 启动依赖的框架较大,需要配置额外的存储空间(付费) k8s.aliyun.com/eci-data-cache-bucket: "default" # 指定DataCache Bucket # 对加载速度有更高要求的可以开启AutoPL云盘 k8s.aliyun.com/eci-data-cache-provisionedIops: "15000" # 设置ESSD AutoPL云盘预配置的读写IOPS k8s.aliyun.com/eci-data-cache-burstingEnabled: "true" # 设置ESSD AutoPL云盘开启Burst,加速应用启动 spec: containers: - name: vllm-container command: - /bin/sh args: - -c - vllm serve /models/QwQ-32B --port 8000 --trust-remote-code --served-model-name qwq-32b --tensor-parallel=4 --max-model-len 8192 --gpu-memory-utilization 0.95 --enforce-eager image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/vllm-openai:v0.7.2 imagePullPolicy: IfNotPresent readinessProbe: tcpSocket: port: 8000 initialDelaySeconds: 500 periodSeconds: 5 resources: limits: nvidia.com/gpu: "4" volumeMounts: - mountPath: /models/QwQ-32B # 模型数据在容器内的挂载路径 name: llm-model - mountPath: /dev/shm name: dshm volumes: - name: llm-model hostPath: path: /models/qwq-32b # 挂载模型数据,即挂载数据缓存的路径 - name: dshm emptyDir: medium: Memory sizeLimit: 30Gi
确认应用部署状态。
kubectl get pod
预期返回:
NAME READY STATUS RESTARTS AGE qwq-32b-server 1/1 Running 0 2m55s
查看Pod绑定的EIP地址。
kubectl describe pod qwq-32b-server
在返回的Pod详情的Annotations中可以获取Pod绑定的EIP地址。示例如下:
Name: qwq-32b-server Namespace: default Priority: 0 Service Account: default Node: virtual-kubelet-cn-beijing-i/10.2.0.81 Start Time: Wed, 12 Mar 2025 02:42:39 +0000 Labels: alibabacloud.com/eci=true Annotations: ProviderCreate: done k8s.aliyun.com/allocated-eipAddress: 182.92.XX.XX ......
步骤三:测试模型推理服务效果
在Pod所属安全组中添加入方向规则,开放8000端口。
向模型推理服务发送一条模型推理请求。
本文示例部署的QwQ-32B已绑定一个EIP,请根据实际的EIP地址替换示例代码中的
XX.XX.XX.XX
。curl POST http://XX.XX.XX.XX:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwq-32b", "messages": [ { "role": "user", "content": "用一句话简单介绍一下云计算" } ], "temperature": 0.6, "max_tokens": 3000 }' \ --verbose
预期返回:
{"id":"chatcmpl-7678099ec2b24852bc5b96b1227b0010","object":"chat.completion","created":1741747813,"model":"qwq-32b","choices":[{"index":0,"message":{"role":"assistant","reasoning_content":null,"content":"嗯,用户让我用一句话简单介绍一下云计算。首先,我需要确定用户的需求是什么。可能他们需要快速了解云计算的基本概念,不需要太深入的技术细节。所以,我得抓住云计算的核心特点,比如资源虚拟化、按需服务、弹性扩展这些。然后要确保句子简洁明了,容易理解。\n\n接下来,我得想想常见的云计算定义。通常会提到通过互联网提供计算资源,比如服务器、存储、数据库等,按需使用和付费。可能还要提到弹性扩展,也就是根据需求自动调整资源。另外,云计算的服务模式,比如IaaS、PaaS、SaaS,但可能不需要在一句话里都提到,太复杂了。\n\n用户可能没有说出来的深层需求是,他们可能想了解云计算的优势,比如节省成本、灵活方便,或者相比传统IT有什么不同。所以在句子中需要隐含这些好处。比如“无需前期投资”或者“灵活扩展”这样的关键词。\n\n然后要注意避免专业术语,让句子更通俗。比如用“通过互联网”代替“基于互联网基础设施”,或者“按需获取”而不是“按需自服务”。还要确保句子结构流畅,信息完整。\n\n可能还需要对比传统方式,比如以前需要自己购买服务器,现在可以租用云服务,这样更直观。但一句话里可能放不下对比,所以用“无需自建基础设施”来暗示这一点。\n\n检查一下有没有遗漏的关键点:资源类型(计算、存储、网络)、交付方式(互联网)、按需服务、弹性、按使用付费。这些都涵盖了的话应该没问题。\n\n最后组合起来,确保不超过一句话,同时信息准确。比如:“云计算是一种通过互联网提供按需访问可弹性扩展的计算资源(如服务器、存储和应用程序)的模式,用户无需自建基础设施即可灵活获取和管理资源,并按实际使用量付费。” 这样应该涵盖了主要要素,也简洁明了。\n</think>\n\n云计算是一种通过互联网提供可弹性扩展的计算资源(如服务器、存储、网络和应用程序)的模式,用户无需自建基础设施,即可按需访问并按实际使用量付费。","tool_calls":[]},"logprobs":null,"finish_reason":"stop","stop_reason":null}],"usage":{"prompt_tokens":15,"total_tokens":450,"completion_tokens":435,"prompt_tokens_details":null},"prompt_logprobs":null}
其中
</think>
前的内容表示的是模型在生成最终答案之前进行的内部思考过程或中间推理步骤。这些标记并不是最终输出的一部分,而是模型在生成答案时的一种自我提示或逻辑推理的记录。提取最终答案如下:
云计算是一种通过互联网提供可弹性扩展的计算资源(如服务器、存储、网络和应用程序)的模式,用户无需自建基础设施,即可按需访问并按实际使用量付费。