如何在Streamlit中使用本地下载的Llama2-7B-Chat模型?
不用HuggingFace集成Llama 2到Streamlit的方案
你之前遇到的LlamaForCausalLM报错,是因为这个类属于HuggingFace Transformers库,和你要求的「不用HuggingFace方案」完全冲突,那段代码本身就不符合你的需求,自然会报错。下面提供两种无需HuggingFace的可行方案,基于你从Meta官方下载的原始模型文件。
方案一:基于Meta官方Llama代码加载原始权重
准备工作
- 从Meta的Llama仓库中复制
model.py、tokenizer.py和utils.py到你的项目目录(这三个文件是加载原始模型的核心代码)。 - 安装依赖:
pip install torch streamlit sentencepiece
- 确保你的模型文件目录结构如下:
your-project/ ├── app.py ├── model.py ├── tokenizer.py ├── utils.py └── llama-2-7b-chat/ ├── params.json ├── consolidated.pth └── tokenizer.model
Streamlit应用代码(app.py)
import json import torch import streamlit as st from model import ModelArgs, Transformer from tokenizer import Tokenizer # 页面配置 st.set_page_config(page_title="Llama 2 Chat", page_icon="🦙") # 模型路径配置 MODEL_DIR = "./llama-2-7b-chat" TOKENIZER_PATH = f"{MODEL_DIR}/tokenizer.model" PARAMS_PATH = f"{MODEL_DIR}/params.json" WEIGHTS_PATH = f"{MODEL_DIR}/consolidated.pth" # 缓存模型和tokenizer,避免重复加载 @st.cache_resource def load_assets(): # 加载模型参数 with open(PARAMS_PATH, "r") as f: params = json.load(f) model_args = ModelArgs(**params) # 设置运行设备 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model_args.device = device # 初始化并加载模型权重 model = Transformer(model_args) checkpoint = torch.load(WEIGHTS_PATH, map_location=device) model.load_state_dict(checkpoint, strict=False) model.eval() # 加载tokenizer tokenizer = Tokenizer(TOKENIZER_PATH) return model, tokenizer, device # 加载模型和tokenizer model, tokenizer, device = load_assets() # 聊天界面逻辑 st.title("🦙 Llama 2 Chat") # 初始化会话历史 if "messages" not in st.session_state: st.session_state.messages = [] # 展示历史消息 for msg in st.session_state.messages: with st.chat_message(msg["role"]): st.markdown(msg["content"]) # 用户输入处理 if prompt := st.chat_input("输入你的问题..."): # 添加用户消息到历史 st.session_state.messages.append({"role": "user", "content": prompt}) with st.chat_message("user"): st.markdown(prompt) # 生成回复 with st.chat_message("assistant"): with st.spinner("思考中..."): # 编码输入文本 input_ids = tokenizer.encode(prompt, bos=True, eos=False) input_tensor = torch.tensor([input_ids], device=device) # 生成回复 with torch.no_grad(): output = model.generate( input_tensor, max_gen_len=256, temperature=0.7, top_p=0.9 ) # 解码回复文本 response = tokenizer.decode(output[0].tolist(), skip_special_tokens=True) st.markdown(response) # 添加助手回复到历史 st.session_state.messages.append({"role": "assistant", "content": response})
方案二:基于llama.cpp量化模型(适合显存不足场景)
如果你的GPU显存不足(比如小于10GB),可以将原始权重转换为llama.cpp支持的量化格式,大幅降低显存占用。
准备工作
- 克隆llama.cpp仓库,使用
convert.py工具将consolidated.pth转换为GGUF格式,并进行量化(比如Q4_K_M量化)。 - 安装依赖:
pip install streamlit llama-cpp-python
Streamlit应用代码(app.py)
import streamlit as st from llama_cpp import Llama # 量化后的模型路径 MODEL_PATH = "./llama-2-7b-chat.Q4_K_M.gguf" # 缓存模型 @st.cache_resource def load_llm(): return Llama( model_path=MODEL_PATH, n_ctx=2048, # 上下文窗口大小 n_threads=8, # CPU线程数,根据你的CPU调整 n_gpu_layers=-1 # 所有层使用GPU,显存不足时可设为具体数值(比如20) ) llm = load_llm() # 聊天界面逻辑 st.title("🦙 Llama 2 Chat (llama.cpp)") if "messages" not in st.session_state: st.session_state.messages = [] for msg in st.session_state.messages: with st.chat_message(msg["role"]): st.markdown(msg["content"]) if prompt := st.chat_input("输入你的问题..."): st.session_state.messages.append({"role": "user", "content": prompt}) with st.chat_message("user"): st.markdown(prompt) with st.chat_message("assistant"): with st.spinner("思考中..."): # 使用Llama 2官方聊天提示格式 prompt_template = f"""<s>[INST] {prompt} [/INST]""" output = llm( prompt_template, max_tokens=256, temperature=0.7, top_p=0.9, stop=["</s>"], echo=False ) response = output["choices"][0]["text"].strip() st.markdown(response) st.session_state.messages.append({"role": "assistant", "content": response})
关键说明
- 方案一需要至少10GB左右的GPU显存才能流畅运行7B模型,CPU运行会非常缓慢。
- 方案二的量化模型仅需约4GB显存,适合消费级GPU或无GPU环境。
- 若使用方案一,Meta官方的
model.py可能需要根据你的PyTorch版本微调(比如移除过时的API调用)。
内容的提问来源于stack exchange,提问作者user12170926




