DeepSeek-R1-Distill-Qwen-7B本地部署方案指南

有人相爱,有人夜里看海,有人还在coding

1.WEB网页版本

1. 环境准备


ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0


pip依赖包

​
升级 pip

python -m pip install --upgrade pip

更换 pypi 源加速库的安装

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install transformers==4.48.2 pip install accelerate==1.3.0 pip install modelscope==1.22.3 pip install streamlit==1.41.1

​

2.模型下载

使用 modelscope 中的 snapshot_download 函数下载模型,第一个参数为模型名称,参数 cache_dir 为模型的下载路径。

新建 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', revision='master')

3.代码准备

新建 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")
    "[开源大模型食用指南 self-llm](https://github.com/datawhalechina/self-llm.git)"
    # 创建一个滑块,用于选择最大长度,范围在 0 到 8192 之间,默认值为 8192(DeepSeek-R1-Distill-Qwen-7B 支持 128K 上下文,并能生成最多 8K tokens,我们推荐设为 8192,因为思考需要输出更多的Token数)
    max_length = st.slider("max_length", 0, 8192, 8192, step=1)

# 创建一个标题和一个副标题
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(r'<think>(.*?)</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_code=True)
    tokenizer.pad_token = tokenizer.eos_token
    # 从预训练的模型中获取模型,并设置模型参数
    model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtype=torch.bfloat16,  device_map="auto")

    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,tokenize=False,add_generation_prompt=True)
    model_inputs = tokenizer([input_ids], return_tensors="pt").to('cuda')
    generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=max_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_tokens=True)[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 调试 

3.运行DEMO

在终端中运行以下命令,启动 streamlit 服务,server.port 可以更换端口

streamlit run chatBot.py --server.address 127.0.0.1 --server.port 6006

在本地浏览器中打开链接 http://127.0.0.1:6006/ ,即可查看部署的 WebDemo 聊天界面。运行效果如下:

注意:出现下面展示表示运行成功。

2. API接口版本

1.环境准备


ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0


首先 pip 换源加速下载并安装依赖包

# 升级pip
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install requests==2.32.3
pip install fastapi==0.115.8
pip install uvicorn==0.34.0
pip install transformers==4.48.2
pip install huggingface-hub==0.28.1
pip install accelerate==1.3.0
pip install modelscope==1.22.3

2.模型下载

使用 modelscope 中的 snapshot_download 函数下载模型,第一个参数为模型名称,参数 cache_dir 为模型的下载路径。

新建 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', revision='master')

3.代码准备

新建 api.py 文件并在其中输入以下内容,粘贴代码后请及时保存文件.

from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModelForCausalLM
import uvicorn
import json
import datetime
import torch
import re

# 设置设备参数
DEVICE = "cuda"  # 使用CUDA
DEVICE_ID = "0"  # CUDA设备ID,如果未设置则为空
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE  # 组合CUDA设备信息

# 清理GPU内存函数
def torch_gc():
    if torch.cuda.is_available():  # 检查是否可用CUDA
        with torch.cuda.device(CUDA_DEVICE):  # 指定CUDA设备
            torch.cuda.empty_cache()  # 清空CUDA缓存
            torch.cuda.ipc_collect()  # 收集CUDA内存碎片
# 文本分割函数
def split_text(text):
    pattern = re.compile(r'<think>(.*?)</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

# 创建FastAPI应用
app = FastAPI()

# 处理POST请求的端点
@app.post("/")
async def create_item(request: Request):
    global model, tokenizer  # 声明全局变量以便在函数内部使用模型和分词器
    json_post_raw = await request.json()  # 获取POST请求的JSON数据
    json_post = json.dumps(json_post_raw)  # 将JSON数据转换为字符串
    json_post_list = json.loads(json_post)  # 将字符串转换为Python对象
    prompt = json_post_list.get('prompt')  # 获取请求中的提示

    messages = [
            {"role": "user", "content": prompt}
    ]

    # 调用模型进行对话生成
    input_ids = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True)
    model_inputs = tokenizer([input_ids], return_tensors="pt").to(model.device)
    generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=8192) # 思考需要输出更多的Token数,设为8K
    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_tokens=True)[0]
    think_content, answer_content = split_text(response) # 调用split_text函数,分割思考过程和回答
    now = datetime.datetime.now()  # 获取当前时间
    time = now.strftime("%Y-%m-%d %H:%M:%S")  # 格式化时间为字符串
    # 构建响应JSON
    answer = {
        "response": response,
        "think": think_content,
        "answer": answer_content,
        "status": 200,
        "time": time
    }
    # 构建日志信息
    log = f"[{time}], prompt:\"{prompt}\", response:\"{repr(response)}\", think:\"{think_content}\", answer:\"{answer_content}\""
    print(log)  # 打印日志
    torch_gc()  # 执行GPU内存清理
    return answer  # 返回响应

