当前位置: 首页 > news >正文

vLLM本地部署 Seed-OSS-36B-Instruct 并通过修改chat_template.jinja模板实现思考与非思考切换 版本2

vLLM本地部署 Seed-OSS-36B-Instruct 并通过修改chat_template.jinja模板实现思考与非思考切换

设备:4卡 Tesla T10
模型:cpatonn/Seed-OSS-36B-Instruct-AWQ-8bit
推理框架docker版vLLM:vllm-openai:nightly-8f8fda261a620234fdeea338f44093d5d8072879

实现思考预算设置可以看我上一个博客:https://blog.csdn.net/oTianShiYeDiaoMao123/article/details/155322503

这是第二个版本的jinja模板,修改如下:

  • 去除了jinja模板中的与思考预算相关的部分,个人使用过程中发现思考预算用处不大。
  • 现在只有思考和非思考模式,当在系统提示词中加入“seed_oss_no_reasoning”就会切换为非思考模式。
  • 非思考模式下会自动去除系统提示词中的“seed_oss_no_reasoning”字段,保留系统提示词的其它部分,也就是非思考模式下也能用系统提示词了(第一版jinja模板不行)。

第一次创建容器后,执行以下命令,解决非思考模式下使用非流式输出时的bug(这个bug在第一版jinja文件修改的博客中有提到)

dockerexec-it seedsed-i's/return model_output, None/return None, model_output/'/usr/local/lib/python3.12/dist-packages/vllm/reasoning/basic_parsers.py

创建容器的指令

docker run -d\--gpus all\--memory 28g\--memory-swap 28g\--shm-size 28g\-p8080:8080\-v /home/abc/model:/model\--ipc=host\--name seed\--envVLLM_SLEEP_WHEN_IDLE=1\--envVLLM_USE_FLASHINFER_SAMPLER=1\--envOMP_NUM_THREADS=2\vllm/vllm-openai:nightly-8f8fda261a620234fdeea338f44093d5d8072879\/model/Seed-OSS-36B-Instruct-AWQ-8bit\--served-model-name Seed-OSS-36B-Instruct\--quantization compressed-tensors\--dtype float16\--enable-auto-tool-choice\--tool-call-parser seed_oss\--reasoning-parser seed_oss\--chat-template /model/Seed-OSS-36B-Instruct-AWQ-8bit/chat_template.jinja\--gpu-memory-utilization0.90\--max-model-len61440\--max-num-seqs8\--max-num-batched-tokens2048\--tensor-parallel-size4\--async-scheduling\--enable-prefix-caching\--disable-custom-all-reduce\--attention-config.backend FLASHINFER\--host0.0.0.0\--port8080

完整版jinja文件

