DEEPSEEK-R1 模型 API 部署

news/2025/2/21 20:30:35/文章来源:https://www.cnblogs.com/saas-open/p/18725915

DEEPSEEK-R1 模型 API 部署

DeepSeek-R1 模型 API 部署一. 项目背景二. 项目需求三. 项目环境3.1 必要依赖3.2 安装依赖3.3 获取模型(1) models.py 模型文件(2) setting.py 配置文件3.4 书写 FastAPI 应用(1) main.py 文件3.5 部署到服务器(1) 启动 FastAPI 服务(2) 配置防火墙(3) 部署在云服务器四. 总结4.1 后续改进:

 

一. 项目背景

本项目旨在将 DeepSeek 模型部署为一个 Web API,使用户可以通过 HTTP 请求与模型进行交互。模型通过 FastAPI 框架提供服务,用户可以输入问题并获取模型生成的回答。我们将会在本文中详细描述如何配置、实现并部署这一系统。

 

二. 项目需求

  1. DeepSeek 模型:需要一个已训练的 DeepSeek-R1-Distill-Qwen-1.5B 模型。

  2. 环境配置:使用 FastAPI 框架与 PyTorch 结合进行后端部署。

  3. API 接口:提供一个 POST 接口供用户提交问题并返回生成的回答。

  4. 部署:将模型和服务部署到服务器,允许通过外部访问 API。

三. 项目环境

3.1 必要依赖

  • Python 版本:3.8+

  • FastAPI:用于快速构建 Web API 服务。

  • Uvicorn:作为 ASGI 服务器,用于运行 FastAPI 应用。

  • Transformers:用于加载和使用 Hugging Face 的预训练模型。

  • Torch:支持 GPU 加速计算。

  • Pydantic:用于数据验证和序列化。

3.2 安装依赖

  1. 安装依赖库:

    ​
    """
    pip install fastapi uvicorn torch transformers pydantic
    ​
    """
    ​
    ​
  2. 配置模型文件: 请确保已将 DeepSeek-R1-Distill-Qwen-1.5B 模型及其分词器下载并放置到项目中的相应路径。


3.3 获取模型

(1) models.py 模型文件

models.py 文件包含加载模型和分词器的逻辑:

​
import os
from transformers import AutoModelForCausalLM, AutoTokenizer
from config import setting
​
# 获取模型路径
​
# 检查并加载模型和分词器
def load_model_and_tokenizer():   model_dir = setting.model_dir
​   if not os.path.exists(model_dir):       raise ValueError(f"Model directory does not exist at {model_dir}")
​   print("Loading model and tokenizer...")   model = AutoModelForCausalLM.from_pretrained(model_dir)   tokenizer = AutoTokenizer.from_pretrained(model_dir)
​   return model, tokenizer

(2) setting.py 配置文件

setting.py 文件用于配置模型路径。

​
# 根路径
import os
​
# 获取当前文件的路径
current_dir = os.path.dirname(__file__)
​
# 获取项目根路径
project_root = os.path.dirname(current_dir)
​
# 拼接模型和分词器路径
model_dir = os.path.join(project_root, 'models', 'DeepSeek-R1-Distill-Qwen-1.5B')
​
print(model_dir)
​
# 确保模型和分词器的路径存在
if not os.path.exists(model_dir):   raise ValueError(f"Model directory does not exist at {model_dir}")
else:   print("Model directory exists, proceeding with loading.")

 

在该文件中,我们首先获取当前路径,并从根路径拼接出模型的实际存储路径。随后确保该路径存在,并加载模型和分词器。

 


3.4 书写 FASTAPI 应用

(1) main.py 文件

主要步骤:

  1. 加载模型和分词器:使用 models.py 中的 load_model_and_tokenizer() 方法加载模型和分词器。

  2. 设备选择:根据 GPU 可用性选择设备 (cudacpu)。

  3. 请求模型:使用 Pydantic 模型定义请求格式,包括用户输入的文本 input_text 和指令文本 instruction(具有默认值)。

  4. 生成响应:构建并传入结构化的 prompt,调用模型生成回答。

 

