美文网首页
基于VLLM部署QwQ-32B-AWQ多机多卡

基于VLLM部署QwQ-32B-AWQ多机多卡

作者: heichong | 来源:发表于2025-03-09 11:18 被阅读0次

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
}

相关文章

网友评论

      本文标题:基于VLLM部署QwQ-32B-AWQ多机多卡

      本文链接:https://www.haomeiwen.com/subject/emyrmjtx.html