AI玩转推理 - QwQ与Xinference应对逻辑挑战
应用概述
Xinference 是一个性能强大的推理框架,支持大语言模型(LLM),语音识别模型,多模态模型等各种模型的推理。
QwQ-32B-Preview是由Qwen团队最新发布的实验性研究模型,专注于增强 AI 推理能力,在数学和编程领域有着优异的表现。
本文中我们将介绍如何在弹性容器集群
中用Xinference
作为推理框架,探索QwQ-32B-Preview
对复杂问题的推理效果。
准备工作
本次部署会用到Docker和Kubernetes,请准备好Docker环境,并确保本地有可用的Kubernestes客户端工具kubectl。 Docker环境安装请参考文档,kubectl安装请参考安装命令行工具(kubectl)。
部署前需要先开通弹性容器集群
并准备好Xinference的官方镜像,请跟随下面的步骤,完成前期准备工作。
资源准备
QwQ-32B-Preview模型的参数规模为320亿,模型文件大小约为62G。因此,在部署前,请确保申请的资源满足下表中的最低要求。
配置项 | 最低配置 | 推荐配置 |
---|---|---|
GPU | H800 * 1 | H800 * 2 |
CPU | 16核 | 32核 |
内存 | 64GB | 128GB |
磁盘 | 100GB | 500GB |
开通弹性容器集群
请参考弹性容器集群的开通弹性容器集群,完成集群的开通并了解基本的使用方法使用弹性容器集群。成功后,得到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.yaml | Xinference的网络配置,用于暴露Xinference的服务,供外部访问 |
xinference.yaml | Xinference服务的核心配置文件,用于启动服务,需要替换为你自己的镜像 |
xinference.yaml
中的关键参数如下:
参数名 | 描述 |
---|---|
env.XINFERENCE_MODEL_SRC | Xinference的模型源,示例中设置为 modelscope |
env.XINFERENCE_HOME | Xinference的模型文件存储目录,示例中设置为 /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
方式暴露服务。对于需要外部访问的服务,我们可以使用ServiceExporter
。ServiceExporter
是弹性容器集群中用于将服务暴露到外部的组件,将其与需要对外提供服务的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
命令,创建Service
和ServiceExporter
资源。创建成功后,可以查看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
完成Secret
、PVC
、Service
、ServiceExporter
等资源的创建后,执行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 Name | qwq-32B-preview | 模型名称 |
Context Length | 32768 | 模型的上下文长度 |
Model Languages | English | 模型的语言 |
Model Abilities | Chat | QwQ-32B-Preview是一个chat模型 |
Model Family | qwen2.5-instruct | 选用相应的模型家族,会自动填写该家族模型的Chat Tempalte 、Stop Token ids 等参数 |
Model Format | PyTorch | 模型的格式 |
Model Path | /data/QwQ-32B-Preview | 模型文件所在的目录 |
Model Size in Billions | 32 | 模型的参数规模 |
启动模型服务
在浏览器中打开Xinference的页面,依次点击Launch Model
和CUSTOM MODELS
按钮,选择刚才注册的QwQ-32B-Preview模型,配置相关参数,启动模型服务。模型启动成功后,点击Running Models
可以管理处于运行在的模型服务。
模型服务支持通过Python、cURL等方式进行交互,下面我们来测试一下模型的推理效果。
- 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}
]
)
curl -X 'POST' \
'https://<Xinference服务地址>:<端口号>/chat/completions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "qwq-32B-preview",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "How many letters <r> in the word strawberry?"
}
]
}'
Let's see. The word is "strawberry." I need to find out how many letters 'r' are in this word.
First, I'll write down the word: s-t-r-a-w-b-e-r-r-y.
Now, I'll look for each occurrence of the letter 'r'.
Starting from the beginning:
-
The first letter is's', not 'r'.
-
The second letter is 't', not 'r'.
-
The third letter is 'r' — that's one 'r'.
-
The fourth letter is 'a', not 'r'.
-
The fifth letter is 'w', not 'r'.
-
The sixth letter is 'b', not 'r'.
-
The seventh letter is 'e', not 'r'.
-
The eighth letter is 'r' — that's another 'r', making it two so far.
-
The ninth letter is 'r' — yet another 'r', so now it's three 'r's.
-
The tenth letter is 'y', not 'r'.
So, counting them up: 1, 2, 3 'r's in "strawberry."
Wait, let me double-check to make sure I didn't miss any.
Going through again:
s, t, r (1), a, w, b, e, r (2), r (3), y.
Yes, three 'r's in total.
I think that's correct.
Final Answer
\[ \boxed3 \]
猜牌问题
- 猜牌问题
- AI推理过程
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}
)
这道题是一个逻辑推理题,涉及到对信息的逐步分析和排除。让我们来仔细理解一下题目和对话中的每一句话,看看如何才能找出那张牌是什么。
首先,我们知道总共有16张牌:
- 红桃:A、Q、4
- 黑桃:J、8、4、2、7、3
- 草花:K、Q、5、4、6
- 方块:A、5
约翰教授选出一张牌,把点数告诉P先生,把花色告诉Q先生。然后,他们进行了如下对话:
1. P先生:我不知道这张牌。
2. Q先生:我知道你不知道这张牌。
3. P先生:现在我知道这张牌了。
4. Q先生:我也知道了。
我们的目标是根据这些对话推断出到底是哪一张牌。
第一步:分析P先生的第一句话
P先生说:“我不知道这张牌。”
这意味着,根据他所知道的点数,无法确定唯一的牌。也就是说,这个点数在至少两种不同的花色中出现。因为如果这个点数只在一种花色中出现,那他就能确定是哪一张牌了。
来看看各个点数的出现情况:
- A:红桃和方块
- Q:红桃和草花
- 4:红桃、黑桃、草花
- J:只有黑桃
- 8:只有黑桃
- 2:只有黑桃
- 7:只有黑桃
- 3:只有黑桃
- K:只有草花
- 5:草花和方块
- 6:只有草花
所以,点数是A、Q、4、5的,有多花色;其他的点数只在一种花色中出现。
因此,P先生不知道牌,意味着点数是A、Q、4或5。
第二步:分析Q先生的第一句话
Q先生说:“我知道你不知道这张牌。”
这意味着,Q先生根据他所知道的花色,确定了无论点数是什么,P先生都不可能知道牌。
换句话说,这个花色中的所有点数都至少在两个花色中出现,也就是说,没有点数是仅在这个花色中出现的。
来看看各花色的情况:
- 红桃:A、Q、4
- A在红桃和方块
- Q在红桃和草花
- 4在红桃、黑桃、草花
- 所以,红桃花色中的所有点数都在至少两个花色中出现
- 黑桃:J、8、4、2、7、3
- J只有黑桃
- 8只有黑桃
- 4在黑桃、红桃、草花
- 2只有黑桃
- 7只有黑桃
- 3只有黑桃
- 所以,黑桃花色中有点数仅在黑桃中出现(如J、8、2、7、3)
- 草花:K、Q、5、4、6
- K只有草花
- Q在草花和红桃
- 5在草花和方块
- 4在草花、红桃、黑桃
- 6只有草花
- 所以,草花花色中有点数仅在草花中出现(如K、6)
- 方块:A、5
- A在方块和红桃
- 5在方块和草花
- 所以,方块花色中的所有点数都在至少两个花色中出现
因此,Q先生知道P先生不知道这张牌,意味着花色是红桃或方块,因为这些花色中的点数都至少在两个花色中出现。
但是,wait一下,根据Q先生的话,他确定P先生不知道这张牌,也就是说,花色中的所有点数都至少在两个花色中出现。根据上面的分析,红桃和方块符合这个条件,而黑桃和草花中有点数是唯一的,所以如果花色是黑桃或草花,P先生有可能知道这张牌(如果点数是只在该花色中出现的点数)。
所以,Q先生的说法暗示了花色是红桃或方块。
第三步:分析P先生的第二句话
P先生说:“现在我知道这张牌了。”
这意味着,在听到Q先生的话后,P先生能够确定这张牌是什么。
P先生知道点数,而且现在能确定唯一的牌,这意味着,在可能的花色(红桃或方块)中,这个点数只对应一张牌。
此前,根据第一步,点数是A、Q、4或5。
现在,花色限制在红桃和方块。
来看看这些点数在红桃和方块中的分布:
- A:红桃A和方块A
- Q:只有红桃Q(方块没有Q)
- 4:红桃4
- 5:方块5和草花5,但根据Q先生的话,花色是红桃或方块,所以只有方块5
wait,这里需要小心。根据Q先生的话,花色是红桃或方块。
所以,对于P先生来说,他知道点数,并且知道花色是红桃或方块。
因此,对于点数A,有红桃A和方块A
点数Q,在红桃和草花,但花色是红桃或方块,所以只有红桃Q
点数4,只有红桃4(方块没有4)
点数5,只有方块5(红桃没有5)
所以,现在:
- A:红桃A、方块A
- Q:红桃Q
- 4:红桃4
- 5:方块5
P先生说现在他知道这张牌了,这意味着他的点数对应唯一的牌。
看看哪些点数对应唯一的一张牌:
- A:两张,不确定
- Q:一张,红桃Q
- 4:一张,红桃4
- 5:一张,方块5
所以,如果点数是Q、4或5,P先生可以确定是哪一张牌。
但如果点数是A,仍然有两张牌,他还是不确定。
所以,排除点数是A的可能性。
因此,可能的牌是:
- 红桃Q
- 红桃4
- 方块5
第四步:分析Q先生的第二句话
Q先生说:“我也知道了。”
这意味着,Q先生根据P先生的第二句话,现在也能确定是哪一张牌。
Q先生知道花色,而且现在能确定是哪一张牌。
那么,对于Q先生来说,他知道花色是红桃或方块,并且根据P先生的话,排除了点数是A的情况,剩下的可能牌是红桃Q、红桃4、方块5。
现在,如果花色是方块,只剩下方块5;如果花色是红桃,还有红桃Q和红桃4。
如果花色是方块,Q先生知道是方块5,可以直接确定。
如果花色是红桃,还有两张牌,Q先生无法确定是Q还是4。
但是,Q先生说他也知道了,这意味着花色只能是方块,因为如果花色是红桃,他还是无法确定是哪一张牌。
因此,牌是方块5。
最终答案
这张牌是方块5。
家庭成员关系问题
- 猜牌问题
- AI推理过程
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}
)
小红有2个兄弟和3个姐妹,问小红的兄弟有几个姐妹。
首先,我们要理解这里的关系。小红有2个兄弟,这意味着除了小红之外,她还有2个兄弟。同时,她有3个姐妹。这里需要注意的是,这些兄弟和姐妹都是相对于小红来说的。
所以,小红总共有2个兄弟和3个姐妹,加上小红自己,这个家庭里总共有2 + 3 + 1 = 6个孩子。
现在,我们要找出小红的兄弟有几个姐妹。
首先,小红的兄弟是指她的兄弟们,他们各自有多少个姐妹。
首先,明确一下,小红的兄弟们的姐妹包括小红和其他姐妹。
但是,需要仔细思考一下。
假设小红有2个兄弟和3个姐妹,那么这3个姐妹包括小红自己吗?
wait,等一下,这个问题需要澄清。
一般来说,当我们说某人有若干个兄弟和若干个姐妹时,兄弟是指同父母的异性的兄弟,姐妹是指同父母的异性的姐妹。
但是,不同的文化和地区可能有不同的定义,有时候包括或不包括自己。
为了清晰起见,我需要明确一下。
假设:
小红有2个兄弟,意思是除了小红之外,她有2个同父母的兄弟。
小红有3个姐妹,意思是除了小红之外,她有3个同父母的姐妹。
等等,如果小红有3个姐妹,那么包括小红自己吗?
实际上,通常来说,一个人的姐妹数量是排除自己的。所以,小红有3个姐妹,不包括自己。
所以,总共有2个兄弟和3个姐妹,加上小红自己,家庭里有2 + 3 + 1 = 6个孩子。
现在,我们要找出小红的兄弟有几个姐妹。
首先,小红的兄弟是指她的2个兄弟。
那么,每个兄弟的姐妹包括小红和其他姐妹。
也就是说,每个兄弟有小红 plus 3个姐妹,总共是4个姐妹。
wait,等一下,如果小红有3个姐妹,不包括自己,那么加上小红自己,姐妹总数是4个。
所以,小红的兄弟各有4个姐妹。
但是,我感觉这个问题可能有陷阱。
让我再仔细想想。
假设家庭里有父亲、母亲、小红、小红的2个兄弟和3个姐妹。
等等,小红有2个兄弟和3个姐妹,这些都是一起的。
所以,家庭里有父亲、母亲,然后孩子们是小红、2个兄弟、3个姐妹。
等等,这里可能有混淆。
wait,如果小红有2个兄弟,那么这2个兄弟是她的同父母的兄弟,也就是他们有共同的父母。
同样,她有3个姐妹,这些姐妹也是同父母的姐妹。
所以,家庭里总的孩子数是2个兄弟 + 3个姐妹 + 小红自己,共6个孩子。
现在,我们要找出小红的兄弟有几个姐妹。
首先,小红的兄弟是指那2个兄弟。
那么,对于这2个兄弟中的任何一个来说,他们的姐妹是谁?
他们的姐妹包括所有同父母的异性兄弟姐妹,也就是小红和她的3个姐妹。
等等,小红有3个姐妹,不包括自己,所以总共有4个姐妹。
所以,每个兄弟有4个姐妹。
但是,我感觉这个问题可能更复杂,可能涉及到代数或者其他的因素。
或者,可能有其他的解读方式。
让我尝试另一种方法。
设家庭里有父亲、母亲、小红、2个兄弟、3个姐妹。
那么,家庭里总共有2个兄弟和3个姐妹,加上小红,共6个孩子。
现在,小红的兄弟是指那2个兄弟。
那么,对于这2个兄弟中的任何一个来说,他们的姐妹是谁?
他们的姐妹包括所有同父母的姐妹,也就是小红和她的3个姐妹,总共4个姐妹。
所以,每个兄弟有4个姐妹。
所以,答案是4个。
但是,我感觉可能有其他的理解方式,或者可能有更深层次的含义。
或者,可能需要考虑性别比例或者其他的因素。
或者,可能需要通过方程来解决。
让我尝试用方程来表示。
设家庭里有b个男孩和g个女孩。
根据题意,小红有2个兄弟和3个姐妹。
首先,小红是女孩,因为她有兄弟。
所以,小红有2个兄弟,即b = 2。
同时,小红有3个姐妹,即g - 1 = 3,因为排除小红自己。
所以,g - 1 = 3 => g = 4。
所以,家庭里有b = 2个男孩和g = 4个女孩。
现在,小红的兄弟,即男孩,他们的姐妹是所有的女孩,即g = 4个姐妹。
所以,每个兄弟有4个姐妹。
所以,答案是4个。
但是,我感觉这个问题可能在性别关系的定义上有些混淆。
或者,可能需要考虑更复杂的情况,比如半兄弟半姐妹等。
但是,根据常规的理解,应该就是4个。
所以,答案是小红的兄弟各有4个姐妹。
最终答案
4