ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

self-llm 教程:DeepSeek-MoE-16B-Chat 基于 FastAPI 的 API 服务部署与调用实践

2026/9/19 19:11:44 拓冰建站 浏览量
self-llm 教程:DeepSeek-MoE-16B-Chat 基于 FastAPI 的 API 服务部署与调用实践 self-llm 教程DeepSeek-MoE-16B-Chat 基于 FastAPI 的 API 服务部署与调用实践【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llmDeepSeek-MoE-16B-Chat 是 DeepSeek 推出的 MoEMixture of Experts混合专家架构对话模型总参数量 160 亿而实际激活参数量仅约 28 亿兼顾了推理速度与显存占用。本文是 Datawhale《开源大模型食用指南》self-llm 项目中 DeepSeek 系列教程的一部分以 06-DeepSeek-MoE-16b-chat FastApi部署调用.md 为骨架完整走通「AutoDL 双卡环境准备 → ModelScope 模型下载 → FastAPI 服务封装 → curl/Python 客户端调用」全流程读完即可将 DeepSeek-MoE-16B-Chat 部署为可对外提供 HTTP 服务的对话接口。一、DeepSeek-MoE-16B-Chat 模型介绍稀疏激活带来的效率优势DeepSeek MoE 目前推出的版本参数量为 160 亿实际激活参数量大约是 28 亿。MoE 架构的核心思想是虽然模型拥有海量参数但每次推理时只会激活其中一小部分「专家网络」从而在保持模型容量的同时大幅降低计算量。与自家的 7B 密集模型相比二者在 19 个数据集上的表现各有胜负但整体比较接近——也就是说用约 28 亿激活参数就追平了 70 亿参数密集模型的整体水平。而与同为密集模型的 Llama 2-7B 相比DeepSeek MoE 在数学、代码等方面体现出明显的优势。在计算效率上差异更为直观7B 密集模型与 Llama 2-7B 的计算量都超过了 180 TFLOPs/每 4k tokenDeepSeek MoE 每 4k token 仅需 74.4 TFLOPs约为前两者的40%。更低的单位计算量意味着更快的推理速度与更低的能耗这也是本文选择「双卡 3090 共 48G 显存」即可部署 30GB 模型bf16 精度的根本原因。本项目 support_model.md 中收录了 DeepSeek 系列完整的部署与微调教程本文是其中 MoE 16B Chat 模型的 FastAPI 部署篇。二、环境准备在 AutoDL 租用双卡 3090 算力机器DeepSeek-MoE-16B-Chat 模型权重约 30GB见下文模型下载一节以 bfloat16 精度加载后需要约 16GB 权重显存再加上 KV Cache、激活值等运行时开销单卡 24G 会比较紧张因此教程选择在 AutoDL 平台租用**双卡 3090 等 24G 显存共计 48G**的机器。租用机器时的镜像选择建议为PyTorch → 2.1.0 → 3.10(ubuntu22.04) → 12.1即 PyTorch 2.1.0、Python 3.10、Ubuntu 22.04、CUDA 12.1 的官方预置镜像。机器启动后打开 JupyterLab 并进入其中的终端即可开始环境配置、模型下载和运行演示。后续所有命令默认在/root/autodl-tmpAutoDL 的数据盘路径下执行。2.1 pip 换源与依赖安装在终端中依次执行以下命令完成 pip 加速与依赖包安装# 因为涉及到访问 github因此最好打开 autodl 的学术镜像加速 source /etc/network_turbo # 升级 pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install modelscope transformers sentencepiece accelerate fastapi uvicorn requests streamlit transformers_stream_generator # pip install -r requirements.txt pip install https://github.com/Dao-AILab/flash-attention/releases/download/v2.4.2/flash_attn-2.4.2cu122torch2.1cxx11abiFALSE-cp310-cp310-linux_x86_64.whl对上述命令做几点说明source /etc/network_turbo用于开启 AutoDL 的学术资源加速解决访问 GitHub 等境外资源慢的问题依赖包中modelscope负责从 ModelScope 下载模型权重transformers提供模型加载与推理 APIfastapi与uvicorn组成 HTTP 服务框架sentencepiece是 DeepSeek 分词器依赖的分词库accelerate支撑device_mapauto的多卡自动切分transformers_stream_generator用于流式生成本教程未启用但为 WebDemo 等场景预留最后一行安装的是 flash-attention 2.4.2 的预编译 wheel对应 cu122/torch2.1/cp310 环境可显著加速注意力计算。该链接与镜像中的 PyTorch 2.1.0 CUDA 12.1 组合严格对应若更换镜像版本需同步更换对应 wheel否则会安装失败。三、模型下载使用 ModelScope 的 snapshot_download模型权重通过modelscope中的snapshot_download函数下载。第一个参数为模型名称参数cache_dir为模型的下载路径。在/root/autodl-tmp路径下新建download.py文件写入以下内容粘贴后记得保存import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(deepseek-ai/deepseek-moe-16b-chat, cache_dir/root/autodl-tmp, revisionmaster)然后运行python /root/autodl-tmp/download.py模型大小约30 GB下载时间视网络情况约 1020 分钟。下载完成后权重位于/root/autodl-tmp/deepseek-ai/deepseek-moe-16b-chat目录这也是后续api.py中mode_name_or_path所指向的路径。补充说明代码开头的import torch、from modelscope import AutoModel, AutoTokenizer在本下载脚本中并非必需保留它们可保证在部分版本环境下snapshot_download的依赖如 torch 相关类型被正确加载属于官方脚本的惯用写法不影响功能。四、代码准备编写 FastAPI 服务 api.py在/root/autodl-tmp路径下新建api.py文件并写入以下内容。代码带有详细注释将完成「加载模型 → 暴露 HTTP 接口 → 处理对话请求 → 返回 JSON 响应」的完整闭环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[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-moe-16b-chat # 加载分词器trust_remote_codeTrue允许加载远程代码 tokenizer AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue) # 加载语言模型设置数据类型为bfloat16以优化性能以免爆显存并自动选择GPU进行推理 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) # 将填充令牌ID设置为与结束令牌ID相同用于生成文本的结束标记 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) # 在指定端口和主机上启动应用4.1 关键实现点逐段解析模型加载阶段主函数AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_codeTrue)加载分词器。DeepSeek 模型配套了自定义 tokenizer 代码trust_remote_codeTrue允许加载远程代码仓库中的实现AutoModelForCausalLM.from_pretrained(..., torch_dtypetorch.bfloat16, device_mapauto)以 bfloat16 精度加载因果语言模型。bfloat16 相比 fp16 拥有与 fp32 相同的指数位训练/推理更稳定同时可显著降低显存占用避免 30GB 权重在 48G 显存环境下爆显存device_mapauto由accelerate自动将模型切分并分配到所有可用 GPU 上——这正是双卡 3090 能承载该模型的关键model.generation_config GenerationConfig.from_pretrained(mode_name_or_path)加载模型仓库自带的生成配置如 temperature、top_p 等超参保证服务端行为与官方默认一致model.generation_config.pad_token_id model.generation_config.eos_token_id将 pad 令牌 ID 设为 eos 令牌 ID。DeepSeek 的 tokenizer 未显式定义 pad_token若不设置批量/生成过程中可能因缺少合法 pad 位而告警甚至报错此设置是保证generate稳定运行的必要补丁model.eval()切换为评估模式关闭 dropout 等训练期行为。请求处理阶段POST 端点端点app.post(/)接收 JSON 格式请求从中提取prompt用户输入与max_length最大生成长度两个字段使用tokenizer.apply_chat_template(messages, add_generation_promptTrue, return_tensorspt)将{role: user, content: prompt}形式的 messages 按 DeepSeek 的聊天模板渲染成输入张量并追加生成提示符。相比手工拼接特殊 token该方法能保证模板与模型训练时完全一致model.generate(input_tensor.to(model.device), max_new_tokensmax_length)执行自回归生成。注意此处传入的是max_new_tokens本次新生成的 token 上限请求体中的max_length字段实际语义即「新生成 token 数上限」tokenizer.decode(outputs[input_tensor.shape[1]:], skip_special_tokensTrue)通过切片去除输入前缀仅解码新增部分并跳过特殊 token得到纯文本回答响应体中回传response回答文本、status200与time服务端处理时间戳同时在控制台打印请求/响应日志便于排查问题。资源管理torch_gc()在每次请求结束后清空 CUDA 缓存torch.cuda.empty_cache()并回收 IPC 内存碎片torch.cuda.ipc_collect()避免多轮请求后显存碎片累积导致 OOM。这是长生命周期推理服务中很实用的显存治理手段uvicorn.run(app, host0.0.0.0, port6006, workers1)将服务绑定到0.0.0.0:6006。workers1是必要的模型实例以全局变量形式驻留在进程内存中若开启多 worker 会重复加载多份 30GB 权重导致显存翻倍同时每进程需重新加载模型、延长启动时间。端口 6006 是 AutoDL 支持本地映射的默认端口便于在本地浏览器中直接调用。五、启动 API 服务在终端输入以下命令启动 api 服务cd /root/autodl-tmp python api.py首次启动会经历模型权重加载与多卡分配可观察到 transformers/accelerate 的加载进度日志加载完毕后出现如下信息即说明服务启动成功六、API 调用验证curl 与 Python requests服务默认部署在6006端口通过POST方法调用请求体为 JSON包含prompt与max_length两个字段。关于max_length的取值教程给出明确建议建议为 100——设置过大容易爆显存生成 token 越多KV Cache 占用越大设置过小则容易回答输出不全。在双卡 309048G环境下100 是一个兼顾完整度与显存安全的经验值。6.1 使用 curl 调用curl -X POST http://127.0.0.1:6006 \ -H Content-Type: application/json \ -d {prompt: 你好,你是谁,max_length:100}6.2 使用 Python requests 调用import requests import json def get_completion(prompt,max_length): headers {Content-Type: application/json} data {prompt: prompt,max_length:max_length} response requests.post(urlhttp://127.0.0.1:6006, headersheaders, datajson.dumps(data)) return response.json()[response] if __name__ __main__: print(get_completion(你好,你是谁,100))将上述代码保存为request.py并执行python request.py得到的返回值示例如下服务端会同时打印出带时间戳的请求日志包含 prompt 与 response返回的 JSON 结构为{response: ..., status: 200, time: ...}其中response字段即为模型生成的对话文本可直接被上层应用消费。七、调用流程中的常见问题与注意事项显存管理模型权重 30GBbf16 KV Cache 是显存开销的主要来源务必使用 bfloat16 device_mapauto双卡切分并控制max_length不要过大每次请求后的torch_gc()可有效回收碎片显存服务重启成本workers1下每次重启都需要重新加载 30GB 权重如需更新代码可仅修改处理逻辑尽量避免频繁重启与 Transformers 直连调用的关系本文的 FastAPI 方案是服务化封装底层推理逻辑与 06-DeepSeek-MoE-16b-chat Transformer部署调用.md 中trains.py的加载方式完全一致同样采用 bfloat16、device_mapauto、apply_chat_template与max_new_tokens两者共享同一套模型加载与生成管线可相互对照理解。本教程另提供了单卡即可运行的 01-DeepSeek-7B-chat FastApi 部署调用7B 密集模型版环境与代码结构高度相似适合显存资源有限的读者作为入门参考镜像与依赖版本匹配flash-attention 的预编译 wheel 严格绑定 CUDA/Torch/Python 版本务必保持镜像PyTorch 2.1.0 / Python 3.10 / CUDA 12.1与 wheel 版本cu122/torch2.1/cp310一致否则会安装失败。至此DeepSeek-MoE-16B-Chat 已成功以 FastAPI 服务的形式对外提供对话能力上层应用只需构造{prompt: ..., max_length: 100}的 POST 请求即可获得模型回复为后续接入 LangChain、构建知识库助手或 WebDemo 等应用场景提供了标准化的 HTTP 接口。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考