ARTICLE DETAIL

资讯详情

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

BlueLM-7B-Chat FastAPI 部署实战:基于 self-llm 从零搭建可调用的 LLM 推理服务

BlueLM-7B-Chat FastAPI 部署实战:基于 self-llm 从零搭建可调用的 LLM 推理服务 BlueLM-7B-Chat FastAPI 部署实战基于 self-llm 从零搭建可调用的 LLM 推理服务【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm本指南以《开源大模型食用指南》self-llm仓库中的 01-BlueLM-7B-Chat FastApi 部署 文档为主体完整讲解 vivo AI 开源的 BlueLM-7B-Chat 大模型在 Linux 环境下的 FastAPI 服务化部署全流程包括云 GPU 环境准备、ModelScope 模型下载、api.py服务端实现原理、服务启动验证以及 curl / Python requests 两种客户端调用方式。学完本文你将掌握一套可复制、可运行的大模型 HTTP 推理服务搭建方案并理解其底层对话模板与生成配置的实现细节。模型速览vivo 开源的 7B 中英双语大模型BlueLM-7B 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型参数规模为 70 亿。根据发布时的官方说明BlueLM-7B 在 C-Eval 和 CMMLU 等中文评测基准上均取得领先结果在同尺寸开源模型中具有较强的竞争力。本次发布共包含 7B 模型的基座Base和对齐Chat两个版本并额外提供面向长上下文与低资源场景的变体基座模型对齐模型BlueLM-7B-BaseBlueLM-7B-ChatBlueLM-7B-Base-32KBlueLM-7B-Chat-32KBlueLM-7B-Chat-4bits其中Base 版为未经过指令对齐的基座模型适合作为继续预训练、领域微调的起点Chat 版经过对话对齐可直接用于指令跟随与多轮对话-32K后缀表示支持最长约 32K token 的长上下文输入-4bits后缀为 4bit 量化版本显存占用更低适合显存受限的部署环境。环境准备AutoDL 镜像选型与依赖安装租用 24G 显存机器并选择镜像本教程在 AutoDL 平台租赁一张 3090 等24G 显存的显卡机器。创建实例时镜像选择PyTorch -- 1.11.0 -- 3.8 (ubuntu20.04) -- 11.3Cuda 版本在 11.3 以上均可满足要求实例创建完成后打开 JupyterLab也可以使用 VSCode SSH 远程连接服务器在终端中依次完成环境配置、模型下载与 demo 运行。pip 换源与依赖安装为加速依赖下载先升级 pip 并配置清华镜像源再安装服务运行所需依赖# 升级pip python -m pip install --upgrade pip # 设置pip镜像源 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.11.0 pip install transformers4.37.0 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install accelerate0.24.1 pip install transformers_stream_generator0.0.4各依赖在部署链路中的职责如下fastapiuvicorn搭建并托管 HTTP 服务uvicorn是 ASGI 服务器负责接收请求并交给 FastAPI 应用处理transformersaccelerate加载模型与分词器accelerate用于支持device_mapauto的多设备自动分配modelscope国内可稳定访问的模型下载通道用于拉取模型权重sentencepieceBlueLM 分词器依赖的底层分词库transformers_stream_generator为流式生成提供支持WebDemo 场景使用requests客户端调用测试streamlit后续 WebDemo 部署所需。模型下载ModelScope 快速拉取 BlueLM-7B-Chat使用 ModelScope API 将BlueLM-7B-Chat下载到/root/autodl-tmp目录。在/root/autodl-tmp下创建model_download.py内容如下from modelscope import snapshot_download model_dir snapshot_download(vivo-ai/BlueLM-7B-Chat, cache_dir/root/autodl-tmp, revisionmaster)snapshot_download会将模型完整快照权重、配置文件、分词器文件与推理所需的自定义代码下载到cache_dir指定目录。下载完成后模型实际落在/root/autodl-tmp/vivo-ai/BlueLM-7B-Chat路径下——这一点与同目录 LangChain 接入文档 中的本地路径写法/root/autodl-tmp/vivo-ai/BlueLM-7B-Chat相互印证。API 服务端代码详解在/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 f[|Human|]:{prompt}[|AI|]: # 构建输入 inputs tokenizer(messages, return_tensorspt) inputs inputs.to(cuda:0) # 通过模型获得输出 outputs model.generate(**inputs, max_new_tokensmax_length) result tokenizer.decode(outputs.cpu()[0], 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_pathvivo-ai/BlueLM-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, host127.0.0.1, port6006, workers1) # 在指定端口和主机上启动应用全局配置与 GPU 内存管理DEVICE、DEVICE_ID与CUDA_DEVICE三个变量共同定位推理设备DEVICE cuda指定使用 GPUDEVICE_ID 0指定第 0 块显卡两者拼接为cuda:0若DEVICE_ID为空则退化为仅使用cuda设备名。torch_gc()是每次请求结束后的显存回收函数先通过torch.cuda.empty_cache()清空 PyTorch 的缓存分配器再调用torch.cuda.ipc_collect()收集跨进程的 CUDA 内存碎片避免长时服务运行过程中显存持续膨胀。请求处理与对话模板拼接app.post(/)注册了一个根路径的 POST 端点。处理逻辑为通过await request.json()读取请求体经json.dumps/json.loads标准化后取出prompt与可选参数max_length按 BlueLM 的对话模板拼接输入messages f[|Human|]:{prompt}[|AI|]:。BlueLM 采用与 LLaMA 系不同的双角色模板——只有[|Human|]人类与[|AI|]模型两个角色标记模型会根据该前缀自动续写出回答。这一点在同目录 Lora 微调文档 的数据格式化章节中有明确印证BlueLM 只有[|Human|]和[|AI|]两个角色将拼接后的字符串交给tokenizer编码为input_ids并显式移动到cuda:0调用model.generate(**inputs, max_new_tokensmax_length)进行自回归生成。需要说明的是请求体中的max_length字段实际被作为max_new_tokens使用即限制新生成 token 的数量上限而非总序列长度如果客户端未传该字段则max_new_tokensNone此时生成长度将回落到GenerationConfig中的默认值。生成完成后tokenizer.decode(outputs.cpu()[0], skip_special_tokensTrue)将完整序列含模板前缀解码为文本因此返回的response字段中会包含拼接后的完整对话内容。模型加载与生成配置主函数中的模型加载有三处关键配置trust_remote_codeTrueBlueLM 的建模代码以自定义实现形式随权重发布必须信任并执行远程代码才能正确加载架构torch_dtypetorch.bfloat16以 BF16 半精度加载权重显著降低显存占用并提升推理吞吐device_mapauto由 accelerate 自动将各层分配到可用设备单卡场景即整卡加载。加载后还设置了生成配置model.generation_config GenerationConfig.from_pretrained(mode_name_or_path) model.generation_config.pad_token_id model.generation_config.eos_token_id从模型仓库读取官方生成配置并将pad_token_id对齐为eos_token_id——这是为防止生成时因 padding 与结束符不一致而出现异常输出的常见修复手段。最后model.eval()切换到评估模式关闭 Dropout 等训练行为。启动 FastAPI 服务uvicorn.run(app, host127.0.0.1, port6006, workers1)服务监听在127.0.0.1:6006。workers1表示单进程运行——由于模型常驻显存多 worker 会重复加载模型导致显存翻倍单进程是最稳妥的选择。端口选择 6006 的原因是 AutoDL 平台支持将该端口映射到本地从而在本地直接调用远端 API。启动服务并验证在 bash 终端中运行以下命令启动 API 服务cd /root/autodl-tmp python api.py终端出现以下输出即表示服务启动成功Uvicorn 已监听 6006 端口启动过程会先打印Loading checkpoint shards: 100%权重分片加载完成随后依次输出Started server process、Application startup complete.与Uvicorn running on http://0.0.0.0:6006 (Press CTRLC to quit)日志。此后保持该终端运行另开一个终端即可进行调用测试。客户端调用curl 与 Python requestscurl 调用服务默认端口为 6006通过 POST 方法调用。新开一个终端使用 curl 发送请求curl -X POST http://127.0.0.1:6006 \ -H Content-Type: application/json \ -d {prompt: 你好}Python requests 调用也可以使用 Python 的requests库进行调用将下述代码保存为脚本或直接在 Notebook 中执行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:2024-03-20 12:09:29}响应格式说明服务端返回统一的 JSON 结构包含三个字段字段类型说明responsestring模型生成的完整文本含对话模板前缀statusint固定为 200表示请求处理成功timestring服务端处理该请求的时间戳格式为YYYY-MM-DD HH:MM:SS从 API 服务走向上层应用FastAPI 服务化只是第一步self-llm 仓库为 BlueLM 提供了完整的后续应用链路可基于已部署的 API 或本地模型继续扩展接入 LangChain 框架参考 02-BlueLM-7B-Chat langchain 接入通过继承LangChain.llms.base.LLM并重写_call函数将 BlueLM 封装为自定义 LLM 类从而以统一接口接入 LangChain 生态屏蔽底层模型差异部署 Web 聊天界面参考 03-BlueLM-7B-Chat WebDemo 部署基于 Streamlit 构建带多轮会话历史build_prompt将历史消息按[|Human|]:... [|AI|]:.../s格式拼装与流式输出的交互式 ChatbotLoRA 高效微调参考 04-BlueLM-7B-Chat Lora 微调 及其配套 微调脚本、Notebook基于peft对模型注入低秩适配器微调数据为仓库根目录的 dataset/huanhuan.json甄嬛风格指令数据集。从微调脚本源码可见实际生效的target_modules为[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj]覆盖全部注意力投影与 FFN 门控/上下投影层r8、lora_alpha32时缩放系数为 4 倍。常见问题与注意事项模型路径写法api.py中mode_name_or_path直接使用模型名vivo-ai/BlueLM-7B-Chat由 Transformers 自动解析若已通过 ModelScope 将模型下载到本地也可将其替换为本地路径/root/autodl-tmp/vivo-ai/BlueLM-7B-Chat与 LangChain 接入文档 中的加载方式保持一致显存与精度24G 显存运行 BF16 精度的 7B 模型完全够用若显存紧张可选用 4bits 量化版 BlueLM-7B-Chat-4bits或考虑以torch.float16加载见 LangChain 文档中的torch_dtypetorch.float16写法端口映射AutoDL 实例需在平台控制台将 6006 端口映射到本地才能从本地浏览器或代码访问远端 API单 worker 限制请勿随意增大uvicorn.run的workers参数多进程会重复占用显存长时运行的显存管理服务端已在每次请求后调用torch_gc()回收显存日常使用中无需手动干预。至此一个基于 FastAPI 的 BlueLM-7B-Chat 推理服务已完整上线从 AutoDL 环境准备、ModelScope 模型下载到api.py服务端实现与 curl / requests 双通道调用验证全流程可复现。后续可结合仓库内的 LangChain 接入、WebDemo 与 LoRA 微调文档将该服务快速扩展为完整的应用闭环。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表