)
DeepSeek-Coder-V2-Lite-Instruct FastAPI 部署实战从环境配置到 HTTP 接口调用的完整指南self-llm【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm本指南基于《开源大模型食用指南》self-llm仓库中 01-DeepSeek-Coder-V2-Lite-Instruct FastApi 部署调用.md 展开完整讲解如何在 LinuxAutoDL 云 GPU 环境上搭建依赖环境、下载 DeepSeek-Coder-V2-Lite-Instruct 模型权重并以 FastAPI Uvicorn 封装为 HTTP 接口服务。读者学完后将能独立完成模型的服务化部署并通过curl与 Pythonrequests两种方式调用本地大模型接口为后续接入 LangChain、Web Demo 等应用打好基础。一、整体方案概览DeepSeek-Coder-V2-Lite-Instruct 是 DeepSeek 推出的代码能力极强的开源大模型。要让模型对外提供服务经典方案是Transformers 加载权重 FastAPI 封装 HTTP 接口 Uvicorn 启动服务整体流程如下环境准备安装 Python 依赖fastapi、uvicorn、modelscope、transformers、accelerate模型下载使用modelscope的snapshot_download拉取模型权重到本地代码准备编写api.py加载分词器与模型定义 POST 接口完成流式的对话生成API 部署启动 Uvicorn 服务观察显存占用接口调用通过curl命令行与 Pythonrequests库验证服务可用性。该教程定位在 AutoDL 这类云 GPU 平台上运行端口6006配合 AutoDL 的端口映射能力可以把远端服务映射到本地调用是私有化部署大模型 API 的典型实践。二、环境准备与依赖安装本教程的基础环境如下---------------- ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0 ----------------在开始前请确保已完成以上 Pytorch(CUDA) 环境的安装。接下来执行pip换源并安装依赖包# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install fastapi0.111.1 pip install uvicorn0.30.3 pip install modelscope1.16.1 pip install transformers4.43.2 pip install accelerate0.32.1各依赖包在本方案中的职责如下依赖包版本作用fastapi0.111.1高性能 Web 框架负责定义路由与处理 HTTP 请求uvicorn0.30.3ASGI 服务器负责承载并运行 FastAPI 应用modelscope1.16.1魔搭社区的模型下载工具提供snapshot_download接口transformers4.43.2HuggingFace 生态核心库提供AutoTokenizer与AutoModelForCausalLMaccelerate0.32.1分布式/多卡加载工具配合device_mapauto自动切分模型到多张 GPU说明transformers4.43.2与accelerate0.32.1的版本组合经过了本教程验证如需升级请关注库间兼容性。考虑到部分同学配置环境可能遇到问题仓库作者在 AutoDL 平台准备了 DeepSeek-Coder-V2-Lite-Instruct 的环境镜像可直接一键创建实例使用参见原文档说明。三、模型下载使用 ModelScope snapshot_downloadDeepSeek-Coder-V2-Lite-Instruct 的权重较大在国内环境下优先推荐通过魔搭社区ModelScope下载。先切换到数据盘目录并新建下载脚本cd /root/autodl-tmp新建model_download.py文件并写入以下内容# model_download.py import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer model_dir snapshot_download(deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct, cache_dir/root/autodl-tmp, revisionmaster)然后执行python model_download.pysnapshot_download三个核心参数的含义第一个参数模型名称deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct即魔搭社区的模型仓库 IDcache_dir自定义的模型下载路径此处为/root/autodl-tmp请根据实际修改revision模型仓库的分支版本master代表主分支也是一般模型上传的默认分支即最新版本。注意该模型权重文件比较大约 40 GB下载需要耐心等待一段时间。模型下载完成后权重将存放在cache_dir下以模型 ID 命名的目录中即/root/autodl-tmp/deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct后续代码加载时会用到这个路径。四、编写 FastAPI 服务代码 api.py在/root/autodl-tmp路径下新建api.py文件粘贴以下完整代码并保存。代码带有详细注释核心功能包括多卡显存清理、POST 接口定义、对话模板应用、模型生成与响应封装。# api.py from fastapi import FastAPI, Request from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline import uvicorn import json import datetime import torch # 设置设备参数 DEVICE cuda # 使用CUDA CUDA_DEVICES [0, 1, 2, 3] # CUDA设备ID列表这里假设我们有四张N卡所以编号分别为0123 DEVICE_IDS [f{DEVICE}:{device_id} for device_id in CUDA_DEVICES] # 组合CUDA设备信息 # 清理GPU内存函数 def torch_gc(): if torch.cuda.is_available(): # 检查是否可用CUDA for device_id in DEVICE_IDS: # 循环每个CUDA设备 with torch.cuda.device(device_id): # 指定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) # 获取请求中的提示 messages [ {role: system, content: You are a helpful assistant.}, {role: user, content: prompt} ] # 调用模型进行对话生成 input_ids tokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue) model_inputs tokenizer([input_ids], return_tensorspt).to(cuda) generated_ids model.generate(model_inputs.input_ids,max_new_tokens512) 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_tokensTrue)[0] now datetime.datetime.now() # 获取当前时间 time now.strftime(%Y-%m-%d %H:%M:%S) # 格式化时间为字符串 # 构建响应JSON answer { response: response, status: 200, time: time } # 构建日志信息 log [ time ] , prompt: prompt , response: repr(response) print(log) # 打印日志 torch_gc() # 执行GPU内存清理 return answer # 返回响应 # 主函数入口 if __name__ __main__: # 加载预训练的分词器和模型 model_name_or_path /root/autodl-tmp/deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct tokenizer AutoTokenizer.from_pretrained(model_name_or_path, use_fastFalse) model AutoModelForCausalLM.from_pretrained(model_name_or_path, device_mapauto, torch_dtypetorch.bfloat16) # 启动FastAPI应用 # 用6006端口可以将autodl的端口映射到本地从而在本地使用api uvicorn.run(app, host0.0.0.0, port6006, workers1) # 在指定端口和主机上启动应用4.1 多卡显存清理torch_gc代码开头定义了两组设备相关变量DEVICE cuda指定推理设备为 CUDA GPUCUDA_DEVICES [0, 1, 2, 3]假设环境中有四张 NVIDIA 显卡按编号列出全部设备 IDDEVICE_IDS将设备名与编号组合为[cuda:0, cuda:1, cuda:2, cuda:3]供后续循环遍历。torch_gc()函数用于在每次请求结束后清理显存先通过torch.cuda.is_available()判断 CUDA 是否可用然后遍历全部设备对每个设备依次执行torch.cuda.empty_cache()清空 PyTorch 的缓存分配器与torch.cuda.ipc_collect()收集跨进程通信产生的显存碎片。长期运行的服务中每轮请求后及时调用它可以避免显存碎片累积导致 OOM。4.2 POST 接口与对话生成逻辑app.post(/)定义了一个接收 POST 请求的根路径端点其内部处理流程为解析请求体await request.json()获取 JSON 数据经json.dumps序列化再json.loads反序列化得到 Python 字典从中取出prompt字段作为用户输入组装消息构造messages列表包含一条 system 消息You are a helpful assistant.和一条 user 消息用户 prompt这是标准的对话式输入格式应用对话模板调用tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue)将消息列表格式化为模型要求的输入文本。add_generation_promptTrue会在末尾追加生成提示符如Assistant:告诉模型开始生成回答模型生成tokenizer([input_ids], return_tensorspt).to(cuda)将文本编码为张量并送到 GPUmodel.generate(model_inputs.input_ids, max_new_tokens512)触发自回归生成max_new_tokens512限制最多新增 512 个 token截取与解码由于generate返回的是输入 生成的完整序列需要按output_ids[len(input_ids):]截掉输入部分仅保留新生成内容再用tokenizer.batch_decode(..., skip_special_tokensTrue)解码为文本跳过特殊 token封装响应将生成文本与当前时间datetime格式化打包为{response: ..., status: 200, time: ...}返回同时在终端打印请求与响应日志。4.3 模型加载与 Uvicorn 启动在__main__入口中AutoTokenizer.from_pretrained(model_name_or_path, use_fastFalse)加载分词器use_fastFalse使用经典版分词器以保证与模型的 tokenizer 配置完全一致AutoModelForCausalLM.from_pretrained(model_name_or_path, device_mapauto, torch_dtypetorch.bfloat16)加载因果语言模型device_mapauto让accelerate自动把模型各层切分到可用的多张 GPU 上torch_dtypetorch.bfloat16以 BF16 半精度加载权重显著降低显存占用并加速推理uvicorn.run(app, host0.0.0.0, port6006, workers1)启动 ASGI 服务host0.0.0.0监听所有网卡地址便于端口映射与外部访问port6006是服务端口workers1单进程运行大模型常驻显存多 worker 会重复加载模型导致显存翻倍。端口选择说明选择6006是因为 AutoDL 平台支持将该端口映射到本地从而可以在本地直接调用部署在云端的 API。4.4 对话模板DeepSeek-Coder-V2 的 Prompt 格式apply_chat_template之所以必要是因为 DeepSeek-Coder-V2-Lite-Instruct 有特定的对话模板格式。在同目录的 Lora 微调文档 中给出了该模板的原文begin▁of▁sentence{system_message} User: {user_message_1} Assistant: {assistant_message_1}end▁of▁sentenceUser: {user_message_2} Assistant:可见其模板以begin▁of▁sentence开头用User:/Assistant:区分对话角色并以end▁of▁sentence标记一句回复的结束。手工拼接容易出错因此代码统一交给apply_chat_template处理这也是 Transformers 4.43 中 chat template 的标准用法。五、启动 API 服务并观察显存占用在终端输入以下命令启动 API 服务cd /root/autodl-tmp python api.py终端出现 Uvicorn 运行日志包括Started server process、Waiting for application startup、Uvicorn running on http://0.0.0.0:6006等提示即表示服务启动成功服务启动后可以打开新的终端执行nvidia-smi观察模型权重加载后的显存占用情况从nvidia-smi输出可以看到模型权重被切分加载到多张 RTX 3090 上这正是device_mapauto多卡分载的效果。对比加载前后的显存变化加载前显存几乎空闲见 fig1-8可以直观感受到大模型推理对显存的需求量级也解释了为什么本教程选择在配备多张高性能显卡的云服务器上进行部署。六、接口调用验证curl 与 Python requests服务默认部署在6006端口通过POST方法调用。新建一个终端使用curl发起请求curl -X POST http://127.0.0.1:6006 \ -H Content-Type: application/json \ -d {prompt: 你好, history: []}得到的返回值如下{ response: 您好有什么我可以帮助您的吗无论是日常生活中的问题还是工作学习上的疑惑我都在这里尽力为您提供帮助和解答。, history: [ [ 你好, 您好有什么我可以帮助您的吗无论是日常生活中的问题还是工作学习上的疑惑我都在这里尽力为您提供帮助和解答。 ] ], status: 200, time: 2024-06-23 23:56:27 }调用示例结果如下图所示注意api.py中实际只读取了请求体里的prompt字段history字段在服务端会被忽略返回体中的history也仅用于示意。若需要真正的多轮对话能力需要在此基础上扩展历史消息拼接逻辑如将历史记录合并进messages列表。除了curl也可以使用 Python 的requests库进行调用。新建request.py# request.py import requests import json def get_completion(prompt): headers {Content-Type: application/json} data {prompt: prompt, history: []} response requests.post(urlhttp://127.0.0.1:6006, headersheaders, datajson.dumps(data)) return response.json()[response] if __name__ __main__: print(get_completion(你好帮我介绍一下DeepSeek-Coder-V2-Lite-Instruct大语言模型~))得到的返回值如下深度求索DeepSeek是一家专注实现AGI的中国的人工智能公司如果你提到的DeepSeek-Coder-V2-Lite-Instruct是该公司开发的某种产品或服务的一部分那么以下是对其的一般性介绍 1. **模型概述** - DeepSeek Coder-V2-Lite-Instruct可能是一个特定版本的大语言模型。大语言模型通常是指能够理解和生成人类自然语言的计算机程序。这类模型通常通过大量数据训练而成以便在广泛的文本上 学习语言模式和结构。 - Instruct部分可能表示该模型经过专门设计用于遵循指令或者执行特定的任务指示。这种类型的模型旨在更好地理解用户的查询意图并提供更准确的回答。 2. **技术特点** - **性能优化**作为Lite版本它可能在保持高性能的同时对资源的使用进行了优化使得它在计算成本较低的环境中也能高效运行。 - **指令跟随能力**Instruct表明该模型特别擅长处理那些需要明确指令才能正确执行的任务比如问答、文本生成等。 3. **应用场景** - 由于大语言模型的灵活性和强大的上下文理解能力它们可以应用于多种场景包括但不限于 - 内容创作帮助撰写文章、报告等。 - 客户支持自动回答常见问题提供即时的客户支持。 - 教育和培训为学生和专业人士提供个性化的学习材料和指导。 - 研究和分析辅助研究人员进行文献综述、数据分析等工作。 4. **未来展望** - 随着人工智能技术的不断进步大语言模型可能会变得更加复杂和强大能够在更多领域发挥作用并且更加精准地满足用户的需求。 请注意上述描述基于一般大语言模型的特征并不特指DeepSeek-Coder-V2-Lite-Instruct的具体功能和性能。如果需要了解该模型的详细信息建议直接咨询深度求索公司或查看官方发布的文档和资料。调用示例结果如下图所示curl适合快速验证服务连通性requests则适合在 Python 应用中程序化地调用模型接口。两种方式请求的都是同一个http://127.0.0.1:6006端点在实际项目中get_completion这样的封装函数可以无缝嵌入到业务代码、自动化脚本或下游 AI 应用中。七、扩展阅读从 API 到完整应用部署好 FastAPI 服务后可以在本仓库中找到同目录下的配套教程继续深入02-DeepSeek-Coder-V2-Lite-Instruct 接入 LangChain基于本地部署的模型自定义LLM类将模型接入 LangChain 框架实现与框架其他组件如知识库、Agent的无缝协作03-DeepSeek-Coder-V2-Lite-Instruct WebDemo 部署使用 Streamlit 搭建可视化聊天界面为模型提供浏览器交互入口04-DeepSeek-Coder-V2-Lite-Instruct Lora 微调基于 transformers peft 对模型进行 Lora 高效微调训练个性化模型后再套用本教程的 API 封装对外提供服务。其中 Lora 微调文档还提供了模型内部的架构线索其LoraConfig的target_modules包含[q_proj, kv_a_proj_with_mqa, kv_b_proj, o_proj, gate_proj, up_proj, down_proj]等层。从这些层名可以推断DeepSeek-Coder-V2 系列采用了 MLAMulti-head Latent Attention键值对投影被拆分为kv_a_proj与kv_b_proj加 MoE混合专家包含gate_proj门控层的架构设计这也是其推理效率较高的底层原因之一。理解这些层结构对后续做 LoRA 目标层选择、显存规划都很有帮助。本教程给出的 FastAPI 封装是上述所有应用的地基——无论是 LangChain 集成还是 Web Demo最终都需要一个稳定、可复用的模型服务接口。掌握api.py的接口设计、请求处理与显存管理思路后即可在此基础上按需扩展多轮对话、流式输出、并发控制等更高级的工程能力。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考