跳到主要内容

AI玩转推理 - QwQ与Xinference应对逻辑挑战

应用概述

Xinference 是一个性能强大的推理框架,支持大语言模型(LLM),语音识别模型,多模态模型等各种模型的推理。

QwQ-32B-Preview是由Qwen团队最新发布的实验性研究模型,专注于增强 AI 推理能力,在数学和编程领域有着优异的表现。

本文中我们将介绍如何在弹性容器集群中用Xinference作为推理框架,探索QwQ-32B-Preview对复杂问题的推理效果。

准备工作

本次部署会用到Docker和Kubernetes,请准备好Docker环境,并确保本地有可用的Kubernestes客户端工具kubectl。 Docker环境安装请参考文档,kubectl安装请参考文档

部署前需要先开通弹性容器集群并准备好Xinference的官方镜像,请跟随下面的步骤,完成前期准备工作。

资源准备

QwQ-32B-Preview模型的参数规模为320亿,模型文件大小约为62G。因此,在部署前,请确保申请的资源满足下表中的最低要求。

配置项最低配置推荐配置
GPUH800 * 1H800 * 2
CPU16核32核
内存64GB128GB
磁盘100GB500GB

开通弹性容器集群

请参考弹性容器集群的入门文档,完成集群的开通并了解基本的使用方法【了解更多】。成功后,得到kubeconfig文件、弹性容器集群的信息、对象存储和Harbor仓库的相关信息。

提示

需要先设置环境变量,export KUBECONFIG=kubeconfig文件路径,才能够执行kubectl命令

镜像准备

在开始部署前,需要先拉取Xinference官方镜像,然后推送到弹性容器集群的Harbor仓库中。

docker pull registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference:v0.16.3

登录自己的镜像仓库,将Xinference官方镜像推送过去。
用户名密码:查看开通镜像仓库时的通知短信
镜像仓库访问地址:参考镜像仓库的使用
镜像仓库访问地址:由 镜像仓库访问域名/项目 组成


1. docker login 镜像仓库访问域名 -u 用户名 -p 密码

2. docker tag registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference:v0.16.3 镜像仓库访问地址/xinference:v0.16.3

3. docker push 镜像仓库访问地址/xinference:v0.16.3

XInference

Xinference有单点与集群两种部署模式,本文中采用单点模式。

服务部署

部署XInference需要以下资源,请点击此处获取配置文件,按照下文中的操作,完成相关资源的配置更改与安装。

文件名描述
xinference-secret.yaml镜像仓库的密钥,需要替换base64编码,参考创建密钥
xinference-svc.yamlXinference的网络配置,用于暴露Xinference的服务,供外部访问
xinference.yamlXinference服务的核心配置文件,用于启动服务,需要替换为你自己的镜像

xinference.yaml中的关键参数如下:

参数名描述
env.XINFERENCE_MODEL_SRCXinference的模型源,示例中设置为 modelscope
env.XINFERENCE_HOMEXinference的模型文件存储目录,示例中设置为 /data

Secret

完成前面步骤中的docker login操作之后,对docker的config.json文件中的内容进行base64编码,并将编码后的内容保存到xinference-secret.yaml文件中。

  cat ~/.docker/config.json | base64 -w 0

完成配置更改后,执行kubectl apply -f xinference-secret.yaml命令,创建Secret资源。

apiVersion: v1
kind: Secret
metadata:
name: xinference-secret
namespace: xinference
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: <base64编码后的docker config.json内容>
提示

config.json文件默认位置在~/.docker目录下

Service和ServiceExporter

在弹性容器集群中,无法直接使用NodePort方式暴露服务。对于需要外部访问的服务,我们可以使用ServiceExporterServiceExporter是弹性容器集群中用于将服务暴露到外部的组件,将其与需要对外提供服务的Service绑定,为用户提供外部访问的地址。

apiVersion: osm.datacanvas.com/v1alpha1
kind: ServiceExporter
metadata:
name: xinference-svcExporter
namespace: xinference
spec:
serviceName: xinference-svc
servicePort: 9997

执行kubectl apply -f xinference-svc.yaml命令,创建ServiceServiceExporter资源。创建成功后,可以查看ServiceExporter的信息获取服务访问的地址。通过ServiceExporter方式暴露的服务端口均为22443