main.py 是 FastAPI 应用的核心文件。以下是代码实现:

​
import uvicorn
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import torch
from models import models
​
# 加载模型和分词器
model, tokenizer = models.load_model_and_tokenizer()
​
# 将模型移至正确的设备(使用 GPU 如果可用)
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
​
# 定义 FastAPI 应用
app = FastAPI()
​
# 创建一个 Pydantic 模型用于接收输入数据
class RequestModel(BaseModel):   input_text: str   instruction: str = "你是一名乐于助人的助手"  # 新增字段,用于接收指令文本
​
# 生成响应的 API 路由
@app.post("/generate-response/")
async def generate_response(request: RequestModel):   input_text = request.input_text   instruction_text = request.instruction  # 获取传入的指令文本
​   print(f"User input: {input_text}")   print(f"Instruction: {instruction_text}")
​   # 动态构建 prompt,使用传入的指令文本   prompt_style_chat = f"""   请写出一个恰当的回答来完成当前对话任务。
​   ### Instruction:   {instruction_text}  # 使用传入的指令文本
​   ### Question:   {input_text}
​   ### Response:   <think>"""
​   # 使用分词器处理输入文本   inputs = tokenizer(prompt_style_chat, return_tensors="pt", padding=True, truncation=True, max_length=512)
​   # 获取分词器的 pad_token_id   pad_token_id = tokenizer.pad_token_id if tokenizer.pad_token_id is not None else model.config.pad_token_id
​   try:       # 生成模型输出       with torch.no_grad():           outputs = model.generate(               inputs['input_ids'].to(device),               attention_mask=inputs['attention_mask'].to(device),               max_new_tokens=1200,  # 设置最大生成的 token 数量               temperature=1.0,               top_p=0.9,               pad_token_id=pad_token_id           )           print("Model.generate() completed.")   except Exception as e:       print(f"Error generating response: {e}")       raise HTTPException(status_code=500, detail=f"Error generating response: {e}")
​   try:       # 解码生成的输出文本       response = tokenizer.decode(outputs[0], skip_special_tokens=True)       print(f"Generated response: {response}")       return {"response": response}   except Exception as e:       print(f"Error decoding output: {e}")       raise HTTPException(status_code=500, detail=f"Error decoding output: {e}")
​
if __name__ == "__main__":   uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)      

3.5 部署到服务器

(1) 启动 FastAPI 服务

  1. 在本地或服务器上运行以下命令启动应用:

    ​
    uvicorn main:app --host 0.0.0.0 --port 8000 --reload
    ​

    --host 0.0.0.0 参数确保服务监听所有网络接口,这样就可以从外部访问 API。

(2) 配置防火墙

确保服务器的防火墙允许外部访问指定的端口(默认为 8000)。

(3) 部署在云服务器

可以使用云服务器(如 AWS、阿里云、Google Cloud 等)进行部署。确保选择具有足够资源的虚拟机(建议至少配置 16GB RAM 和支持 GPU 的实例)。


四. 总结

本项目演示了如何使用 FastAPI 框架部署一个深度学习模型 API。通过模型加载、请求接口和响应生成,我们实现了一个基于 DeepSeek 模型的文本生成服务。通过 FastAPI 的高效性和 PyTorch 的强大计算能力,可以构建一个快速且灵活的文本生成 API。

4.1 后续改进:

  • 增加身份验证:确保 API 访问安全。

  • 性能优化:对于高并发请求,考虑使用多线程或多进程处理请求,或者使用缓存。

  • 部署到生产环境:使用 Docker 或 Kubernetes 将应用容器化,并在云平台部署。

image-20250219180356820

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887052.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制造行业CRM选哪家?中大型企业CRM首选纷享销客

在当今竞争激烈的制造行业中,企业对于客户关系管理(CRM)系统的需求日益增强,高效、智能的CRM系统已成为推动企业业务增长、优化客户体验的关键。在众多CRM解决方案中,最终纷享销客凭借其卓越的功能性、高度的定制化能力以及出色的市场表现,成为了众多中大型企业首选的CRM…

