news 2026/9/19 19:08:53

Datawhale self-llm 实战:基于 Streamlit 与 Transformers 部署 Baichuan2-7B-Chat Web 聊天应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Datawhale self-llm 实战:基于 Streamlit 与 Transformers 部署 Baichuan2-7B-Chat Web 聊天应用

Datawhale self-llm 实战:基于 Streamlit 与 Transformers 部署 Baichuan2-7B-Chat Web 聊天应用

【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外开源大模型(LLM)/多模态大模型(MLLM)教程项目地址: https://gitcode.com/datawhalechina/self-llm

本文是《开源大模型食用指南》(self-llm)中 02-Baichuan-7B-chat+WebDemo.md 的深度实践指南,核心场景是在 AutoDL 等 Linux GPU 云平台上,借助 ModelScope 下载百川智能开源的 Baichuan2-7B-Chat 模型,并用 Streamlit 快速搭建一个可交互的 Web 聊天界面。读完本文你将掌握:GPU 云环境(镜像/换源/依赖)的完整准备流程、ModelScope 大模型下载方法,以及基于 Transformers + Streamlit 编写多轮对话 WebDemo 的完整代码与启动技巧。

Baichuan2 模型简介与 WebDemo 方案选型

Baichuan 2 是百川智能推出的新一代开源大语言模型,采用 2.6 万亿 Tokens 的高质量语料训练,在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸下领先的效果。其开源体系中包含基座模型与对话模型,其中对话模型Baichuan2-7B-Chat针对指令跟随与多轮对话场景进行了专门优化,非常适合作为国产大模型学习与应用的入门选择。

针对这一模型,self-llm 仓库在 models/BaiChuan 目录下提供了多条部署与使用路线,形成完整的对比矩阵:

方案侧重点对应文档
Streamlit WebDemo(本文)快速构建浏览器端多轮聊天 UI,适合演示与产品原型02-Baichuan-7B-chat+WebDemo.md
FastAPI 部署以 API 形式对外提供文本生成服务,适合后端集成01-Baichuan2-7B-chat+FastApi+部署调用.md
LangChain 接入将模型封装为自定义 LLM,支撑知识库、Agent 应用03-Baichuan2-7B-chat接入LangChain框架.md
LoRA 微调基于 PEFT 对模型做高效微调,定制领域能力04-Baichuan2-7B-chat+lora+微调.md

本文聚焦第一条路线:以最小成本、最直观的交互方式让模型"跑起来、聊起来",是学习后续 API 化、框架接入与微调的前提。

环境准备:AutoDL 租用与镜像选择

Baichuan2-7B-Chat 权重规模约 15 GB,以bfloat16精度加载时显存需求较大,官方教程推荐在 AutoDL 平台租用RTX 3090 等 24G 显存的显卡机器,足以单卡加载并流畅推理。

租用实例时镜像选择建议如下(11.3 版本以上的 CUDA 都可以):

  • 框架名称:PyTorch
  • 框架版本:2.0.0
  • Python 版本:3.8(ubuntu20.04)
  • CUDA 版本:11.8

镜像自带 PyTorch 与 CUDA 驱动,能免去手工编译 torch 的繁琐步骤。开机后打开 JupyterLab,并在其中打开终端,后续的环境配置、模型下载与运行演示都在这个终端里完成。

pip 换源与依赖安装

国内网络环境下,建议先对 pip 换用清华源,再安装指定版本依赖,避免下载超时或版本不兼容:

# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install modelscope==1.9.5 pip install transformers==4.35.2 pip install streamlit==1.24.0 pip install sentencepiece==0.1.99 pip install accelerate==0.24.1 pip install transformers_stream_generator==0.0.4

各依赖的职责如下:

  • modelscope 1.9.5:阿里魔搭社区的模型管理工具,负责从 ModelScope Hub 拉取 Baichuan2 权重(对应下载脚本中的snapshot_download);
  • transformers 4.35.2:Hugging Face 的核心框架,提供AutoTokenizerAutoModelForCausalLMGenerationConfig等模型加载与推理组件;
  • streamlit 1.24.0:Web 应用框架,本方案用它把模型包装成浏览器可访问的聊天界面;
  • sentencepiece 0.1.99:Baichuan2 分词器依赖的 SentencePiece 库,缺失会导致AutoTokenizer.from_pretrained报错;
  • accelerate 0.24.1:支撑device_map="auto"的自动设备分配机制;
  • transformers_stream_generator 0.0.4:提供流式生成支持,保证model.generate与 Streamlit 交互兼容。

需要说明的是,以上版本号为官方教程验证过的组合;若采用更高版本,建议以实际环境联调结果为准。此外,pip config set global.index-url的换源配置只对当前用户生效,若需临时换源,可在安装命令后追加-i https://pypi.tuna.tsinghua.edu.cn/simple

使用 ModelScope 下载 Baichuan2-7B-Chat 模型