# 主函数入口
if __name__ == '__main__':
    # 加载预训练的分词器和模型
    model_name_or_path = '/root/autodl-tmp/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B'
    tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=False)
    model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map=CUDA_DEVICE, torch_dtype=torch.bfloat16)

    # 启动FastAPI应用
    # 用6006端口可以将autodl的端口映射到本地,从而在本地使用api
    uvicorn.run(app, host='0.0.0.0', port=6006, workers=1)  # 在指定端口和主机上启动应用

4.Api 部署

python api.py

结果线上成功

5.本地调用服务

import requests
import json

def get_completion(prompt):
    headers = {'Content-Type': 'application/json'}
    data = {"prompt": prompt}
    response = requests.post(url='http://127.0.0.1:6006', headers=headers, data=json.dumps(data))
    return response.json()['response']

if __name__ == '__main__':
    print(get_completion('请写一份出行计划北京'))

1.返回结果(思考内容结果)

D:\python\python312\.venv\Scripts\python.exe D:\workspace\pythonwork\spiderflow\deepseek_demo.py 
<think>
嗯,用户让我写一份出行计划北京,我得先想想用户可能是谁。可能是一个游客,计划去北京旅游,或者是一个商务人士,要去北京出差。无论是哪种情况,用户都需要一个详细的计划,包括行程安排、交通、住宿、饮食等等。

首先,我应该确定用户的出发时间,是早上还是晚上出发。如果是旅游的话,可能早上出发比较合理,这样有更多时间安排景点。接着,列出主要的景点,比如故宫、天坛、长城这些必去的地方,还有现代景点比如鸟巢、水立方这些。

然后,考虑交通方式。北京的公共交通很发达,地铁和公交是主要的,但考虑到景点分散,可能需要打车或者包车,尤其是像故宫这样的景点,距离比较远,打车可能更快捷。另外,交通卡比较方便,可以提前买好一日票或者月票。

住宿方面,用户可能需要一个方便的位置,比如靠近故宫的住处,这样行程安排起来更方便。推荐一些不错的酒店,比如故宫附近的如家或者汉庭,这些酒店不仅方便,价格也适中。

饮食方面,北京有很多特色小吃,比如炸酱面、烤鸭、涮羊肉等等,可以推荐一些必吃的小吃地点,这样用户在游览的同时也能品尝当地的美食。

接下来,行程安排要合理,不要太赶,每个景点之间留有足够的时间,避免太疲劳。比如上午去故宫,中午吃饭,下午去天坛,下午去四合院区,晚上逛夜市或者看演出,这样安排比较合理。

另外,考虑到北京的季节,用户可能需要一些保暖衣物,比如羽绒服或者厚外套,还有防晒用品,尤其是出去玩的时候,紫外线很强。

预算方面,用户可能想知道大概的花费,包括交通、住宿、餐饮、门票和纪念品。我应该给出一个大概的预算范围,让用户心里有数。

最后,提醒用户注意一些细节,比如北京的天气、穿着要求、 tipping(小费)以及尊重当地的风俗习惯,这样可以避免不必要的麻烦。

总结一下,这份出行计划应该包括出发时间、行程安排、交通住宿、饮食、预算和注意事项,这样用户能全面了解北京旅行的各个方面,顺利安排行程。
</think>

以下是一份关于北京的出行计划模板,供您参考:

---

### **北京出行计划**

#### **出发时间:**
- **上午9:00** 出发前往北京,预计下午1:00到达北京。

---

### **行程安排:**

#### **上午:**
- **9:00 - 10:30** 抵达北京,入住酒店。
- **10:30 - 11:30** 抵达酒店,办理入住手续,休息。

#### **中午:**
- **12:00 - 14:00** 午餐:推荐在酒店附近的小吃店或餐厅品尝北京特色美食,如炸酱面、烤鸭、涮羊肉等。

