ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

使用 Streamlit 部署 Phi-3-mini-4k-instruct WebDemo 聊天界面:self-llm 实战指南

2026/9/12 6:19:18 拓冰建站 浏览量
使用 Streamlit 部署 Phi-3-mini-4k-instruct WebDemo 聊天界面:self-llm 实战指南 使用 Streamlit 部署 Phi-3-mini-4k-instruct WebDemo 聊天界面self-llm 实战指南【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm本篇技术指南基于《开源大模型食用指南》项目self-llm中的 Phi-3 WebDemo 部署文档完整讲解如何在 AutoDL 等 Linux GPU 环境中从零搭建基于 Streamlit 的 Phi-3-mini-4k-instruct 在线聊天 Web 应用。读完本文你将掌握 GPU 租用与镜像选择、pip 换源与依赖安装、ModelScope 模型下载、Streamlit 多轮对话界面的完整代码实现以及通过 SSH 端口映射在本地浏览器访问服务的整套实战流程。一、环境准备租用 GPU 实例与选择镜像Phi-3-mini-4k-instruct 是一个约 3.8B 参数的轻量级对话模型以 bfloat16 半精度加载时大约需要 8~15 GB 显存不同量化与加载方式有差异。为了留出模型加载与推理的余量推荐在 autodl 平台租赁一块3090 等 24G 显存的显卡机器。租赁实例时在镜像选择界面按下图所示选择框架PyTorch框架版本2.1.0Python 版本3.10(ubuntu20.04)CUDA 版本12.1镜像选择完成后打开刚租用服务器的JupyterLab并在其中打开终端后续的环境配置、模型下载和 demo 运行都在终端中完成。仓库中 Lora 微调文档 使用的镜像组合为PyTorch--2.1.0--3.10(ubuntu22.04)--12.1与本篇选型一致可相互参考。二、安装依赖pip 换源与依赖包说明2.1 升级 pip 并更换国内源国内网络环境下直接安装大型 Python 包可能较慢建议先换源再安装# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这里使用清华大学 PyPI 镜像作为全局源更多换源细节可参考仓库通用教程 01-pip、conda换源。2.2 安装依赖包pip install modelscope1.11.0 pip install langchain0.1.15 pip install transformers4.40.0 accelerate tiktoken einops scipy transformers_stream_generator0.1.16 pip install streamlit各依赖包在本场景中的作用如下依赖包版本要求作用modelscope1.11.0阿里开源的模型下载与推理框架用于从 ModelScope 社区拉取 Phi-3 权重langchain0.1.15LLM 应用开发框架本教程环境统一安装便于后续接入 LangChain 知识库助手 等场景transformers4.40.0加载与运行 Phi-3-mini-4k-instruct 的核心依赖Phi-3 系列要求较新的 transformers 版本才能正确解析其分词器与模型结构accelerate最新版支持device_map、多卡/半精度加载tiktoken—OpenAI 风格分词工具部分 tokenizer 的依赖einops—张量重排工具部分注意力实现依赖scipy—科学计算库部分采样/注意力逻辑依赖transformers_stream_generator0.1.16流式文本生成扩展为流式输出预留能力streamlit最新版Web UI 框架本教程的聊天界面即由其构建补充说明Phi-3 对 transformers 版本较敏感。同目录下的 FastApi 部署文档 中特别提示Phi-3 曾要求4.41.0.dev0版本的 transformers可通过pip list | grep transformers检查当前版本若加载模型报错可按该文档方式升级 transformers。在完整复现本教程遇到版本问题时可优先检查这一项。提示考虑到部分同学配置环境可能会遇到问题仓库在 AutoDL 平台准备了适用于 Phi-3 全系部署教程的环境镜像可直接基于该镜像创建实例跳过重复的环境安装步骤。三、模型下载使用 ModelScope snapshot_download使用 modelscope 中的snapshot_download函数下载模型第一个参数model_id为模型名称LLM-Research/Phi-3-mini-4k-instruct参数cache_dir为模型的下载路径revisionmaster指定分支。在/root/autodl-tmp路径下新建model_download.py文件写入以下内容并保存import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(LLM-Research/Phi-3-mini-4k-instruct, cache_dir/root/autodl-tmp, revisionmaster)然后执行下载python /root/autodl-tmp/model_download.py模型大小约为 15 GB在 AutoDL 的内网带宽下下载大概需要 2 分钟左右。下载完成后模型权重会落在/root/autodl-tmp/LLM-Research/Phi-3-mini-4k-instruct目录下这也是后续代码中mode_name_or_path所指向的路径。关于模型下载的更多方式可参考仓库通用教程 03-模型下载。四、编写 WebDemochatBot.py 完整实现与逐段解析在/root/autodl-tmp路径下新建chatBot.py文件写入以下完整代码并保存。这份代码基于 Streamlit 构建了一个支持多轮对话的聊天界面下面分模块逐段解读。from transformers import AutoTokenizer, AutoModelForCausalLM import torch import streamlit as st # 在侧边栏中创建一个标题和一个链接 with st.sidebar: st.markdown(## Phi-3 LLM) 开源大模型食用指南 self-llm # 创建一个标题和一个副标题 st.title( Phi-3 Chatbot) st.caption( A streamlit chatbot powered by Self-LLM) # 定义模型路径 mode_name_or_path /root/autodl-tmp/LLM-Research/Phi-3-mini-4k-instruct # 定义一个函数用于获取模型和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, trust_remote_codeTrue).cuda() return tokenizer, model def bulid_input(prompt, history[]): system_formats|system|\n{content}|end|\n user_format|user|\n{content}|end|\n assistant_format|assistant|\n{content}|end|\n history.append({role:user,content:prompt}) prompt_str # 拼接历史对话 for item in history: if item[role]user: prompt_struser_format.format(contentitem[content]) else: prompt_strassistant_format.format(contentitem[content]) return prompt_str |assistant|\n # 加载Phi-3的model和tokenizer tokenizer, model get_model() # 如果session_state中没有messages则创建一个包含默认消息的列表 if messages not in st.session_state: st.session_state[messages] [] # 遍历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) # 构建输入 input_str bulid_input(promptprompt, historyst.session_state[messages]) input_ids tokenizer.encode(input_str, add_special_tokensFalse, return_tensorspt).cuda() outputs model.generate( input_idsinput_ids, max_new_tokens512, do_sampleTrue, top_p0.9, temperature0.5, repetition_penalty1.1, eos_token_idtokenizer.encode(|endoftext|)[0] ) outputs outputs.tolist()[0][len(input_ids[0]):] response tokenizer.decode(outputs) response response.split(|end|)[0] st.session_state.messages.append({role: assistant, content: response}) # 在聊天界面上显示模型的输出 st.chat_message(assistant).write(response) # 输出当前session_state中的内容方便后续的debug print(st.session_state)4.1 页面骨架侧边栏、标题与副标题with st.sidebar: st.markdown(## Phi-3 LLM) 开源大模型食用指南 self-llm st.title( Phi-3 Chatbot) st.caption( A streamlit chatbot powered by Self-LLM)with st.sidebar:在左侧侧边栏区域放置标题文本标识当前部署的模型与项目来源st.title/st.caption定义页面主标题与副标题变量mode_name_or_path指向第 3 节模型下载得到的本地目录/root/autodl-tmp/LLM-Research/Phi-3-mini-4k-instruct。4.2 模型加载缓存资源与半精度推理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, trust_remote_codeTrue).cuda() return tokenizer, modelst.cache_resource是 Streamlit 的资源缓存装饰器get_model()只在首次请求时真正加载模型后续每次页面重跑Streamlit 脚本在每次交互时都会重跑都直接复用缓存避免重复加载 15 GB 权重导致的卡顿trust_remote_codeTruePhi-3 属于自定义远程代码模型必须开启该参数才能从模型目录加载其自定义实现tokenizer.pad_token tokenizer.eos_tokenPhi-3 未显式定义 pad_token此处将 eos_token 作为 pad_token 复用保证批量编码/生成时不报错torch_dtypetorch.bfloat16以 bfloat16 半精度加载模型显著降低显存占用309024G可以轻松容纳随后通过.cuda()将模型搬移到 GPU。4.3 Prompt 模板构建遵循 Phi-3 的对话格式def bulid_input(prompt, history[]): system_formats|system|\n{content}|end|\n user_format|user|\n{content}|end|\n assistant_format|assistant|\n{content}|end|\n history.append({role:user,content:prompt}) prompt_str for item in history: if item[role]user: prompt_struser_format.format(contentitem[content]) else: prompt_strassistant_format.format(contentitem[content]) return prompt_str |assistant|\n原文档中的函数名为bulid_input即 build input 的笔误保留原样以保证与仓库文件一致。Phi-3-mini-4k-instruct 采用 ChatML 风格的角色标签式 Prompt 模板其标准结构如下参见 Lora 微调文档 对模板的说明s|system| You are a helpful assistant|end| |user| 你是谁|end| |assistant| 我是一个有用的助手。|end|该函数做三件事将本轮用户输入追加到历史消息列表history中遍历全部历史消息按角色user/assistant套用对应的user_format/assistant_format模板逐条拼装在末尾追加|assistant|\n指示模型从助手回答位置开始续写。这套模板与 FastApi 部署文档中tokenizer.apply_chat_template(...)的底层逻辑一致见 01-FastApi 部署调用只不过这里手动实现了模板拼接便于读者直观理解 Phi-3 的对话格式。4.4 会话状态与生成逻辑if messages not in st.session_state: st.session_state[messages] [] 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) input_str bulid_input(promptprompt, historyst.session_state[messages]) input_ids tokenizer.encode(input_str, add_special_tokensFalse, return_tensorspt).cuda() outputs model.generate( input_idsinput_ids, max_new_tokens512, do_sampleTrue, top_p0.9, temperature0.5, repetition_penalty1.1, eos_token_idtokenizer.encode(|endoftext|)[0] ) outputs outputs.tolist()[0][len(input_ids[0]):] response tokenizer.decode(outputs) response response.split(|end|)[0] st.session_state.messages.append({role: assistant, content: response}) st.chat_message(assistant).write(response) print(st.session_state)这段代码是 WebDemo 的核心交互循环会话状态管理st.session_state[messages]跨重跑保存全部对话历史rolecontent字典列表保证多轮对话时上下文不丢失页面每次刷新时通过st.chat_message(msg[role]).write(msg[content])渲染历史消息输入捕获st.chat_input()返回用户输入借助海象运算符:只有非空输入才进入生成分支编码tokenizer.encode(input_str, add_special_tokensFalse, return_tensorspt).cuda()将模板化文本编码为 token id 张量并送入 GPUadd_special_tokensFalse避免重复添加 BOS 等特殊 token模板首部的s已经承担了 BOS 角色生成参数可调参数取值含义max_new_tokens512最多新生成的 token 数控制回答长度上限do_sampleTrue开启随机采样使输出更多样top_p0.9核采样nucleus sampling阈值仅从累积概率 90% 的 token 中采样temperature0.5采样温度越低越确定、越高越发散0.5 为偏保守取值repetition_penalty1.1重复惩罚系数抑制词句重复eos_token_idtokenizer.encode(|endoftext|)[0]生成结束符 token id遇到即停止生成后处理outputs.tolist()[0][len(input_ids[0]):]仅截取新生成的部分去掉输入前缀tokenizer.decode(outputs)还原为文本response.split(|end|)[0]截断到第一个|end|丢弃角色结束标记之后的残余内容得到干净的回答回写界面将回答追加到st.session_state[messages]并调用st.chat_message(assistant).write(response)实时渲染print(st.session_state)将当前会话状态输出到终端方便调试。五、运行 demo启动 Streamlit 服务与端口映射5.1 启动服务在终端中运行以下命令启动 Streamlit 服务streamlit run /root/autodl-tmp/chatBot.py --server.address 127.0.0.1 --server.port 6006streamlit run指定脚本路径/root/autodl-tmp/chatBot.py--server.address 127.0.0.1将服务绑定在本机回环地址仅限服务器本机访问安全且为后续 SSH 隧道转发做准备--server.port 6006固定监听 6006 端口与后续端口映射命令保持一致。5.2 SSH 端口映射AutoDL 等云 GPU 实例通常位于内网本地浏览器无法直接访问。需要将本地 6006 端口通过 SSH 隧道转发到服务器 6006 端口其中xxxx需替换为你的容器实例对应端口号ssh -CNg -L 6006:127.0.0.1:6006 rootconnect.westc.gpuhub.com -p xxxx命令参数说明-C启用压缩传输-N不执行远程命令仅建立隧道-g允许远程主机连接本地转发端口-L 6006:127.0.0.1:6006将本地本机6006 端口映射到远端服务器 127.0.0.1:6006-p xxxxAutoDL 分配的 SSH 端口号。映射完成后在本地浏览器中打开http://localhost:6006/即可看到 Phi-3 Chatbot 聊天界面直接在输入框中与 Phi-3-mini-4k-instruct 进行多轮对话。关于端口映射的通用方法可参考仓库通用教程 02-AutoDL开放端口。六、延伸从源码看 Phi-3 的完整部署生态本文的 WebDemo 属于 self-llm 仓库中 Phi-3 系列教程的交互式 Web 部署环节仓库 models/phi-3 目录下提供了同一模型的完整部署矩阵可按需组合使用01-FastApi 部署调用以 FastAPI Uvicorn 构建 REST API使用tokenizer.apply_chat_template自动套用对话模板适合作为后端服务被其他程序调用curl / Postman 均可测试02-langchain 接入继承langchain.llms.base.LLM封装自定义 LLM 类使 Phi-3 以统一接口接入 LangChain 生态为搭建知识库助手等 Agent 应用铺路04-Lora 微调基于 transformers peft 对 Phi-3 进行 LoRA 高效微调配套 notebook 见 Phi-3-mini-4k-Instruct-Lora.ipynb微调所用数据集位于仓库根目录 dataset/huanhuan.json。部署 WebDemo 时对模型路径/root/autodl-tmp/LLM-Research/Phi-3-mini-4k-instruct的约定与上述教程保持完全一致如果你先完成了 Lora 微调也可以在get_model()中加载PeftModel合并后的权重将微调后的个性化模型直接接入本 WebDemo 界面进行对话验证。七、总结至此你已经完成了 Phi-3-mini-4k-instruct WebDemo 的完整部署在 AutoDL 租用 24G 显存 GPU 实例并选择PyTorch 2.1.0 / Python 3.10 / CUDA 12.1镜像通过清华源快速安装modelscope、transformers、streamlit等依赖使用snapshot_download将约 15 GB 的 Phi-3 权重下载到本地编写chatBot.py实现基于 ChatML 模板的多轮对话界面并理解每个生成参数的作用通过streamlit run启动服务并借助 SSH 隧道在http://localhost:6006/完成本地访问。这套环境准备 → 依赖安装 → 模型下载 → 界面代码 → 端口映射的流程同样适用于仓库中其他模型的 WebDemo 部署如 ChatGLM、Qwen、InternLM 等系列见 support_model.md掌握本文后你可以轻松将其迁移到其他模型上。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考