/root/autodl-tmp路径下新建download.py文件,写入以下内容(记得保存文件),然后执行python /root/autodl-tmp/download.py

import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir = snapshot_download('baichuan-inc/Baichuan2-7B-Chat',cache_dir='/root/autodl-tmp', revision='v1.0.4')

其中:

  • 第一个参数'baichuan-inc/Baichuan2-7B-Chat':ModelScope 上的模型唯一标识,即模型名称;
  • cache_dir='/root/autodl-tmp':模型下载后的存放路径,这里指向 AutoDL 的数据盘目录(/root/autodl-tmp通常挂载在大容量数据盘上,重启实例不丢数据);
  • revision='v1.0.4':模型仓库的版本号,锁定版本可保证后续代码与权重的一致性。

模型总大小约15 GB,视网络带宽不同,下载大概需要10~20 分钟。下载完成后,模型会被放置在/root/autodl-tmp/baichuan-inc/Baichuan2-7B-Chat目录下,该路径将在后续代码中作为模型路径使用。

编写 Streamlit 聊天机器人 chatBot.py

/root/autodl-tmp路径下新建chatBot.py,写入以下代码(含详细注释,可复制直接运行):

# 导入所需的库 from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig import torch import streamlit as st # 在侧边栏中创建一个标题和一个链接 with st.sidebar: st.markdown("## Baichuan2 LLM") st.markdown("开源大模型食用指南 self-llm") # 创建一个滑块,用于选择最大长度,范围在0到1024之间,默认值为512 max_length = st.slider("max_length", 0, 1024, 512, step=1) # 创建一个标题和一个副标题 st.title("💬 Baichuan2 Chatbot") st.caption("🚀 A streamlit chatbot powered by Self-LLM") # 定义模型路径 mode_name_or_path = '/root/autodl-tmp/baichuan-inc/Baichuan2-7B-Chat' # 定义一个函数,用于获取模型和tokenizer @st.cache_resource def get_model(): # 从预训练的模型中获取tokenizer tokenizer = AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_code=True) # 从预训练的模型中获取模型,并设置模型参数 model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, trust_remote_code=True,torch_dtype=torch.bfloat16, device_map="auto") # 从预训练的模型中获取生成配置 model.generation_config = GenerationConfig.from_pretrained(mode_name_or_path) # 设置模型为评估模式 model.eval() return tokenizer, model # 加载Baichuan-7B-chat的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(): # 将用户的输入添加到session_state中的messages列表中 st.session_state.messages.append({"role": "user", "content": prompt}) # 在聊天界面上显示用户的输入 st.chat_message("user").write(prompt) # 构建输入 input_tensor = tokenizer.apply_chat_template(st.session_state.messages, add_generation_prompt=True, return_tensors="pt") # 通过模型获得输出 outputs = model.generate(input_tensor.to(model.device), max_new_tokens=max_length) # 解码模型的输出,并去除特殊标记 response = tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokens=True) # 将模型的输出添加到session_state中的messages列表中 st.session_state.messages.append({"role": "assistant", "content": response}) # 在聊天界面上显示模型的输出 st.chat_message("assistant").write(response)

下面对代码的关键设计逐一展开说明,便于读者理解其底层原理。

模型与分词器加载

tokenizer = AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map="auto")
  • trust_remote_code=True:Baichuan2 的部分实现(如聊天模板、生成逻辑)依赖仓库内自定义代码,需要显式信任远程代码才能正确加载;
  • torch_dtype=torch.bfloat16:以 bfloat16 半精度加载权重,相比 fp32 可将显存占用减半(约 15 GB → 8 GB 上下),同时数值稳定性优于 fp16;
  • device_map="auto":由 accelerate 自动将模型各层分配到可用设备(GPU/CPU)上,单卡场景下等价于整体放入 GPU,多卡/显存不足时会自动切分,降低 OOM 概率;
  • model.eval():将模型切换到评估模式,关闭 Dropout 等训练期行为,保证推理输出稳定。

生成配置的加载

model.generation_config = GenerationConfig.from_pretrained(mode_name_or_path)

GenerationConfig.from_pretrained会读取模型仓库内的generation_config.json,把官方推荐的解码参数(如温度、top_p、重复惩罚等)作为默认值加载,避免手写一堆魔法数字。如果需要自定义生成风格,可以在加载后像 FastAPI 版(见 01-Baichuan2-7B-chat+FastApi+部署调用.md)那样显式修改,例如generation_config.temperature = 0.3generation_config.top_p = 0.85generation_config.top_k = 5generation_config.max_new_tokens = 2048

缓存与多轮对话状态

  • @st.cache_resource:Streamlit 的资源级缓存装饰器,保证页面每次重渲染(如点击按钮、拖动滑块)时模型与分词器只加载一次,不会重复占用显存;
  • st.session_state["messages"]:Streamlit 的会话级状态字典,用来持久化多轮对话历史。代码将整个历史消息列表一并送入模型,实现"有记忆"的多轮聊天;列表初始写入一条助手欢迎语"有什么可以帮您的?"