#### **下午:**
- **14:00 - 17:30** 参观**故宫博物院**(建议乘坐地铁1号线或8号线到达故宫站,游览时间约3小时)。
  - **14:00 - 16:00** 上午场次,参观主要景点如乾清宫、午门、太和殿等。
  - **16:30 - 17:30** 下午场次,参观景仁宫、东华门、紫禁城等。
- **17:30 - 18:00** 午餐:在故宫附近的餐厅享用午餐。
- **18:00 - 19:30** 自由活动:可以在故宫附近的四合院里逛逛,或者去附近的商业区购物。

#### **傍晚:**
- **19:30 - 21:00** 参观**天坛公园**(建议乘坐公交或出租车前往,游览时间约2小时)。
  - **19:30 - 20:30** 上午场次,参观圜丘、香山、中坛等景点。
  - **20:30 - 21:00** 下午场次,参观后山景区。
- **21:00 - 21:30** 午餐:在天坛附近的餐厅享用午餐。
- **21:30 - 22:30** 自由活动:可以在天坛公园附近的小摊区购买纪念品,或者散散步。

#### **晚上:**
- **22:30 - 23:30** 参观**香格里拉四合院**(位于海淀区,是一个以藏族文化为主题的四合院,适合喜欢文化体验的游客)。
  - **22:30 - 23:00** 入院参观,了解藏族文化。
  - **23:00 - 23:30** 午餐:在四合院内的餐厅享用午餐。
- **23:30 - 晚上** 自由活动:可以在四合院附近的小摊区购买一些伴手礼,或者夜游北京,如乘坐夜游船或夜景巴士。

---

### **交通方式:**
1. **市内交通:**
   - **地铁**:北京地铁覆盖范围广,方便快捷,推荐使用北京地铁卡。
   - **公交**:北京公交网络发达,支持扫码或刷卡乘车。
   - **出租车/网约车**:北京的出租车和网约车服务也非常方便。

2. **到达北京的交通方式:**
   - **飞机**:北京首都国际机场(北京大兴国际机场)距离市区约30公里,乘坐机场快车约20分钟即可到达市中心。
   - **火车**:北京西站、北京站是主要的火车站,乘坐地铁或公交可以快速到达城市中心。

---

### **住宿推荐:**
1. **故宫附近**:推荐选择靠近故宫的酒店,方便游览故宫和四合院区。
   - **推荐酒店**:如**北京如家酒店**、**北京汉庭酒店**等。

2. **四合院住宿**:如果计划参观香格里拉四合院,可以选择附近提供藏族文化体验的民宿或酒店。

---

### **饮食推荐:**
1. **北京特色小吃**:
   - **炸酱面**:推荐**三里屯炸酱面**或**79餐饮街**。
   - **烤鸭**:推荐**德胜门烤鸭**或**圆明园烤鸭**。
   - **涮羊肉**:推荐**后海涮羊肉**或**东直门涮羊肉**。

2. **夜市**:
   - **三里屯商圈**:晚上逛三里屯的夜市,品尝地道的北京小吃和夜市美食。
   - **三元里夜市**:位于三里屯,是一个以美食为主题的夜市。

---

### **预算参考:**
- **交通**:单日地铁或公交费用约50元,打车约100元。
- **住宿**:经济型酒店约200-300元/晚,四合院住宿约300-500元/晚。
- **餐饮**:每日约100元,总计约300元。
- **门票**:故宫门票约120元/人,天坛公园门票约60元/人。
- **纪念品**:约100-200元。

---

### **注意事项:**
1. **北京的天气**:北京四季分明,冬季寒冷,夏季炎热。根据季节准备相应的衣物。
2. **穿着要求**:建议穿轻便保暖衣物(冬季)或防晒衣(夏季),注意保暖。
3. ** tipping**:在餐厅和旅游景点,给服务员和导游 tipping(通常为10%-15%)。
4. **尊重当地风俗**:注意北京的传统文化和习俗,避免冒犯当地居民。

---

希望这份计划对您有所帮助,祝您在北京旅途愉快!

Process finished with exit code 0

2.服务器打印日志

3.租用服务器

本地部署服务器资源紧张,没有显卡,可以考虑租用服务器。

我选择autodl平台,

建议计费选着按日收费,主要是下载模型需要时间,耗时太长。看个人预算。

祝大家玩的开心!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值