ARTICLE DETAIL

资讯详情

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

CharacterGLM-6B FastAPI 部署调用实战:从环境配置到可复用的 HTTP 对话服务

CharacterGLM-6B FastAPI 部署调用实战:从环境配置到可复用的 HTTP 对话服务 CharacterGLM-6B FastAPI 部署调用实战从环境配置到可复用的 HTTP 对话服务【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm本篇文章基于 Datawhale 开源项目《开源大模型食用指南》中的 CharacterGLM-6B FastApi 部署调用 文档完整讲解如何在 AutoDL 云端 GPU 环境中下载 CharacterGLM-6B 模型并用 FastAPI 将其封装为可通过 HTTP POST 请求调用的对话服务。读者学完本指南后将能够独立完成「租机 → 配环境 → 下模型 → 写服务 → curl/Python 双路调用」的完整闭环并把返回的角色化对话能力接入自己的业务系统。一、部署方案概述CharacterGLM-6B 是聆心智能与清华大学 CoAI 实验室联合发布的对话预训练模型其最大特点在于角色化对话模型不仅接收普通对话历史还接收一组角色设定元信息session_meta从而以特定人设如歌手苏梦远、导演陆星辰的口吻持续进行多轮对话。本项目文件夹下包含了 CharacterGLM-6B 的部署与微调全流程详见 models/CharacterGLM/readme.md其中01-Transformer 部署调用在终端内直接交互式对话本文档02-FastApi 部署调用将模型封装为 HTTP 服务供其他程序远程调用03-chatWebDemo/CLI Demo基于官方仓库的 Streamlit 对话界面。FastAPI 方案的核心价值在于服务化模型常驻显存、只加载一次之后所有调用方通过 HTTP 接口即可使用推理能力无需关心底层 Transformers 细节非常适合后续接入 LangChain 等应用框架。整体部署流程分为四步环境准备 → 模型下载 → 编写api.py→ 启动并验证服务。二、环境准备租用 GPU 机器并配置 Python 依赖2.1 在 AutoDL 租用 24G 显存显卡机器在 AutoDL 平台租用一台具备 24G 显存的显卡机器如 RTX 3090镜像选择如下见上图框架PyTorch -- 2.0.0Python 版本3.8 (ubuntu20.04)CUDA 版本11.8租用完成后打开 JupyterLab并在其中打开终端开始环境配置、模型下载与运行 demo。2.2 pip 换源与依赖安装首先升级 pip并更换为清华 PyPI 源以加速库的安装# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple随后安装 FastAPI 部署所需的依赖包。为便于查阅下表整理了文档中指定版本及各自用途依赖包版本用途fastapi0.104.1Web 框架提供路由与请求处理uvicorn0.24.0.post1ASGI 服务器承载 FastAPI 应用requests2.25.1客户端调用接口验证部署modelscope1.9.5下载模型权重transformers4.37.2加载与运行模型streamlit1.24.0交互式 Demo与本部署兼容sentencepiece0.1.99分词器依赖accelerate0.24.1模型加载加速对应安装命令如下pip install fastapi0.104.1 pip install uvicorn0.24.0.post1 pip install requests2.25.1 pip install modelscope1.9.5 pip install transformers4.37.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install accelerate0.24.1说明以上版本号来自仓库文档约定按指定版本安装可避免依赖冲突若后续需要升级模型框架请同步核对 transformers 与模型兼容性。三、模型下载使用 ModelScope 的 snapshot_download在/root/autodl-tmp路径下新建download.py文件写入以下内容粘贴后记得保存文件import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(THUCoAI/CharacterGLM-6B, cache_dir/root/autodl-tmp, revisionmaster)说明snapshot_download的第一个参数为模型名称THUCoAI/CharacterGLM-6Bcache_dir为模型的下载路径这里指向 AutoDL 的数据盘/root/autodl-tmp避免占用系统盘空间revisionmaster指定拉取 master 分支的模型文件。执行下载python /root/autodl-tmp/download.py模型大小为12 GB下载大概需要10~15 分钟。下载完成后模型文件将位于/root/autodl-tmp/THUCoAI/CharacterGLM-6B目录下后续加载模型时使用该本地路径即可。四、编写 FastAPI 服务代码在/root/autodl-tmp路径下新建api.py文件写入以下内容代码含详细注释from fastapi import FastAPI, Request from transformers import AutoTokenizer, AutoModelForCausalLM 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) # 获取请求中的温度参数 session_meta {user_info: 我是陆星辰是一个男性是一位知名导演也是苏梦远的合作导演。我擅长拍摄音乐题材的电影。苏梦远对我的态度是尊敬的并视我为良师益友。, bot_info: 苏梦远本名苏远心是一位当红的国内女歌手及演员。在参加选秀节目后凭借独特的嗓音及出众的舞台魅力迅速成名进入娱乐圈。她外表美丽动人但真正的魅力在于她的才华和勤奋。苏梦远是音乐学院毕业的优秀生善于创作拥有多首热门原创歌曲。除了音乐方面的成就她还热衷于慈善事业积极参加公益活动用实际行动传递正能量。在工作中她对待工作非常敬业拍戏时总是全身心投入角色赢得了业内人士的赞誉和粉丝的喜爱。虽然在娱乐圈但她始终保持低调、谦逊的态度深得同行尊重。在表达时苏梦远喜欢使用我们和一起强调团队精神。, bot_name: 苏梦远, user_name: 陆星辰} # 调用模型进行对话生成 response, history model.chat( tokenizer, session_meta, 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/THUCoAI/CharacterGLM-6B, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(/root/autodl-tmp/THUCoAI/CharacterGLM-6B, trust_remote_codeTrue).to(torch.bfloat16).cuda() model.eval() # 设置模型为评估模式 # 启动FastAPI应用 # 用6006端口可以将autodl的端口映射到本地从而在本地使用api uvicorn.run(app, host0.0.0.0, port6006, workers1) # 在指定端口和主机上启动应用下面对这段代码的每个关键环节逐一拆解4.1 设备与显存管理DEVICE cuda # 使用CUDA DEVICE_ID 0 # CUDA设备ID CUDA_DEVICE f{DEVICE}:{DEVICE_ID} if DEVICE_ID else DEVICECUDA_DEVICE最终为cuda:0用于在显存清理时指定设备。torch_gc()函数在每次请求处理完成后调用torch.cuda.empty_cache()清空未使用的缓存块torch.cuda.ipc_collect()回收进程间通信产生的显存碎片避免长时运行后显存占用持续攀升。4.2 请求端点与参数解析服务暴露单个POST /端点通过await request.json()读取请求体支持的输入字段及默认值如下请求字段类型默认值说明promptstr必填用户输入的提示文本historylist必填可传空列表多轮对话历史max_lengthint2048生成序列最大长度top_pfloat0.7核采样概率阈值temperaturefloat0.95采样温度对应代码中的处理方式为max_length if max_length else 2048即客户端未传该字段时自动回退到默认值。4.3 session_meta角色化对话的灵魂session_meta是 CharacterGLM 系列区别于普通 LLM 的关键参数包含四个字段user_info用户角色的设定这里为导演陆星辰bot_infoAI 角色的详细人设这里为歌手苏梦远包括外貌、性格、口头禅等bot_nameAI 角色名苏梦远user_name用户角色名陆星辰。该设定会随每次model.chat调用传入保证模型始终以苏梦远的人设进行回复。如需换成其他角色只需修改此字典即可无需改动任何业务代码——这正是该服务易于复用的关键设计。4.4 模型加载与服务启动在主函数入口中使用AutoTokenizer.from_pretrained/AutoModelForCausalLM.from_pretrained从本地路径加载模型并开启trust_remote_codeTrue允许执行模型仓库自带的远程代码这是 ChatGLM 系模型的常见要求通过.to(torch.bfloat16)以半精度bfloat16加载模型到显存显著降低显存占用调用model.eval()切换到评估模式通过uvicorn.run(app, host0.0.0.0, port6006, workers1)启动服务host0.0.0.0允许外部访问port6006与 AutoDL 端口映射约定一致。五、启动 API 服务在终端执行以下命令启动服务cd /root/autodl-tmp python api.py启动后模型开始加载观察终端出现Loading checkpoint shards字样即表示模型权重正在载入等待加载完成后服务即可对外提供推理能力。服务默认部署在6006 端口通过 POST 方法调用。六、接口调用验证6.1 方式一curl 命令行调用curl -X POST http://127.0.0.1:6006 \ -H Content-Type: application/json \ -d {prompt: 你好, history: []}从返回结果可以看到请求只携带prompt与history服务端即返回了角色化的response内容以及更新后的history可用于下一轮多轮对话同时附带了status: 200状态码。6.2 方式二Python requests 库调用新建api-requests.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(你是谁呀))新开一个终端执行cd /root/autodl-tmp python api-requests.py得到的返回值及结果展示如下{ response: 嗨,你好我叫苏梦远。微笑着向对方走去, history: [[你是谁呀, 嗨,你好我叫苏梦远。微笑着向对方走去]], status: 200, time: 2024-03-05 22:44:35 }6.3 响应结构解读每次请求的响应均为标准 JSON包含四个字段字段说明response模型生成的文本回复角色化风格history更新后的对话历史可直接回传给下一轮请求实现多轮对话status状态码200 表示成功time服务端处理时间戳调用方拿到history后原样传入下一次请求即可无缝维持多轮人设对话。七、原理纵深model.chat 的调用链与角色设定机制本文的 FastAPI 服务本质上是把 Transformers 原生对话能力做了一层 HTTP 封装。核心的model.chat调用方式与仓库中的 01-CharacterGLM-6B Transformer部署调用.md 完全一致tokenizer AutoTokenizer.from_pretrained(model_dir, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(model_dir, trust_remote_codeTrue) device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) model.eval() session_meta {user_info: ..., bot_info: ..., bot_name: ..., user_name: ...} response, history model.chat(tokenizer, session_meta, 你好呀小苏, history[])对比可见二者使用同一套session_meta结构与model.chat(tokenizer, session_meta, prompt, historyhistory)调用接口说明本服务是对原生调用能力的直接服务化封装角色化行为完全一致FastAPI 方案的关键差异在于模型只加载一次并常驻显存workers1保证单进程内模型复用每次 HTTP 请求仅执行一次model.chat推理从而把「调用一次、加载一次」的原生脚本改造成了可被任意客户端高频复用的推理服务从源码结构看model.chat内部会将session_meta中的人物设定与对话历史拼接为完整的 prompt 后送入模型解码因此角色设定的质量直接决定回复的人设一致性实际使用时建议像api.py中那样为人设补充性格、经历、说话习惯等细节。八、将服务映射到本地使用由于服务运行在 AutoDL 云端服务器上若希望在本地浏览器或程序中访问http://127.0.0.1:6006需要在 AutoDL 控制台将该 6006 端口映射到本地。具体操作方式可参考仓库中的 models/General-Setting/02-AutoDL开放端口.md其方法与仓库内其他 Demo如 03-CharacterGLM-6B-chat.md 中的 Streamlit WebDemo一致均通过将 AutoDL 的 6006 端口映射到本机http://localhost:6006来实现。映射完成后本地任意程序浏览器、脚本、后端服务均可直接请求http://localhost:6006使用该对话 API。九、常见问题与注意事项模型加载缓慢12 GB 权重首次加载需要时间终端出现Loading checkpoint shards属正常现象加载完成后不要频繁重启进程否则需重复加载。显存占用使用torch.bfloat16半精度加载是控制显存的关键RTX 309024G足以承载该模型。长时运行时torch_gc()会在每次请求后清理显存碎片。trust_remote_code 提示加载时须开启trust_remote_codeTrue这是 ChatGLM 系模型加载自定义代码的必需项。多轮对话务必把上一轮响应中的history原样回传给下一轮请求否则模型会丢失上下文。端口冲突若 6006 端口被占用可修改uvicorn.run中的port参数并同步调整 AutoDL 端口映射设置。workers 数量文档约定workers1避免多进程同时加载模型导致显存溢出。十、总结通过本文我们完成了 CharacterGLM-6B 从「租机 → 配置环境 → 下载模型 → 编写 FastAPI 服务 → curl/requests 双路验证」的完整部署闭环。最终交付的是一个运行在 6006 端口、可通过标准 HTTP POST 调用、内置角色人设苏梦远/陆星辰、支持多轮对话的稳定推理服务。该服务的调用方式prompthistory 采样参数与响应结构responsehistorystatustime均为标准 JSON可以很方便地被 LangChain 等上层框架或业务系统集成。若需要进一步基于该模型做角色定制训练可继续参考仓库中的 04-CharacterGLM-6B Lora微调.md 与配套的 04-CharacterGLM-6B-Lora微调.py构建微调 部署的完整生产链路。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/datawhalechina/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表