6.2.6 特征映射和感受野

这里看英文原版更好语句更通顺,还有补充上面的图片其实就是想说明低层的CNN可以检测边缘什么的(右侧图像是中间的图像与左侧图像做卷积的结果)

MQ基础

MQ基础认识MQ结合JAVA客户端 依赖 <!--AMQP依赖,包含RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>配置文件 spring:rabbitmq:host: 8.2…

Excel 自动换行后批量设置单元格上下边距

excel 自动换行后 单元格的上下边距挨的很紧,看起来很不舒服 如下图 现在教大家 如何批量设置 单元格中有多行文本后的上下间距,设置成功后 如下图所示:具体步骤: 1、鼠标悬停在 excel 中的任意sheet(页签)上,右键 选择 查看代码 2、在弹出的 Visual Basic 编辑器弹框左…

开发者必备!Github Stars 存储库管理器!

gitstars —— 一个基于 Vite + Vue.js 构建的 GitHub Star 仓库管理器,旨在帮助开发者更好的管理、搜索、查阅收藏的开源项目。大家好,我是 Java陈序员。 Github 作为全球最大的开发者交流平台,拥有数不胜数的开源项目,我们会经常收藏一些开源项目,方便工作和学习。 但随…

1. Linux下 MySQL 的详细安装与使用

1. Linux下 MySQL 的详细安装与使用 @目录1. Linux下 MySQL 的详细安装与使用1. Linux 下安装 MySQL8.0 的详细安装步骤:2. Linxu 当中的MySQL 设置远程登录3. 最后:1. Linux 下安装 MySQL8.0 的详细安装步骤:查看是否安装过MySQL,如果你是用rpm安装, 检查一下RPM PACKAGE:…

临时编辑-----WordPress后台用户手册

登录 WordPress后台默认的登录链接是: https://yourdomain.com/wp-admin/ 输入你的账号(可以是邮箱,也可以是昵称)和密码,即可登录。然后就会进入到你的WordPress网站后台。 注意:忘记你的WordPress密码也不用太慌张,可以从服务器后台进入到WordPress后台。 进来的界面就…

15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用

15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用 @目录15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用1. CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表 的概述1.1 CAdvisor 监控收集1.2 InfluxDB 存储数据1.3 Granfana…

c#中GDI+使用贝塞尔曲线画一朵云

主要是路径的计算 先得到路径if (value.Width > 0 && value.Height > 0) {GraphicsPath.AddBezier(new PointF(RectangleF.Left + RectangleF.Width * 0.1f, RectangleF.Top + RectangleF.Height * 0.55f),new PointF(RectangleF.Left + RectangleF.Width * 0.1f…

如何让你的ida 地址就是RVA

如何让你的ida 地址就是RVA 原理:首先软件进入ida中的时候,其实就相当于把应用程序载入了内存中,RVA其实就是虚拟的便宜地址,也就是在内存中的地址,所以这里的RVA就是在ida中看到的地址-Imagebase Imagebase 其实就是基址。所以我们只需要把imagebase 设置为0即可拿到我…

c#GDI+实现类似油门踏板效果的自定义控件

先看效果图下面是代码protected override void OnPaint(PaintEventArgs e) {e.Graphics.SetGDIHigh();var rect = new Rectangle(0, 0, this.Width, this.Height);// 创建变换矩阵Matrix transformMatrix = new Matrix();// 使用平行四边形的方法近似梯形transformMatrix.Shear…

NocoBase 本周更新汇总:支持全局和批量数据触发自定义操作事件

本周更新包括:支持全局和批量数据触发自定义操作事件,支持数据表预置字段扩展等。汇总一周产品更新日志,最新发布可以前往我们的博客查看。 NocoBase 目前更新包括的版本更新包括三个分支:main ,next和 develop。main :截止目前最稳定的版本,推荐安装此版本。 next:包含…