You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Streamlit中使用本地下载的Llama2-7B-Chat模型?

不用HuggingFace集成Llama 2到Streamlit的方案

你之前遇到的LlamaForCausalLM报错,是因为这个类属于HuggingFace Transformers库,和你要求的「不用HuggingFace方案」完全冲突,那段代码本身就不符合你的需求,自然会报错。下面提供两种无需HuggingFace的可行方案,基于你从Meta官方下载的原始模型文件。

方案一:基于Meta官方Llama代码加载原始权重

准备工作

  1. 从Meta的Llama仓库中复制model.pytokenizer.pyutils.py到你的项目目录(这三个文件是加载原始模型的核心代码)。
  2. 安装依赖:
pip install torch streamlit sentencepiece
  1. 确保你的模型文件目录结构如下:
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支持的量化格式,大幅降低显存占用。

准备工作

  1. 克隆llama.cpp仓库,使用convert.py工具将consolidated.pth转换为GGUF格式,并进行量化(比如Q4_K_M量化)。
  2. 安装依赖:
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

火山引擎 最新活动