ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Qwen-7B-Chat FastAPI 部署调用实战:基于 AutoDL 从模型下载到 HTTP 推理服务

Qwen-7B-Chat FastAPI 部署调用实战:基于 AutoDL 从模型下载到 HTTP 推理服务 大模型人工智能教程本地部署微调【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址https://gitcode.com/datawhalechina/self-llm点击查看免费下载导读本文是《开源大模型食用指南》Datawhale / self-llm 仓库中 Qwen-7B-Chat 模型部署系列的第二篇核心目标是在 Linux CUDA 环境下将 Qwen-7B-Chat 对话模型封装为一个可通过 HTTP POST 请求调用的 FastAPI 推理服务。读完本文你将掌握 AutoDL 显卡实例与镜像的选配方法、使用 ModelScope 下载模型权重、编写带参数解析与显存管理的api.py服务端代码以及通过curl和 Pythonrequests两种方式调用接口为后续接入 LangChain 知识库、Web 应用开发打下可复用的部署基础。一、环境准备显卡实例与镜像选择Qwen-7B-Chat 为 7B 规模对话模型推理阶段需要约 15GB 显存因此推荐在 AutoDL 平台租用RTX 3090 等 24G 显存的显卡机器。镜像选择关键参数如下框架PyTorch框架版本2.0.0Python 版本3.8ubuntu20.04CUDA 版本11.811.3 版本以上的都可以仓库中同时提供了基于 conda 的 environment.yml其中指定了pytorch-cuda11.8、python3.10等依赖与本文镜像选型的 CUDA 版本保持一致可作为本地或容器环境复现的参考。租用完成后打开服务器的 JupyterLab 并进入其中的终端后续的环境配置、模型下载和运行演示均在该终端内完成。1.1 pip 换源与依赖安装首先升级 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各依赖的角色说明依赖包版本作用fastapi0.104.1Web 框架负责 HTTP 路由与请求/响应处理uvicorn0.24.0.post1ASGI 服务器驱动 FastAPI 应用对外提供服务requests2.25.1客户端调用接口时使用的 HTTP 库modelscope1.9.5从 ModelScope 模型库下载模型权重transformers4.35.2加载模型与分词器、执行对话生成streamlit1.24.0为后续 WebDemo 界面预留sentencepiece0.1.99Qwen 分词器依赖的分词工具accelerate0.24.1支持device_mapauto自动设备分配transformers_stream_generator0.0.4流式生成支持组件相关通用配置细节可参考仓库 General-Setting/01-pip、conda换源.md。二、模型下载使用 ModelScope 拉取权重使用modelscope中的snapshot_download函数下载模型第一个参数为模型名称参数cache_dir为模型的下载路径。在/root/autodl-tmp路径下新建download.py文件并输入以下内容粘贴代码后记得保存然后运行python /root/autodl-tmp/download.py执行下载。模型大小为15 GB下载大概需要10~20 分钟import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer from modelscope import GenerationConfig model_dir snapshot_download(qwen/Qwen-7B-Chat, cache_dir/root/autodl-tmp, revisionv1.1.4)几个关键参数的说明qwen/Qwen-7B-ChatModelScope 上的模型唯一标识cache_dir/root/autodl-tmp模型保存目录下载完成后权重位于/root/autodl-tmp/qwen/Qwen-7B-Chatrevisionv1.1.4指定模型版本保证与教程环境一致、便于复现。仓库中 07-Qwen-7B-Chat 接入langchain搭建知识库助手.md 使用了revisionmaster可见该参数可灵活指定为发布版本或主干分支。三、代码准备编写 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) # 获取请求中的提示 history json_post_list.get(history) # 获取请求中的历史记录 max_length json_post_list.get(max_length) # 获取请求中的最大长度 top_p json_post_list.get(top_p) # 获取请求中的top_p参数 temperature json_post_list.get(temperature) # 获取请求中的温度参数 # 调用模型进行对话生成 response, history model.chat( tokenizer, prompt, historyhistory, max_lengthmax_length if max_length else 2048, # 如果未提供最大长度默认使用2048 top_ptop_p if top_p else 0.7, # 如果未提供top_p参数默认使用0.7 temperaturetemperature if temperature else 0.95 # 如果未提供温度参数默认使用0.95 ) now datetime.datetime.now() # 获取当前时间 time now.strftime(%Y-%m-%d %H:%M:%S) # 格式化时间为字符串 # 构建响应JSON answer { response: response, history: history, status: 200, time: time } # 构建日志信息 log [ time ] , prompt: prompt , response: repr(response) print(log) # 打印日志 torch_gc() # 执行GPU内存清理 return answer # 返回响应 # 主函数入口 if __name__ __main__: # 加载预训练的分词器和模型 tokenizer AutoTokenizer.from_pretrained(/root/autodl-tmp/qwen/Qwen-7B-Chat, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(/root/autodl-tmp/qwen/Qwen-7B-Chat, device_mapauto, trust_remote_codeTrue).eval() model.generation_config GenerationConfig.from_pretrained(/root/autodl-tmp/qwen/Qwen-7B-Chat, trust_remote_codeTrue) # 可指定 model.eval() # 设置模型为评估模式 # 启动FastAPI应用 # 用6006端口可以将autodl的端口映射到本地从而在本地使用api uvicorn.run(app, host0.0.0.0, port6006, workers1) # 在指定端口和主机上启动应用3.1 设备参数与显存管理DEVICE cuda、DEVICE_ID 0组合成CUDA_DEVICE cuda:0用于后续显存清理时指定设备若DEVICE_ID为空则直接使用cuda默认设备。torch_gc()在每次请求处理完毕后调用torch.cuda.empty_cache()清空缓存、torch.cuda.ipc_collect()回收跨进程显存碎片。对于常驻服务进程这一步能有效避免多轮请求后显存持续增长。3.2 请求处理与生成参数解析app.post(/)注册根路径的 POST 端点请求体为 JSON支持五个字段请求字段默认值说明prompt必填用户输入提示词history无多轮对话历史列表形式max_length2048生成序列的最大长度top_p0.7核采样概率阈值temperature0.95采样温度越低越保守、越高越发散参数通过json_post_list.get(...)获取并配合if ... else提供默认值因此客户端可以不传可选参数服务端自动兜底。3.3 model.chat 对话接口与 GenerationConfigQwen-7B-Chat 是具备自研chat方法的对话模型model.chat(tokenizer, prompt, historyhistory, ...)内部会自动拼接 Qwen 的对话模板system/user/assistant 轮次并返回(response, history)二元组返回的history可以再次传入实现多轮对话。仓库中 01-Qwen-7B-Chat Transformers部署调用.md 展示了同一接口在交互脚本中的用法首轮historyNone发起对话后续每轮把上一轮返回的history传入即可保持上下文连续。model.generation_config GenerationConfig.from_pretrained(...)从模型目录加载官方推荐的生成配置可覆盖指定生成长度、top_p等超参device_mapauto由 accelerate 自动把模型分配到可用设备上trust_remote_codeTrue允许加载 Qwen 仓库中随权重发布的远程代码如modeling_qwen.py。3.4 服务启动参数uvicorn.run(app, host0.0.0.0, port6006, workers1)将服务绑定到所有网卡地址的 6006 端口workers1单进程模式避免多进程下模型重复加载与显存翻倍。选择 6006 端口的原因在于 AutoDL 平台可直接将该端口映射到本地从而在本地浏览器或脚本中使用该 API端口开放细节见 General-Setting/02-AutoDL开放端口.md。四、API 部署与调用验证4.1 启动服务在终端执行以下命令启动 API 服务cd /root/autodl-tmp python api.py模型加载完毕后终端会输出加载进度与警告信息出现类似下图包含模型权重分片加载、依赖组件初始化等日志即说明加载完成4.2 使用 curl 调用服务默认部署在 6006 端口通过 POST 方法调用curl -X POST http://127.0.0.1:6006 \ -H Content-Type: application/json \ -d {prompt: 你好, history: []}4.3 使用 Python requests 调用也可以编写 Python 脚本调用接口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(你好))4.4 返回结果解析接口返回的 JSON 结构如下{ response:你好很高兴为你服务。有什么我可以帮助你的吗, history:[[你好,你好很高兴为你服务。有什么我可以帮助你的吗]], status:200, time:2023-11-26 1:14:20 }字段说明response为模型生成文本history为更新后的多轮对话历史可直接回传继续对话status为业务状态码time为服务端响应时间。下图展示了通过脚本调用接口并打印模型返回结果的效果五、从源码结构看部署要点与进阶方向5.1 两种对话接口模式的区别对比仓库中 02-Qwen2.5-7B-Instruct FastApi 部署调用.md 可见Qwen-7B-Chat 使用模型自带的model.chat接口模板拼接封装在模型内而 Qwen2.5 系列使用tokenizer.apply_chat_templatemodel.generate的标准 transformers 流程。理解这一差异有助于在阅读仓库内数十篇 FastAPI 部署文档覆盖 Qwen 全系列、ChatGLM、Baichuan、LLaMA 等模型时快速定位各自请求处理代码的差异点。5.2 端口映射与本地联调AutoDL 等云 GPU 平台通过端口映射机制将实例的 6006 端口转发到本地http://localhost:6006。映射完成后本地的curl、requests脚本乃至浏览器均能访问远程 GPU 实例上的推理服务这与仓库中 03-Qwen-7B-Chat WebDemo.md 部署 Gradio 界面时使用同一 6006 端口映射策略。5.3 后续进阶路线本服务返回的response与history可直接作为上层应用的模型后端在 07-Qwen-7B-Chat 接入langchain搭建知识库助手.md 中FastAPI 推理服务被进一步与 LangChain、向量数据库结合构建 RAG 知识库问答若需对模型本身进行定制可参考同目录下的 04-Qwen-7B-Chat Lora 微调.md、05-Qwen-7B-Chat Ptuning 微调.md 与 06-Qwen-7B-chat 全量微调.md微调产出后只需将api.py中的模型路径指向新权重即可无缝切换。六、小结本文完整走通了「显卡与镜像选配 → 依赖安装 → ModelScope 权重下载 → FastAPI 服务端编写 → curl/requests 双通道调用验证」的 Qwen-7B-Chat 部署全流程。核心收益在于以约 40 行服务端代码将大模型对话能力标准化为可复用的 HTTP 接口同时通过history回传天然支持多轮对话、通过torch_gc()保障长稳运行。该模式在 models 目录下其他模型的 FastAPI 部署文档中被大量复用掌握了本文的骨架即可快速迁移到仓库内任意模型的线上服务搭建。赞分享大模型人工智能教程本地部署微调【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址https://gitcode.com/datawhalechina/self-llm点击查看免费下载相关推荐Qwen-7B-Chat FastAPI 部署调用从模型下载到 HTTP 服务化的完整实战指南Qwen 7B Chat FastAPI 部署调用从模型下载到 HTTP 服务化的完整实战指南 导读 本文基于《开源大模型食用指南》仓库self llm中教程大模型本地部署微调Qwen2-7B-Instruct FastAPI 部署调用实战从 AutoDL 环境搭建到 HTTP 服务上线Qwen2 7B Instruct FastAPI 部署调用实战从 AutoDL 环境搭建到 HTTP 服务上线 导读 本指南基于《开源大模型食用指南》仓库中教程大模型本地部署微调Baichuan2-7B-Chat FastAPI 部署调用基于 self-llm 的本地大模型 HTTP 服务实战指南Baichuan2 7B Chat FastAPI 部署调用基于 self llm 的本地大模型 HTTP 服务实战指南 导读 本文基于《开源大模型食用指南》大模型人工智能教程本地部署微调创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表