{# ----------‑‑‑ special token variables ‑‑‑---------- #} {%- set bos_token = '<seed:bos>' -%} {%- set eos_token = '<seed:eos>' -%} {%- set pad_token = '<seed:pad>' -%} {%- set toolcall_begin_token = '<seed:tool_call>' -%} {%- set toolcall_end_token = '</seed:tool_call>' -%} {%- set think_begin_token = '<seed:think>' -%} {%- set think_end_token = '</seed:think>' -%} {%- set budget_begin_token = '<seed:cot_budget_reflect>'-%} {%- set budget_end_token = '</seed:cot_budget_reflect>'-%} {# Changed By Mokie #} {# ---------- Preprocess the system message ---------- #} {%- if messages[0]["role"] == "system" %} {%- if "seed_oss_no_reasoning" in messages[0]["content"] %} {%- set thinking_budget = 0 -%} {%- set processed_content = messages[0]["content"] | replace("seed_oss_no_reasoning\n", "") | replace("seed_oss_no_reasoning", "") | trim -%} {# 如果系统提示词除去seed_oss_no_reasoning还有其它内容,则将剩余部分赋值给system_message #} {%- if processed_content | length > 0 %} {%- set system_message = processed_content -%} {%- endif %} {%- set loop_messages = messages[1:] -%} {%- else %} {%- set system_message = messages[0]["content"] -%} {%- set loop_messages = messages[1:] -%} {%- endif %} {%- else %} {%- set loop_messages = messages -%} {%- endif %} {# 如果没定义思考预算,则将思考预算设置为无限 #} {%- if not thinking_budget is defined %} {%- set thinking_budget = -1 -%} {%- endif -%} {# ---------- Ensure tools exist ---------- #} {%- if not tools is defined or tools is none %} {%- set tools = [] %} {%- endif %} {# tools2doc.jinja #} {%- macro py_type(t) -%} {%- if t == "string" -%}str {%- elif t in ("number", "integer") -%}int {%- elif t == "boolean" -%}bool {%- elif t == "array" -%}list {%- else -%}Any{%- endif -%} {%- endmacro -%} {# ---------- Output the system block ---------- #} {%- if system_message is defined %} {{ bos_token + "system\n" + system_message }} {%- else %} {%- if tools is iterable and tools | length > 0 %} {{ bos_token + "system\nYou are Doubao, a helpful AI assistant. You may call one or more functions to assist with the user query." }} {%- endif %} {%- endif %} {%- if use_json_tooldef is defined and use_json_tooldef %} {{"Tool List:\nYou are authorized to use the following tools (described in JSON Schema format). Before performing any task, you must decide how to call them based on the descriptions and parameters of these tools."}} {{ tools | tojson(ensure_ascii=False) }} {%- else %} {%- for item in tools if item.type == "function" %} Function: def {{ item.function.name }}( {%- for name, spec in item.function.parameters.properties.items() %} {{- name }}: {{ py_type(spec.type) }}{% if not loop.last %},{% endif %} {%- endfor %}): """ {{ item.function.description | trim }} {# ---------- Args ---------- #} {%- if item.function.parameters.properties %} Args: {%- for name, spec in item.function.parameters.properties.items() %} - {{ name }} ({{ py_type(spec.type) }}) {%- if name in item.function.parameters.required %} [必填]{% else %} [选填]{% endif %}: {{- " " ~ (spec.description or "") }} {%- endfor %} {%- endif %} {# ---------- Returns ---------- #} {%- if item.function.returns is defined and item.function.returns.properties is defined and item.function.returns.properties %} Returns: {%- for name, spec in item.function.returns.properties.items() %} - {{ name }} ({{ py_type(spec.type) }}): {{- " " ~ (spec.description or "") }} {%- endfor %} {%- endif %} """ {%- endfor %} {%- endif %} {%- if tools is iterable and tools | length > 0 %} {{"工具调用请遵循如下格式:\n<seed:tool_call>\n<function=example_function_name>\n<parameter=example_parameter_1>value_1</parameter>\n<parameter=example_parameter_2>This is the value for the second parameter\nthat can span\nmultiple lines</parameter>\n</function>\n</seed:tool_call>\n"}} {%- endif %} {# End the system block line #} {%- if system_message is defined or tools is iterable and tools | length > 0 %} {{ eos_token }} {%- endif %} {# ---------- List the historical messages one by one ---------- #} {%- for message in loop_messages %} {%- if message.role == "assistant" and message.tool_calls is defined and message.tool_calls is iterable and message.tool_calls | length > 0 %} {{ bos_token + message.role }} {%- if message.reasoning_content is defined and message.reasoning_content is string and message.reasoning_content | trim | length > 0 %} {{ "\n" + think_begin_token + message.reasoning_content | trim + think_end_token }} {%- endif %} {%- if message.content is defined and message.content is string and message.content | trim | length > 0 %} {{ "\n" + message.content | trim + "\n" }} {%- endif %} {%- for tool_call in message.tool_calls %} {%- if tool_call.function is defined %}{% set tool_call = tool_call.function %}{% endif %} {{ "\n" + toolcall_begin_token + "\n<function=" + tool_call.name + ">\n" }} {%- if tool_call.arguments is defined %} {%- for arg_name, arg_value in tool_call.arguments | items %} {{ "<parameter=" + arg_name + ">" }} {%- set arg_value = arg_value if arg_value is string else arg_value | string %} {{ arg_value+"</parameter>\n" }} {%- endfor %} {%- endif %} {{ "</function>\n" + toolcall_end_token }} {%- endfor %} {{ eos_token }} {%- elif message.role in ["user", "system"] %} {{ bos_token + message.role + "\n" + message.content + eos_token }} {%- elif message.role == "assistant" %} {{ bos_token + message.role }} {%- if message.reasoning_content is defined and message.reasoning_content is string and message.reasoning_content | trim | length > 0 %} {{ "\n" + think_begin_token + message.reasoning_content | trim + think_end_token }} {%- endif %} {%- if message.content is defined and message.content is string and message.content | trim | length > 0 %} {{ "\n" + message.content | trim + eos_token }} {%- endif %} {# Include the tool role #} {%- else %} {{ bos_token + message.role + "\n" + message.content + eos_token }} {%- endif %} {%- endfor %} {# ---------- Control the model to start continuation ---------- #} {%- if add_generation_prompt %} {{ bos_token + "assistant\n" }} {%- if thinking_budget == 0 %} {{ think_begin_token + "\n" + budget_begin_token + "The current thinking budget is 0, so I will directly start answering the question." + budget_end_token + "\n" + think_end_token }} {%- endif %} {%- endif %}
http://www.cnnetsun.cn/news/110299.html

相关文章:

  • 《零基础入门:人工智能到底是什么?5分钟图解AI核心概念》
  • 《Python还是R?AI新人选语言的最全避坑指南》
  • 终极歌词API集成指南:LrcApi让音乐应用快速拥有专业歌词功能 [特殊字符]
  • WGAI:企业级AI解决方案的技术架构与商业价值解析
  • 【量子开发者必备】:7个高效VSCode量子代码模板免费分享
  • 苹果手机iphone到达指定位置打开app自动打卡
  • 量子计算镜像性能为何难以稳定?:5个核心参数配置决定成败
  • 【量子计算开发必备】:VSCode环境修复终极方案(含Q#插件深度调试技巧)
  • 终极指南:如何用开源Notally打造高效笔记系统
  • 部署失败不再怕:7大常见VSCode Qiskit项目问题及解决方案
  • 从零构建可调试的Q#-Python系统:资深架构师的7条黄金准则
  • Obsidian美化资源高效下载实用攻略
  • 酷狗音乐API开发完整指南:从零构建音乐应用
  • Notally:你的终极开源Android笔记应用完整指南
  • 【稀缺资源曝光】国内首个VSCode量子模拟实战手册流出,速看!
  • XVim终极指南:在Xcode中体验Vim的高效编辑魅力
  • Tkinter Helper:可视化拖拽布局工具,让Python GUI开发效率提升10倍
  • 大火的 ChatBI,是如何实现灵活的自然语言数据分析?
  • 33、文本编辑器nvi与Elvis功能解析
  • 35、文本编辑器Elvis与Vile:特性、功能与操作全解析
  • 36、Vile编辑器:功能、初始化与多窗口编辑全解析
  • Subfinder字幕搜索工具:一键解决多平台字幕下载难题
  • Instinct开源智能编辑模型终极指南:重新定义代码编写体验
  • 揭秘多模态Agent依赖冲突:如何用Docker实现高效环境隔离
  • 多版本Agent服务共存困境,如何实现Docker平滑升级?
  • 终极指南:3步掌握bilidown下载B站8K超清视频
  • ACadSharp终极指南:5个简单步骤掌握DXF/DWG文件处理
  • Cirq版本混乱导致项目崩溃?资深工程师教你构建可复现的补全开发环境
  • YOLOv8深度性能评测:全面解析FPS、延迟与多维度效率指标评估策略
  • (独家披露)大规模部署云原生Agent时,我们是如何实现Docker资源零浪费的