kubectl describe serviceExporter xinference-svcExporter -n xinference

输出结果

信息省略···
Spec:
Service Name: xinference-svcExporter
Service Port: 9997
Status:
Conditions:
Last Transition Time: 2024-12-08T20:54:34Z
Message: IngressRoute successfully updated, url: https://xinference-svcExporter-x-xinference-x-vc2qofabc123.sproxy.hd-01.alayanew.com
···

启动XInference

完成SecretPVCServiceServiceExporter等资源的创建后,执行kubectl apply -f xinference.yaml命令,启动Xinference。通过上一小节获取到的服务地址,访问Xinference的页面。

示例:https://xinference-svcExporter-x-xinference-x-vc2qofabc123.sproxy.hd-01.alayanew.com:22443

QwQ-32B-Preview

Xinference目前暂未预置QwQ-32B-Preview模型,我们需要按照下面的步骤完成模型的下载、注册后,启动模型服务。

模型下载

modelscope是一个开源的模型即服务共享平台,我们从在modelscope上下载QwQ-32B-Preview模型到env.XINFERENCE_HOME指定的模型文件存储目录中。

进入Xinference的容器中,执行以下操作下载QwQ-32B-Preview模型。

  1. kubectl exec -it $( kubectl get pod -n xinference | awk ' NR>1 {print $1}' ) bash -n xinference

2. pip install modelscope

3. modelscope download --model Qwen/QwQ-32B-Preview --local_dir /data/QwQ-32B-Preview
提示

模型文件大约62GB,下载时间较长,请耐心等待

模型注册

下载完模型文件后,我们通过Xinference提供的Register Model功能,填写QwQ-32B-Preview的配置信息,完成模型的注册。主要配置信息如下:

配置项名称配置项参数描述
Model Nameqwq-32B-preview模型名称
Context Length32768模型的上下文长度
Model LanguagesEnglish模型的语言
Model AbilitiesChatQwQ-32B-Preview是一个chat模型
Model Familyqwen2.5-instruct选用相应的模型家族,会自动填写该家族模型的Chat TempalteStop Token ids等参数
Model FormatPyTorch模型的格式
Model Path/data/QwQ-32B-Preview模型文件所在的目录
Model Size in Billions32模型的参数规模

启动模型服务

在浏览器中打开Xinference的页面,依次点击Launch ModelCUSTOM MODELS按钮,选择刚才注册的QwQ-32B-Preview模型,配置相关参数,启动模型服务。模型启动成功后,点击Running Models可以管理处于运行在的模型服务。

模型服务支持通过Python、cURL等方式进行交互,下面我们来测试一下模型的推理效果。

from xinference.client import RESTfulClient
client = RESTfulClient("https://<Xinference服务地址>:<端口号>")
model = client.get_model("qwq-32B-preview")

question = 'How many letters <r> in the word strawberry?'

model.chat(
messages=[
{"role": "user", "content": question}
]
)

猜牌问题

from xinference.client import RESTfulClient
client = RESTfulClient("https://<Xinference服务地址>:<端口号>")
model = client.get_model("qwq-32B-preview")

question = '''
S先生、P先生、Q先生他们知道桌子的抽屉里有16张扑克牌:红桃A、Q、4 黑桃J、8、4、2、7、3 草花K、Q、5、4、6 方块A、5。约翰教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉 P先生,把这张牌的花色告诉Q先生。这时,约翰教授问P先生和Q 先生:你们能从已知的点数或花色中推知这张牌是什么牌吗?于是,S先生听到如下的对话:

P先生:我不知道这张牌。

Q先生:我知道你不知道这张牌。

P先生:现在我知道这张牌了。

Q先生:我也知道了。

请问:这张牌是什么牌?
'''

model.chat(
messages=[
{"role": "user", "content": question}
],
generate_config={"max_tokens": 4096}
)

家庭成员关系问题

from xinference.client import RESTfulClient
client = RESTfulClient("https://<Xinference服务地址>:<端口号>")
model = client.get_model("qwq-32B-preview")

question = '''
小红有2个兄弟,3个姐妹,那么小红的兄弟有几个姐妹?
'''

model.chat(
messages=[
{"role": "user", "content": question}
],
generate_config={"max_tokens": 4096}
)