尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DeepSeek-R1-Distill-Qwen-7B WebDemo 部署:用 Streamlit 构建带“思考过程“展示的推理聊天界面

DeepSeek-R1-Distill-Qwen-7B WebDemo 部署:用 Streamlit 构建带“思考过程“展示的推理聊天界面 DeepSeek-R1-Distill-Qwen-7B WebDemo 部署用 Streamlit 构建带思考过程展示的推理聊天界面【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm本指南基于《开源大模型食用指南》仓库完整讲解如何在 Linux CUDA 环境下用 Streamlit 将 DeepSeek-R1-Distill-Qwen-7B 部署为一个可交互的 WebDemo 聊天界面。读完本文你将掌握模型下载、Streamlit 对话应用编写、R1 系列think思考过程的分割展示以及本地服务的启动与访问方法。为什么需要 WebDemo让推理模型的思考过程可见DeepSeek-R1 系列模型最显著的特点是先思考、后作答模型在给出最终答案前会在一对think与/think标签之间生成一段完整的推理过程。根据仓库内 DeepSeek-R1-Distill-Qwen 模型介绍 的说明DeepSeek-R1-Zero 通过大规模强化学习RL训练无需监督微调SFT即可表现出色的推理行为后续的 DeepSeek-R1 则在强化学习之前整合了冷启动数据以解决无休止重复、可读性差和语言混合等问题并基于 Llama 和 Qwen 蒸馏出包括 DeepSeek-R1-Distill-Qwen-7B 在内的六个密集模型。DeepSeek-R1-Distill-Qwen-7B 正是从 R1 蒸馏到 Qwen 架构上的 7B 级推理模型可以在单卡如 AutoDL 等云平台的消费级 GPU上运行。用 Streamlit 部署 WebDemo 的价值在于以浏览器聊天界面的形式直观验证模型的对话与推理能力借助st.expander折叠组件将/think之前的推理过程与最终答案分层展示把 R1 系列模型的特色完整呈现给使用者代码结构简单清晰便于在此基础上扩展为知识库助手、Agent 应用等更复杂的形态。本文的完整实操主线如下环境准备 → 模型下载 → 编写 chatBot.py → 启动 Streamlit 服务 → 浏览器交互验证。一、环境准备本文默认基础环境如下对应的完整依赖清单与其余部署形态FastAPI、LangChain、vLLM可在本仓库该模型的系列文档中交叉验证---------------- ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0 ----------------默认学习者已安装好以上 Pytorch(CUDA) 环境如未安装请自行安装。1. pip 换源并安装依赖在国内网络环境下先升级 pip 并切换为清华 PyPI 镜像源可显著加速依赖包下载# 升级 pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install transformers4.48.2 pip install accelerate1.3.0 pip install modelscope1.22.3 pip install streamlit1.41.1各依赖在本次 WebDemo 部署中的职责如下依赖包版本作用transformers4.48.2加载并运行模型与分词器AutoModelForCausalLM / AutoTokenizeraccelerate1.3.0支持device_mapauto自动设备分配实现多设备/显存受限场景下的加载modelscope1.22.3从国内 ModelScope 平台下载模型权重snapshot_downloadstreamlit1.41.1构建 Web 聊天界面、会话状态管理st.session_state与资源缓存st.cache_resource若本地环境配置遇到困难仓库在 AutoDL 等云平台准备了 DeepSeek-R1-Distill-Qwen 的现成环境镜像可直接创建实例使用省去手动装环境的步骤。同时建议参考 General-Setting 中的环境与模型下载说明 了解国内下载模型的更多细节。二、模型下载使用modelscope中的snapshot_download函数从国内镜像下载模型权重。第一个参数为模型名称cache_dir参数指定模型在本地磁盘的下载路径revision指定分支版本。新建model_download.py文件并输入以下内容保存后运行python model_download.py执行下载from modelscope import snapshot_download model_dir snapshot_download(deepseek-ai/DeepSeek-R1-Distill-Qwen-7B, cache_dir/root/autodl-tmp, revisionmaster)注意记得把cache_dir修改为你的模型下载路径。模型体积约 15GB 左右下载耗时取决于网络带宽请耐心等待。下载完成后模型文件将组织在cache_dir下以模型名命名的目录中例如/root/autodl-tmp/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B。该路径就是后续代码中mode_name_or_path要指向的位置。三、编写 chatBot.pyWebDemo 核心代码新建chatBot.py文件并输入以下内容保存后即可运行。下面代码有很详细的注释逐模块拆解可参见后文。from transformers import AutoTokenizer, AutoModelForCausalLM import torch import streamlit as st import re # 在侧边栏中创建一个标题和一个链接 with st.sidebar: st.markdown(## DeepSeek-R1-Distill-Qwen-7B LLM) st.markdown(开源大模型食用指南 self-llm) # 创建一个滑块用于选择最大长度范围在 0 到 8192 之间默认值为 8192 # DeepSeek-R1-Distill-Qwen-7B 支持 128K 上下文并能生成最多 8K tokens # 我们推荐设为 8192因为思考需要输出更多的 Token 数 max_length st.slider(max_length, 0, 8192, 8192, step1) # 创建一个标题和一个副标题 st.title( DeepSeek R1 Distill Chatbot) st.caption( A streamlit chatbot powered by Self-LLM) # 定义模型路径 mode_name_or_path /root/autodl-tmp/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B # 文本分割函数 def split_text(text): pattern re.compile(rthink(.*?)/think(.*), re.DOTALL) # 定义正则表达式模式 match pattern.search(text) # 匹配 think思考过程/think回答 if match: # 如果匹配到思考过程 think_content match.group(1).strip() # 获取思考过程 answer_content match.group(2).strip() # 获取回答 else: think_content # 如果没有匹配到思考过程则设置为空字符串 answer_content text.strip() # 直接返回回答 return think_content, answer_content # 定义一个函数用于获取模型和 tokenizer st.cache_resource def get_model(): # 从预训练的模型中获取 tokenizer tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) tokenizer.pad_token tokenizer.eos_token # 从预训练的模型中获取模型并设置模型参数 model AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtypetorch.bfloat16, device_mapauto) return tokenizer, model # 加载 Qwen2.5 的 model 和 tokenizer tokenizer, model get_model() # 如果 session_state 中没有 messages则创建一个包含默认消息的列表 if messages not in st.session_state: st.session_state[messages] [{role: assistant, content: 有什么可以帮您的}] # 遍历 session_state 中的所有消息并显示在聊天界面上 for msg in st.session_state.messages: st.chat_message(msg[role]).write(msg[content]) # 如果用户在聊天输入框中输入了内容则执行以下操作 if prompt : st.chat_input(): # 在聊天界面上显示用户的输入 st.chat_message(user).write(prompt) # 将用户输入添加到 session_state 中的 messages 列表中 st.session_state.messages.append({role: user, content: prompt}) # 将对话输入模型获得返回 input_ids tokenizer.apply_chat_template(st.session_state.messages,tokenizeFalse,add_generation_promptTrue) model_inputs tokenizer([input_ids], return_tensorspt).to(cuda) generated_ids model.generate(model_inputs.input_ids,max_new_tokensmax_length) generated_ids [ output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids) ] response tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0] think_content, answer_content split_text(response) # 调用 split_text 函数分割思考过程和回答 # 将模型的输出添加到 session_state 中的 messages 列表中 st.session_state.messages.append({role: assistant, content: response}) # 在聊天界面上显示模型的输出 with st.expander(模型思考过程): st.write(think_content) # 展示模型思考过程 st.chat_message(assistant).write(answer_content) # 输出模型回答 # print(st.session_state) # 打印 session_state 调试代码中的mode_name_or_path需要修改为你实际的模型下载路径。原示例代码在侧边栏以 Markdown 链接形式展示本教程项目仓库读者可通过git clone https://gitcode.com/datawhalechina/self-llm获取本仓库全部教程与配套代码。3.1 侧边栏max_length 滑块的语义with st.sidebar: st.markdown(## DeepSeek-R1-Distill-Qwen-7B LLM) max_length st.slider(max_length, 0, 8192, 8192, step1)滑块范围0~8192默认值8192。它直接控制生成阶段的最大新 token 数max_new_tokensmax_length。之所以推荐8192是因为 DeepSeek-R1-Distill-Qwen-7B 在输出最终答案前会先生成较长的推理链think内容生成上限过小会导致推理被截断、答案质量下降。这一点在仓库 vLLM 部署文档 中同样体现其代码同样将max_tokens设为 8K 并注释思考需要输出更多的 Token 数。3.2 split_text解析think推理链R1 系列模型遵循think思考过程/think回答内容的输出格式。split_text用正则表达式rthink(.*?)/think(.*)配合re.DOTALL使.可匹配换行符做非贪婪匹配将输出一分为二match.group(1)think与/think之间的思考过程match.group(2)/think之后的正式回答未匹配到时模型未输出思考标签思考内容置为空字符串整个输出直接作为回答展示。该函数的实现在仓库 FastAPI 部署文档 的api.py中完全一致同一段正则、同样的分组逻辑属于 R1 系列部署中共用的关键解析逻辑可以放心复用。3.3 get_model模型加载与缓存st.cache_resource def get_model(): tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) tokenizer.pad_token tokenizer.eos_token model AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtypetorch.bfloat16, device_mapauto) return tokenizer, modelst.cache_resourceStreamlit 每次脚本重跑时被该装饰器修饰的函数结果会被全局缓存模型权重只加载一次避免每次交互都重新占用显存。torch_dtypetorch.bfloat16以 BF16 精度加载权重相比 FP16 显存占用相同但数值稳定性更好是 7B 级模型单卡推理的常见选择。device_mapauto由 accelerate 自动把模型各层分配到可用设备GPU/CPU在显存不足时会自动启用 CPU offload。trust_remote_codeTrue允许加载模型仓库中的自定义代码tokenizer.pad_token tokenizer.eos_token为分词器补齐 pad 标记避免批处理时告警。3.4 对话循环chat template 与流式会话if messages not in st.session_state: st.session_state[messages] [{role: assistant, content: 有什么可以帮您的}]st.session_state在浏览器会话级别持久化保证多轮对话历史不因页面重跑而丢失初始写入一条助手的欢迎语。用户输入后先渲染用户气泡再把消息追加进messages列表随后构造生成请求input_ids tokenizer.apply_chat_template(st.session_state.messages, tokenizeFalse, add_generation_promptTrue) model_inputs tokenizer([input_ids], return_tensorspt).to(cuda) generated_ids model.generate(model_inputs.input_ids, max_new_tokensmax_length)apply_chat_template按照模型的对话模板Qwen 系 ChatML 格式把多轮消息拼成带system/user/assistant标记的提示词add_generation_promptTrue表示在末尾补上模型回复的起始标记返回字符串后再交给tokenizer做批处理并移到 CUDA 上。同样用法也出现在仓库 FastAPI 部署文档 与 LangChain 接入文档 中是整个仓库部署 R1 系列的标准调用方式。生成完成后通过output_ids[len(input_ids):]截掉输入部分batch_decode(..., skip_special_tokensTrue)还原为纯文本再交给split_text拆出思考与回答。最后用st.expander(模型思考过程)把推理链收进可折叠面板而正式回答直接以 assistant 气泡展示界面层级清晰。四、运行 demo在终端中运行以下命令启动 Streamlit 服务--server.port可更换端口streamlit run chatBot.py --server.address 127.0.0.1 --server.port 6006--server.address 127.0.0.1仅监听本机回环地址适合本机调试或配合 SSH 隧道/平台端口映射访问--server.port 6006服务监听端口可自由更换如使用云平台时可与平台开放的自定义端口对应起来具体开放端口方法参见 General-Setting 开放端口教程。首次启动需要加载约 15GB 的模型权重到显存BF16 下约占 14GB 左右请耐心等待加载完成。随后在本地浏览器打开 http://localhost:6006/ 即可看到部署好的 WebDemo 聊天界面。运行效果如下图所示界面中可以看到模型回答被组织成层级清晰的分点内容在正式回答之上通过折叠面板可以展开模型的思考过程直观体验 R1 系列推理-作答的两阶段输出。五、关键参数与调优建议结合仓库内该模型的系列部署文档以下参数对 WebDemo 的体验影响最大参数建议取值说明max_length / max_new_tokens8192R1 推理链较长生成上限过小会截断思考过程。模型支持 128K 上下文、最多生成 8K tokens采样温度 temperature0.5 ~ 0.7推荐 0.6来自仓库 vLLM 部署文档中转述的 DeepSeek 官方建议温度过高会引入噪声过低则降低多样性top_p0.95核心采样概率阈值与 temperature 配合控制输出多样性prompt 结尾建议追加think\n在 vLLM 部署文档 的离线脚本与 OpenAI 兼容接口示例中均按官方建议在每个 prompt 末尾显式追加think\n以触发推理链数学推理类内容还可补充Please reason step by step, and put your final answer within \boxed{}类指令说明WebDemo 中的chatBot.py通过apply_chat_template走的是聊天模板路径而 vLLM 示例中的裸 prompt 方式需要手动追加think\n。若想显式触发思考链也可以在聊天输入内容后拼接该标记再送入模板两种方式均兼容。六、从 WebDemo 走向更多部署形态本次 WebDemo 适合本地调试、效果演示与教学场景若需要对外提供服务或追求更高吞吐仓库为同一模型提供了完整的姊妹教程可直接对照使用DeepSeek-R1-Distill-Qwen-7B FastAPI 部署调用基于 FastAPI Uvicorn 暴露 POST 接口返回response/think/answer结构化字段并包含torch_gc显存回收与请求日志DeepSeek-R1-Distill-Qwen-7B Langchain 接入自定义DeepSeek_R1_Distill_Qwen_LLM子类将本地模型无缝接入 LangChain 生态DeepSeek-R1-Distill-Qwen-7B vLLM 部署调用使用 vLLM 的 PagedAttention 与连续批处理获得更高吞吐并可直接启动兼容 OpenAI 协议的 API Server。这些文档与本文共享同一套环境配置、模型下载方式与think解析逻辑任意一篇跑通后再阅读其余文档均可实现低成本迁移。总结本文完整复现了 DeepSeek-R1-Distill-Qwen-7B 的 Streamlit WebDemo 部署流程从 pip 换源与依赖安装、ModelScope 模型下载到chatBot.py中侧边栏参数、split_text思考链解析、get_model缓存加载、apply_chat_template多轮对话四大模块的逐行解析再到启动服务与浏览器验证。基于这份代码你可以轻松将界面接入 LangChain 知识库、改造为流式输出streamlit的st.write_stream或替换为其他 Qwen 系蒸馏模型快速搭建属于自己的推理模型演示应用。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表