VLLM安装
参考:https://www.jianshu.com/p/fd0297790806
模型地址
https://www.modelscope.cn/models/Qwen/QwQ-32B-AWQ/files
下载命令:
modelscope download --model Qwen/QwQ-32B-AWQ --local_dir /data/vllm/data/models/QwQ-32B-AWQ
最后要把此模型copy到vllm集群中的所有机器上
自定义chat_template.jinja
模型自带的chat_template(https://www.modelscope.cn/models/Qwen/QwQ-32B-AWQ/file/view/master?fileName=tokenizer_config.json&status=1),在最后拼接上了
<think>,导致最终输出的内容只有</think>而没有<think>。如果使输出的内容以<think>开始,需要把chat_template中最后的<think>去掉
自定义chat_template.jinja如下:
cat > /data/vllm/data/models/QwQ-32B-AWQ/chat_template.jinja <<"EOF"
{%- if tools %}
<|im_start|>system
{%- if messages[0]['role'] == 'system' %}
{{- messages[0]['content'] }}
{%- else %}
{{- '' }}
{%- endif %}
# Tools
You may call one or more functions to assist with the user query.
You are provided with function signatures within <tools></tools> XML tags:
<tools>
{%- for tool in tools %}
{{- tool | tojson }}
{%- endfor %}
</tools>
For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call><|im_end|>
{%- else %}
{%- if messages[0]['role'] == 'system' %}
<|im_start|>system
{{ messages[0]['content'] }}
<|im_end|>
{%- endif %}
{%- endif %}
{%- for message in messages %}
{%- if (message.role == "user") or (message.role == "system" and not loop.first) %}
<|im_start|>{{ message.role }}
{{ message.content }}
<|im_end|>
{%- elif message.role == "assistant" and not message.tool_calls %}
{%- set content = message.content.split('</think>')[-1].lstrip('\n') %}
<|im_start|>{{ message.role }}
{{ content }}
<|im_end|>
{%- elif message.role == "assistant" %}
<|im_start|>{{ message.role }}
{%- if message.content %}
{{ message.content }}
{%- endif %}
{%- for tool_call in message.tool_calls %}
{%- if tool_call.function is defined %}
{%- set tool_call = tool_call.function %}
{%- endif %}
<tool_call>
{"name": "{{ tool_call.name }}", "arguments": {{ tool_call.arguments | tojson }}}
</tool_call>
{%- endfor %}
<|im_end|>
{%- elif message.role == "tool" %}
{%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %}
<|im_start|>user
{%- endif %}
<tool_response>
{{ message.content }}
</tool_response>
{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
<|im_end|>
{%- endif %}
{%- endif %}
{%- endfor %}
{%- if add_generation_prompt %}
<|im_start|>assistant
{%- endif %}
EOF
启动
进入vllm容器内部:
docker exec -it ray_vllm bash
# 启动
nohup vllm serve /models/QwQ-32B-AWQ \
--served-model-name QwQ-32B-AWQ \
--gpu-memory-utilization 0.90 \
--max-num-seqs 1024 \
--max_model_len 30000 \
--pipeline_parallel_size 4 \
--tensor-parallel-size 2 \
--chat_template /models/QwQ-32B-AWQ/chat_template.jinja \
--enable-reasoning \
--reasoning-parser deepseek_r1 \
--port 8001 \
> logs/QwQ-32B-AWQ.log 2>&1 &
测试
[root@bogon ~]# curl http://10.3.6.41:8001/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer " \
-d '{
"model": "QwQ-32B-AWQ",
"messages": [
{
"role": "system",
"content": "你是一位富有诗意的助手,擅长以富有创意的方式阐释复杂的概念"
},
{
"role": "user",
"content": "创作一首七言绝句,来描述烟花的壮丽与悲壮"
}
],
"stream": false
}'
# ------------------------------------ 输出 ------------------------------------
{
"id": "chatcmpl-425afa4970b24d5a8f7589d98439d33f",
"object": "chat.completion",
"created": 1741336750,
"model": "QwQ-32B-AWQ",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"reasoning_content": "\n嗯,用户让我创作一首七言绝句,主题是烟花的壮丽与悲壮。首先得理解要求,七言绝句是四句,每句七个字,押平声韵。得注意平仄和对仗这些基本要求。不过用户又提到他擅长用诗意的方式阐释复杂概念,所以可能需要更创新一些,不完全拘泥于传统格式,但得保持古诗的韵味。\n\n先想烟花的特点,既有绚烂夺目的美丽,又有瞬间消逝的悲壮。得把这两种对立的情感结合起来。壮丽方面,可以用金色、烈火、银河等意象,表现出烟花升空时的辉煌。悲壮的话,可以用陨落、短暂、尘埃等词汇,强调其转瞬即逝的遗憾。\n\n第一句要起兴,描绘烟花升空的景象。比如“十万金珠出燧台”中,“十万金珠”形容大量烟花如同金珠般灿烂,“燧台”是指发射烟花的高台,有古意。第二句进一步渲染其灿烂,如“九霄烈火割云开”,用“九霄”描绘高空,烈火冲破云层,突出壮丽。\n\n第三句转写悲壮,可能提到陨落后的结局,比如“纷纭尽落珠沉海”,烟花散落如珠子沉入大海,带点哀伤。最后一句点明主题,悲壮与壮丽并存,“顷刻荣枯入梦来”说明盛衰在刹那间,留在梦里,突出瞬间的辉煌与消逝的惆怅。\n\n接下来检查押韵,第二句和第四句的末尾字“开”、“来”是否在同一个韵部。平水韵中,“开”属于上平十灰,“来”也在同一韵部,所以押韵正确。平仄方面,七言绝句通常有四种格式,这里可能用的是平起式。需要逐字检查是否符合平仄规则,可能需要调整,比如“十万金珠出燧台”平仄是否合适,但用户可能更在意意境,所以如果平仄稍有出入,只要不影响朗读效果也可以接受。\n\n还要考虑对仗,前两句和后两句是否有对仗关系。比如“十万”对“九霄”,“金珠”对“烈火”,“出燧台”对“割云开”,有一定的对仗感。后两句的“纷纭尽落”对“顷刻荣枯”,“珠沉海”对“入梦来”,稍显宽松,但绝句不要求必须对仗,所以可能没问题。\n\n最后赏析部分需要点明意象的选择和主题的融合,比如用金珠、烈火、银河、陨星来表现壮丽,珠沉海、刹那荣枯来表现悲壮。同时,结尾用梦境连接生死,深化了主题。这样用户不仅能得到诗,还能理解创作思路,符合他要求的解释和创意阐释。\n\n可能还需要考虑用词是否准确,比如“燧台”是否合适,是否指烟花发射的地方,应该没问题。而“陨星”是否恰当,可能有些夸张,但增加诗意的大气感。总之,这首诗要在有限的字数内兼顾壮丽与悲壮,通过意象和对比来表达,应该能满足用户的需求。\n",
"content": "\n\n\n《天火》\n十万金珠出燧台,九霄烈火割云开。\n纷纭尽落珠沉海,顷刻荣枯入梦来。\n\n赏析:这首作品以\"十万金珠\"开篇,喻指烟花绽放时的璀璨夺目。后用\"割云开\"展现其刺破苍穹的壮烈气势。第三句\"珠沉海\"笔锋一转,喻指烟花陨落之悲,末句\"顷刻荣枯\"以时空交错的笔法,将刹那烟火与永恒梦境交融,既写尽天火之壮美,亦道出生命无常的哲思。",
"tool_calls": [
]
},
"logprobs": null,
"finish_reason": "stop",
"stop_reason": null
}
],
"usage": {
"prompt_tokens": 43,
"total_tokens": 888,
"completion_tokens": 845,
"prompt_tokens_details": null
},
"prompt_logprobs": null
}











网友评论