聊天模板与文本生成

input_tensor = tokenizer.apply_chat_template(st.session_state.messages, add_generation_prompt=True, return_tensors="pt") outputs = model.generate(input_tensor.to(model.device), max_new_tokens=max_length) response = tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokens=True)
  • apply_chat_template:将[{"role": "user"/"assistant", "content": ...}]格式的对话列表按 Baichuan2 官方聊天模板渲染为模型输入序列,add_generation_prompt=True会在末尾追加助手角色的起始标记,提示模型开始作答;
  • model.generate(..., max_new_tokens=max_length):执行自回归生成,max_new_tokens由侧边栏的max_length滑块实时控制(0~1024,默认 512,步长 1);
  • outputs[0][input_tensor.shape[1]:]:从完整输出序列中截掉输入部分,仅保留新生成的 token;
  • tokenizer.decode(..., skip_special_tokens=True):将 token 序列还原为文本并剔除<|im_end|>等特殊标记。

生成完成后,新的回复被追加进st.session_state["messages"]并渲染到界面,构成完整的多轮对话闭环。

启动服务与本地访问

在终端中运行以下命令启动 Streamlit 服务:

streamlit run /root/autodl-tmp/chatBot.py --server.address 127.0.0.1 --server.port 6006

参数含义:

  • --server.address 127.0.0.1:只监听本机回环地址,避免直接暴露公网端口;
  • --server.port 6006:指定服务端口为 6006,与 AutoDL 的端口映射约定保持一致。

随后按照 AutoDL 平台的指示将该端口映射到本地(AutoDL 提供自定义服务/端口映射工具),在本地浏览器打开 http://localhost:6006/,即可看到聊天界面,整体效果如下:

界面左侧侧边栏提供max_length滑块,可实时调节生成的最大 token 数;右侧主区域为对话区,用户输入后模型逐轮作答,体验与主流 Chatbot 产品一致。

运行验证与常见问题排查

验证是否运行成功:终端输出You can now view your Streamlit app...且模型加载日志无报错,即表示服务正常;随后浏览器能打开页面并收到模型回复(如"很高兴见到您!请问有什么问题我可以帮助您解决?")即为链路打通。

常见问题与对策:

  • 显存不足(CUDA out of memory):确认使用 24G 显存机器;检查是否误以 fp32 加载;必要时将max_new_tokens调低;
  • trust_remote_code相关报错:务必在from_pretrained中传入trust_remote_code=True,Baichuan2 依赖仓库内自定义代码;
  • apply_chat_template报错:确认 transformers 版本为 4.35.2(更老版本可能缺少该 API),且已正确加载generation_config
  • 页面反复加载模型:确认get_model@st.cache_resource装饰,否则每次交互都会重新加载权重。

从 WebDemo 走向更完整的应用体系

WebDemo 是理解"模型加载 → 对话编排 → 交互展示"最小闭环的绝佳起点。在此基础上,你可以沿着 self-llm 仓库的 Baichuan 系列教程继续深化:

  • 若需把模型能力封装成标准 HTTP 接口供业务系统调用,可参考 01-Baichuan2-7B-chat+FastApi+部署调用.md,其中还给出了temperaturetop_ptop_kmax_new_tokens等生成参数的手动调优示例;
  • 若需将模型接入 LangChain 构建知识库问答、Agent 等应用,可参考 03-Baichuan2-7B-chat接入LangChain框架.md,核心思路是从langchain.llms.base.LLM继承自定义类并重写_call方法;
  • 若需让模型具备特定领域的对话风格(如角色扮演、领域问答),可参考 04-Baichuan2-7B-chat+lora+微调.md 与同目录下的 04-Baichuan2-7B-chat Lora 微调.ipynb,使用 PEFT 以低显存成本完成指令微调。

以上四篇文档覆盖了"部署 → 服务化 → 框架接入 → 微调"的完整技术链,共同构成 Baichuan2-7B-Chat 的开源大模型食用指南。

【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外开源大模型(LLM)/多模态大模型(MLLM)教程项目地址: https://gitcode.com/datawhalechina/self-llm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 19:05:05

Windows 提示 Internet 安全设置阻止文件?一文讲透 MotW 标记与 exe 排障

今天聊聊一个几乎每个用 Windows 的人都躲不过去的场景&#xff1a;从网盘下载了一个 zip 压缩包&#xff0c;解压以后双击里面的 exe&#xff0c;蹦出来一个提示&#xff0c;内容是“你的internet安全设置阻止打开一个或多个文件”&#xff1b;或者更安静一点——双击了、转圈…

作者头像 李华
网站建设 2026/9/19 19:04:37

ESP32+MAX30102心率检测实战:I2C通信与PPG信号处理全链路解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华