
DeepSeek-7B-Chat 基于 FastAPI 的本地 API 部署与调用实战指南【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm导读本文基于《开源大模型食用指南》self-llm项目中的 DeepSeek-7B-chat FastApi 部署文档完整讲解如何在 Linux 云主机以 AutoDL 为例上从零搭建 DeepSeek-7B-Chat 的本地推理服务包括环境准备、依赖安装、ModelScope 模型下载、FastAPI Uvicorn 服务端编写以及通过 curl 与 Python requests 发起 HTTP 请求的完整链路。读完本文你将掌握一套可直接复制的加载 HuggingFace 兼容权重 → 封装成 HTTP 接口 → 多端调用的标准部署方案并为后续接入 LangChain、搭建 Web Demo 或进行 LoRA 微调打好基础。DeepSeek LLM 与 7B-Chat 模型简介DeepSeek LLM 是由 DeepSeek 团队从零训练的高级语言模型其中 DeepSeek-7B-Chat 由70 亿个参数组成训练数据是一个包含2 万亿个英文和中文 token的庞大数据集。为了促进学术与工业研究DeepSeek 面向研究社区开放了 DeepSeek LLM 7B/67B Base 与 7B/67B Chat 四个版本本文聚焦 7B-Chat 对话版本在单卡 24G 显存如 RTX 3090环境下的 FastAPI 服务化部署。从仓库后续文档可以印证该模型的更多特性在 DeepSeek-7B-Chat Lora 微调文档 中模型的对话格式采用如下模板与官方仓库指令格式一致User: {messages[0][content]} Assistant: {messages[1][content]}end▁of▁sentenceUser: {messages[2][content]} Assistant:这一模板与本文 api.py 中使用的apply_chat_template能力相对应理解该格式有助于排查部署后生成异常的边界情况。环境准备AutoDL 云主机与镜像选择在 AutoDL 平台租用一台RTX 3090 等 24G 显存的显卡机器创建实例时按以下路径选择镜像PyTorch → 2.0.0 → 3.8 (ubuntu20.04) → 11.8CUDA 11.3 以上版本均可。实例创建并开机后打开 JupyterLab再打开其中的终端后续的环境配置、模型下载与运行演示均在终端中完成。关于 AutoDL 的端口映射方法可参考 AutoDL 开放端口文档把 autodl 的 6006 端口映射到本地http://localhost:6006即可在本地浏览器或脚本中访问云端 API。安装运行依赖在终端中依次执行以下命令先升级 pip 并更换国内 PyPI 源以加速安装再按固定版本安装依赖包# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install fastapi0.104.1 pip install uvicorn0.24.0.post1 pip install requests2.25.1 pip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install accelerate0.24.1 pip install transformers_stream_generator0.0.4各依赖的职责简要说明依赖包作用fastapi提供 Web 框架用于定义 HTTP 接口路由uvicornASGI 服务器负责承载并运行 FastAPI 应用requests客户端调用库用于本地验证 API 接口modelscope模型下载工具通过snapshot_download拉取权重transformers加载模型、分词器并执行生成推理sentencepieceDeepSeek 分词器底层依赖的分词实现accelerate支持device_mapauto实现多设备自动分配transformers_stream_generator支持流式生成后续 WebDemo 等场景会用到若网络访问 GitHub 受限在需要安装 flash-attention 等额外依赖时还可参考仓库中 DeepSeek-MoE-16b-chat FastApi 部署文档 的做法先执行source /etc/network_turbo开启学术镜像加速该方法同样适用于本文的 7B 模型场景。pip/conda 换源的更多镜像选择可参考 pip、conda 换源文档。通过 ModelScope 下载模型权重使用 ModelScope 的snapshot_download函数下载模型第一个参数为模型名称cache_dir参数指定模型的下载路径。在/root/autodl-tmp路径下新建download.py文件并写入以下内容保存后运行import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer from modelscope import GenerationConfig model_dir snapshot_download(deepseek-ai/deepseek-llm-7b-chat, cache_dir/root/autodl-tmp, revisionmaster)执行下载python /root/autodl-tmp/download.py模型大小约15 GB下载耗时约10~20 分钟取决于网络带宽。下载完成后权重会存放在/root/autodl-tmp/deepseek-ai/deepseek-llm-7b-chat目录下该路径将作为后续 api.py 中的模型加载路径。编写 FastAPI 服务端代码api.py在/root/autodl-tmp路径下新建api.py文件写入以下内容代码包含详细注释from fastapi import FastAPI, Request from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig import uvicorn import json import datetime import torch # 设置设备参数 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内存碎片 # 创建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) # 获取请求中的提示 max_length json_post_list.get(max_length) # 获取请求中的最大长度 # 构建 messages messages [ {role: user, content: prompt} ] # 构建输入 input_tensor tokenizer.apply_chat_template(messages, add_generation_promptTrue, return_tensorspt) # 通过模型获得输出 outputs model.generate(input_tensor.to(model.device), max_new_tokensmax_length) result tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokensTrue) now datetime.datetime.now() # 获取当前时间 time now.strftime(%Y-%m-%d %H:%M:%S) # 格式化时间为字符串 # 构建响应JSON answer { response: result, status: 200, time: time } # 构建日志信息 log [ time ] , prompt: prompt , response: repr(result) print(log) # 打印日志 torch_gc() # 执行GPU内存清理 return answer # 返回响应 # 主函数入口 if __name__ __main__: mode_name_or_path /root/autodl-tmp/deepseek-ai/deepseek-llm-7b-chat # 加载预训练的分词器和模型 tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(mode_name_or_path, trust_remote_codeTrue,torch_dtypetorch.bfloat16, device_mapauto) model.generation_config GenerationConfig.from_pretrained(mode_name_or_path) model.generation_config.pad_token_id model.generation_config.eos_token_id model.eval() # 设置模型为评估模式 # 启动FastAPI应用 # 用6006端口可以将autodl的端口映射到本地从而在本地使用api uvicorn.run(app, host0.0.0.0, port6006, workers1) # 在指定端口和主机上启动应用代码关键点逐段解析1. 设备与显存管理DEVICE cuda DEVICE_ID 0 CUDA_DEVICE f{DEVICE}:{DEVICE_ID} if DEVICE_ID else DEVICE将推理固定到 CUDA 设备 0。torch_gc()在每次请求结束后调用torch.cuda.empty_cache()清空缓存、torch.cuda.ipc_collect()回收显存碎片避免长时运行导致显存膨胀——这是服务化部署中防止 OOM 的关键实践。2. 请求解析与生成json_post_list json_post_raw if isinstance(json_post_raw, dict) else json.loads(json_post)json_post_list.get(prompt)与json_post_list.get(max_length)分别读取用户提示与最大生成长度两者均可缺省max_length缺省时generate将使用模型默认的max_new_tokens。messages [{role: user, content: prompt}] input_tensor tokenizer.apply_chat_template(messages, add_generation_promptTrue, return_tensorspt) outputs model.generate(input_tensor.to(model.device), max_new_tokensmax_length) result tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokensTrue)apply_chat_template会根据模型自带的 chat template 自动拼装出前文所述的User: ...\n\nAssistant:对话格式并追加生成提示符return_tensorspt直接返回 PyTorch 张量max_new_tokensmax_length控制新生成的 token 数量而非输入 输出的总长度解码时通过outputs[0][input_tensor.shape[1]:]切片去掉输入部分只保留模型新生成的内容skip_special_tokensTrue剔除end▁of▁sentence等特殊 token。值得注意的是这里入参名是max_length但实际语义对应 HF 的max_new_tokens。3. 响应与日志响应统一封装为{response: ..., status: 200, time: ...}三段式结构并在服务端控制台打印[时间] prompt / response格式的访问日志便于排查问题。4. 模型加载与启动tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(mode_name_or_path, trust_remote_codeTrue, torch_dtypetorch.bfloat16, device_mapauto) model.generation_config GenerationConfig.from_pretrained(mode_name_or_path) model.generation_config.pad_token_id model.generation_config.eos_token_id model.eval()trust_remote_codeTrueDeepSeek 属于自定义架构依赖远程代码文件必须开启torch_dtypetorch.bfloat16以半精度加载显著降低显存占用24G 单卡即可容纳 7B 模型device_mapauto由 accelerate 自动将各层分配到可用设备model.generation_config.pad_token_id model.generation_config.eos_token_id将 pad token 设为 eos token避免 batch 生成时 padding 干扰model.eval()切换为评估模式关闭 dropout 等训练行为uvicorn.run(app, host0.0.0.0, port6006, workers1)绑定所有网卡、监听 6006 端口单 worker 运行多 worker 会各自加载一份模型导致显存翻倍。启动 API 服务在终端执行cd /root/autodl-tmp python api.py当终端出现Loading checkpoint shards: 100%、Application startup complete并显示服务监听地址http://0.0.0.0:6006时说明模型加载完毕、服务启动成功默认部署在6006 端口通过POST 方法进行调用。配合 AutoDL 开放端口文档 将 6006 端口映射到本地后即可在本地直接访问该 API。调用 API 服务方式一使用 curlcurl -X POST http://127.0.0.1:6006 \ -H Content-Type: application/json \ -d {prompt: 你好}方式二使用 Python requests 库import requests import json def get_completion(prompt): headers {Content-Type: application/json} data {prompt: prompt} response requests.post(urlhttp://127.0.0.1:6006, headersheaders, datajson.dumps(data)) return response.json()[response] if __name__ __main__: print(get_completion(你好))返回结果格式两种方式得到的返回值结构一致示例{ response: 你好有什么我可以帮助你的吗, status: 200, time: 2023-12-01 17:06:10 }其中response为模型生成文本status为业务状态码time为服务端处理时间戳。关于 max_length 参数的实践建议结合仓库中同系列模型 DeepSeek-MoE-16b-chat FastApi 部署文档 的实测经验调用时建议显式携带max_length例如{prompt: 你好,你是谁,max_length:100}——值过大容易爆显存过小则回答输出不全。7B-Chat 在 24G 单卡环境下同样建议遵循适度取值原则按实际显存余量在 64~256 之间调节。部署后的能力延伸FastAPI 接口稳定运行后可以自然地与仓库中的其他教程衔接复用本文的模型加载与推理链路接入 LangChain参考 DeepSeek-7B-chat langchain 接入文档从langchain.llms.base.LLM继承自定义DeepSeek_LLM类并重写_call方法即可将本地模型无缝接入 LangChain 应用其中同样使用了apply_chat_template与max_new_tokens100的生成配置搭建 Web 对话界面参考 DeepSeek-7B-chat WebDemo 部署文档使用 Streamlit 包装同一套get_model()加载逻辑并通过st.chat_message实现多轮对话界面模型微调如需针对业务数据微调可参考 DeepSeek-7B-chat Lora 微调文档其中包含指令集构建、LoraConfig参数如r8、lora_alpha32与Trainer训练的完整流程。常见问题与注意事项显存不足确认按 bfloat16 加载且未开启多 worker调用时将max_length调小若仍不足可考虑使用仓库中 4bits 量化 QLoRA 方案的思路参见 DeepSeek-7B-chat 4bits 量化 Qlora 微调文档压缩显存占用。端口无法访问确认云平台安全组/端口映射已开放 6006 端口服务需监听0.0.0.0而非127.0.0.1否则外部无法访问。中文生成异常DeepSeek 分词器基于 sentencepiece请确保sentencepiece0.1.99已正确安装模型文件下载不完整时建议删除缓存目录重新snapshot_download。max_length语义接口入参实际对应max_new_tokens新生成 token 上限传入过大值可能导致超出上下文窗口而报错或输出截断。至此一个完整可用的 DeepSeek-7B-Chat HTTP 推理服务已部署完成可直接被 curl、Python 脚本、LangChain 或其他服务集成调用。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考