ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

DeepSeek-MoE-16b-chat 基于 Transformers 的双卡显存部署与推理调用实战

DeepSeek-MoE-16b-chat 基于 Transformers 的双卡显存部署与推理调用实战 DeepSeek-MoE-16b-chat 基于 Transformers 的双卡显存部署与推理调用实战【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm本文基于 self-llm 仓库中的 06-DeepSeek-MoE-16b-chat Transformer部署调用 教程讲解如何用 Transformers 原生 API 在双卡 24G 显存机器上部署并调用 DeepSeek-MoE-16b-chat 模型。读完本文你将掌握 MoE 大模型在 Linux 环境下的镜像选择、依赖安装含 flash-attention 预编译轮子、ModelScope 模型下载以及通过bfloat16 device_mapauto自动切分双卡推理的完整流程并理解apply_chat_template、GenerationConfig等关键调用的参数含义。一、模型介绍16B 总参数、2.8B 激活参数的 MoE 架构DeepSeek-MoE-16b-chat 是 DeepSeek 推出的首个 MoEMixture of Experts混合专家对话模型。根据教程文档的介绍其核心数据如下总参数量 160 亿实际激活参数量约 28 亿每个 token 只路由激活部分专家因此推理时单 token 的计算量远低于同规模密集模型与自家 7B 密集模型对比在 19 个数据集上二者各有胜负整体表现接近与 Llama 2-7B 对比在数学、代码等任务上体现出明显优势计算量优势两种 7B 密集模型处理 4k token 的计算量都超过 180 TFLOPs而 DeepSeek-MoE 仅为 74.4 TFLOPs只有前两者的 40%。这也决定了它的部署特点模型文件体积大约 30 GB 权重单卡 24G 显存装不下但激活参数少使推理速度可观。因此教程选择双卡 24G共 48G显存作为推荐配置并利用 Transformers 的device_mapauto把不同层的权重自动切分到两张卡上。二、环境准备镜像选择与依赖安装2.1 租用机器与镜像选择在 AutoDL 平台租用一台**双卡 3090 级别、单卡 24G 显存共 48G**的 GPU 机器。镜像按以下路径选择见上方截图框架PyTorch版本2.1.0Python 版本3.10 (ubuntu22.04)CUDA 版本12.1版本组合需要与后面安装的 flash-attention 预编译轮子严格匹配下文会解释原因。2.2 打开 JupyterLab 终端配置环境租用服务器后打开 JupyterLab 并新建终端依次执行环境配置、模型下载和运行 demo 三步。2.3 pip 换源与安装依赖包由于后续要访问 GitHub 下载 flash-attention 的.whl文件建议先开启 AutoDL 的学术镜像加速然后升级 pip、切换清华 PyPI 源加速安装# 因为涉及到访问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 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各依赖的作用依赖包作用modelscope模型下载与加载本教程用它下载权重transformers提供AutoTokenizer/AutoModelForCausalLM/GenerationConfig是部署调用的核心库sentencepieceDeepSeek 分词器BPE/WordPiece 体系所需的分词工具库accelerate提供device_mapauto所需的模型切分与设备调度能力是多卡自动部署的关键flash_attn预编译轮子注意力计算加速库避免现场编译注意最后一行安装的 wheel 文件名flash_attn-2.4.2cu122torch2.1cxx11abiFALSE-cp310-cp310。从命名可以读出它的绑定条件——CUDA 12.x、torch 2.1、Python 3.10cp310、x86_64 Linux、cxx11 ABI 为 FALSE。这正是 2.1 节中镜像版本必须选 PyTorch 2.1.0 Python 3.10 的原因直接安装对应预编译轮子省去在 GPU 机器上编译 flash-attention 的漫长等待与失败风险。关于换源与镜像的更多做法可参考仓库通用文档 pip、conda换源。三、模型下载使用 ModelScope snapshot_download使用modelscope中的snapshot_download函数下载模型第一个参数为模型名称deepseek-ai/deepseek-moe-16b-chat参数cache_dir指定模型的下载路径。在/root/autodl-tmp路径下新建download.py文件并写入以下内容保存后运行python /root/autodl-tmp/download.py执行下载。模型大小约 30 GB下载大约需要 10~20 分钟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)下载完成后snapshot_download返回的model_dir即本地目录路径形如/root/autodl-tmp/deepseek-ai/deepseek-moe-16b-chat后续推理代码将直接加载这个本地路径不再联网拉取权重。仓库中 模型下载 一节还介绍了 huggingface-cli 及镜像站等替代下载方式可按网络条件自行选择。四、推理代码准备逐段解析 trains.py在/root/autodl-tmp路径下新建trains.py文件原文档即命名为 trains.py输入以下内容。这段代码就是整个 Transformers 部署调用的全部核心import torch # 导入torch库用于深度学习相关操作 from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig # 从transformers库导入所需的类 # 将模型路径设置为刚刚下载的模型路径 model_name /root/autodl-tmp/deepseek-ai/deepseek-moe-16b-chat # 加载分词器trust_remote_codeTrue允许加载远程代码 tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) # 加载语言模型设置数据类型为bfloat16以优化性能以免爆显存并自动选择GPU进行推理 model AutoModelForCausalLM.from_pretrained(model_name, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue) # 加载并设置生成配置使用与模型相同的设置 model.generation_config GenerationConfig.from_pretrained(model_name, trust_remote_codeTrue) # 将填充令牌ID设置为与结束令牌ID相同用于生成文本的结束标记 model.generation_config.pad_token_id model.generation_config.eos_token_id # 定义输入消息模型使用apply_chat_template进行消息输入模拟用户与模型的交互 messages [ {role: user, content: 你是谁} ] # 处理输入消息并添加生成提示 input_tensor tokenizer.apply_chat_template(messages, add_generation_promptTrue, return_tensorspt) # 使用模型生成回应设置max_new_tokens数量为100防止爆显存也可以将max_new_tokens设置的更大但可能爆显存 outputs model.generate(input_tensor.to(model.device), max_new_tokens100) # 模型输出跳过特殊令牌以获取纯文本结果 result tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokensTrue) # 显示生成的回答 print(result)4.1 分词器加载AutoTokenizer.from_pretrainedtokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue)trust_remote_codeTrueDeepSeek 官方仓库携带了自定义的建模与分词脚本该参数允许 Transformers 直接执行这些远程代码保证自定义 tokenizer 的行为与官方一致。由于直接加载本地目录model_name指向下载后的绝对路径此过程不依赖网络。4.2 模型加载bfloat16 device_mapauto双卡部署关键model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue )这一行是本文档区别于普通单卡部署的核心三个参数分别解决三个问题torch_dtypetorch.bfloat16以 16 位浮点加载权重。相比 fp32 显存占用减半相比 fp16 在数值范围上更不易溢出。对于 30 GB 量级的权重这一步是以免爆显存的第一道保障。device_mapauto交由accelerate库按贪心切层策略把各层权重自动分配到可用的多块 GPU 上。双卡 24G 机器上MoE 模型数十层 Transformer 会被拆分到 cuda:0 与 cuda:1任何单卡都不需要装下整个模型。这正是教程要求双卡 24G共 48G的机制基础。trust_remote_codeTrue同分词器执行仓库内的自定义模型实现。从源码结构看device_mapauto之后model.device指向的是第一个计算单元后续generate时输入张量需与之对齐见 4.6 节的.to(model.device)。4.3 生成配置复用官方 GenerationConfigmodel.generation_config GenerationConfig.from_pretrained(model_name, trust_remote_codeTrue) model.generation_config.pad_token_id model.generation_config.eos_token_id模型仓库中自带generation_config.json记录了官方推荐的采样参数温度、top-p、惩罚项等。GenerationConfig.from_pretrained把它完整加载并挂载到模型上保证生成行为与官方演示一致避免使用默认参数导致回答质量下降。第二行把pad_token_id指向eos_token_id。这是因为多轮/批量生成时 pad token 参与注意力掩码计算若不显式设置而分词器又未定义 pad token会产生告警甚至错误掩码将二者对齐是最常见的稳妥做法。4.4 输入组织apply_chat_template应用对话模板messages [ {role: user, content: 你是谁} ] input_tensor tokenizer.apply_chat_template(messages, add_generation_promptTrue, return_tensorspt)messages采用标准的角色-内容字典列表apply_chat_template会把多轮对话按模型训练时的聊天模板渲染成一段完整的提示词文本再经分词器编码为输入张量。add_generation_promptTrue表示在末尾补上assistant 开始回答的引导段让模型接着往下生成。return_tensorspt返回 PyTorch 张量可直接送入model.generate。使用模板而非手写字符串的好处DeepSeek 官方模板中含特定的 system 提示与角色分隔格式手写容易因格式偏差导致模型行为不稳定。4.5 输出解码截取新生成部分并跳过特殊 tokenresult tokenizer.decode(outputs[0][input_tensor.shape[1]:], skip_special_tokensTrue)model.generate的返回值是输入 生成的完整序列。这里用切片[input_tensor.shape[1]:]只保留新增长度对应的 token即纯回答部分skip_special_tokensTrue则去掉eos、begin▁of▁sentence等特殊标记得到干净的纯文本后print输出。4.6 长度控制max_new_tokens与显存的权衡outputs model.generate(input_tensor.to(model.device), max_new_tokens100)教程特意把max_new_tokens设为 100 并注释防止爆显存MoE 模型虽然激活参数少但解码阶段的 KV Cache 随生成长度线性增长显存紧张时生成长度是第一个应当收缩的预算。需要更长回答时可以调大该值但要留意显存占用.to(model.device)则确保输入张量与模型首层所在设备一致。五、部署运行与结果验证在终端执行以下命令运行cd /root/autodl-tmp python trains.py运行后可观察两类现象确认部署成功loading checkpoint进度条显示模型权重正在从磁盘加载并按device_map切分到两张卡对话输出加载完成后模型即生成回答。由于输入是你是谁DeepSeek-MoE-16b-chat 会以一段英文自我介绍回应如I am a bot, specifically a language model developed by OpenAI...这类表述实际输出随版本与采样参数略有差异。从截图中还能看到一条提示No chat template is defined for this tokenizer - using the default template for the LlamaTokenizerFast class...。这说明当前 transformers 版本加载到的 tokenizer 未携带官方 chat template库自动回退到了默认模板。若回答格式不理想可参考 06-DeepSeek-MoE-16b-chat FastApi部署调用 中更完整的工程化封装含torch_gc()显存清理、FastAPI 服务化与时间戳统计把本节的单轮脚本扩展为可对外提供 HTTP 服务的推理接口。六、要点小结硬件选型16B 总参数 MoE 权重约 30 GBbfloat16 下双卡 24G48G是教程验证过的稳妥配置环境匹配镜像PyTorch 2.1.0 / Python 3.10 / CUDA 12.1必须与 flash-attention 预编译轮子的绑定条件一致这是安装顺利的关键下载方式snapshot_downloadcache_dir一步落盘后续离线加载本地目录部署三要素torch_dtypetorch.bfloat16降显存、device_mapauto多卡自动切分、GenerationConfig.from_pretrained复用官方采样参数对话调用apply_chat_template(..., add_generation_promptTrue)组织输入generate(max_new_tokens100)控制长度解码时截取新增部分并跳过特殊 token。掌握以上流程后同一套bfloat16 device_map auto chat template的模式也可推广到仓库中其他 Transformers 部署教程如 05-ChatGLM3-6B Transformer部署调用 等只是镜像版本与模型路径不同。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表