ARTICLE DETAIL

资讯详情

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

书生·浦语 InternLM2-7B-Chat 基于 FastAPI 的本地部署与 API 调用实战指南

书生·浦语 InternLM2-7B-Chat 基于 FastAPI 的本地部署与 API 调用实战指南 书生·浦语 InternLM2-7B-Chat 基于 FastAPI 的本地部署与 API 调用实战指南【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm本篇文章以《开源大模型食用指南》仓库中 InternLM2-7B-chat FastAPI 部署文档 为主体完整讲解如何基于 AutoDL 平台与 ModelScope 完成 InternLM2-7B-Chat 的模型下载、FastAPI 服务搭建、启动与调用验证。读完本文你将掌握一条从零到一、可直接复制的 LLM API 服务化部署路径能够用 curl 或 Python requests 对本地的 InternLM2-7B-Chat 发起对话请求并理解部署代码中每一处关键实现的作用为后续接入 LangChain 知识库、WebDemo 或进一步微调打下基础。InternLM2-7B-Chat 模型简介InternLM2 即书生·浦语大模型第二代由上海人工智能实验室开源本次部署目标是面向实用场景的 70 亿参数对话模型 InternLM2-Chat-7B。根据仓库部署文档的说明该模型具备以下核心能力超长上下文支持有效支持 20 万字超长上下文模型在 20 万字长输入中几乎完美地实现长文大海捞针在 LongBench 和 L-Eval 等长文任务中的表现也达到开源模型中的领先水平。文档同时提示可以通过 LMDeploy 尝试 20 万字超长上下文推理。综合性能全面提升在推理、数学、代码、对话体验、指令遵循和创意写作等能力维度相比上一代模型全面进步综合性能达到同量级开源模型的领先水平。代码解释器与数据分析在配合代码解释器code-interpreter的条件下InternLM2-Chat-20B 在 GSM8K 和 MATH 上可以达到和 GPT-4 相仿的水平并基于数理与工具能力提供实用的数据分析能力。工具调用能力升级基于更强的指令理解、工具筛选与结果反思能力可更可靠地支持复杂智能体的搭建支持对工具进行有效的多轮调用。以上能力描述均引自仓库中的部署文档原文作为部署前的背景认知本文重点聚焦如何将其快速服务化。环境准备在 AutoDL 上租赁 GPU 机器本次部署在 AutoDL 云平台进行核心诉求是获得一块 24G 显存的显卡如 RTX 3090用于加载 7B 量级的对话模型。在 AutoDL 租用服务器时镜像选择遵循以下组合文档中的推荐配置框架FrameworkPyTorch框架版本2.0.0Python 版本3.8ubuntu20.04CUDA 版本11.8文档同时说明 11.3 版本以上均可租用成功后打开服务器的JupyterLab并在其中打开终端后续的环境配置、模型下载与运行演示均在终端中完成。依赖安装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.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 pip install protobuf各依赖在本次部署中的角色如下依赖包版本作用fastapi0.104.1提供 API 服务框架用于构建 POST 请求端点uvicorn0.24.0.post1ASGI 服务器负责启动并托管 FastAPI 应用requests2.25.1客户端调用 API 时发送 HTTP 请求modelscope1.11.0从 ModelScope 模型库下载模型权重transformers4.37.0加载与运行 InternLM2 模型及分词器streamlit1.24.0可选 Web 演示组件本教程未直接使用但作为统一环境依赖一并安装sentencepiece0.1.99分词器底层依赖加载 InternLM2 所需accelerate0.24.1模型加载与显存管理的加速库transformers_stream_generator0.0.4流式生成的 transformers 扩展protobuf最新模型配置解析的底层依赖模型下载基于 ModelScope 拉取 InternLM2-7B-Chat在/root/autodl-tmp路径下新建model_download.py文件写入以下内容import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer import os model_dir snapshot_download(Shanghai_AI_Laboratory/internlm2-chat-7b, cache_dir/root/autodl-tmp, revisionmaster)然后执行下载python /root/autodl-tmp/model_download.py代码要点snapshot_download的第一个参数为模型名称Shanghai_AI_Laboratory/internlm2-chat-7bcache_dir指定模型下载的保存路径这里存放到/root/autodl-tmpAutoDL 的数据盘路径revisionmaster指定拉取 master 分支的模型文件。文档注明该模型体积约14GB下载大约需要2 分钟取决于网络环境。下载完成后模型文件会存放在/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b目录下供后续加载。代码准备编写 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) # 获取请求中的提示 response, history model.chat(tokenizer, prompt, history[]) 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__: # 加载预训练的分词器和模型 tokenizer AutoTokenizer.from_pretrained(Shanghai_AI_Laboratory/internlm2-chat-7b, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(Shanghai_AI_Laboratory/internlm2-chat-7b, torch_dtypetorch.float16, trust_remote_codeTrue).cuda() model model.eval() # 启动FastAPI应用 # 用6006端口可以将autodl的端口映射到本地从而在本地使用api uvicorn.run(app, host0.0.0.0, port6006, workers1) # 在指定端口和主机上启动应用下面对脚本的关键实现逐段剖析帮助你在遇到问题时能够独立定位原因设备与显存管理DEVICE cuda DEVICE_ID 0 CUDA_DEVICE f{DEVICE}:{DEVICE_ID} if DEVICE_ID else DEVICE通过DEVICE与DEVICE_ID组合出cuda:0形式的设备字符串便于在多卡机器上切换目标 GPU。torch_gc()在每次请求结束后调用torch.cuda.empty_cache()清空 CUDA 缓存并调用torch.cuda.ipc_collect()回收进程间通信产生的显存碎片防止长时服务运行导致显存持续膨胀。请求端点设计app.post(/) async def create_item(request: Request): ... prompt json_post_list.get(prompt) response, history model.chat(tokenizer, prompt, history[])端点注册在根路径/仅接受POST方法请求体为 JSON通过await request.json()异步获取请求体再经json.dumps/json.loads归一化为 Python 对象核心调用是model.chat(tokenizer, prompt, history[])这是 InternLM2 对话模型封装好的对话接口。传入history[]表示当前为单轮对话若希望支持多轮可将上一轮返回的history传入实现带上下文的连续对话脚本开头导入的GenerationConfig是 transformers 提供的生成参数配置类如需对temperature、top_p、max_new_tokens等生成策略做精细控制可在此处扩展。响应与日志返回体固定包含三个字段{response: ..., status: 200, time: ...}其中status固定为 200 表示业务成功time记录服务端处理时间格式%Y-%m-%d %H:%M:%Sresponse为模型生成的回答文本。服务端同时通过print输出包含时间戳、prompt 与响应的日志行便于追踪每次调用。模型加载与启动tokenizer AutoTokenizer.from_pretrained(Shanghai_AI_Laboratory/internlm2-chat-7b, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(Shanghai_AI_Laboratory/internlm2-chat-7b, torch_dtypetorch.float16, trust_remote_codeTrue).cuda() model model.eval()模型名沿用 ModelScope 仓库名Shanghai_AI_Laboratory/internlm2-chat-7b与下载时的模型 ID 保持一致transformers 会自动到本地缓存目录中寻找已下载的权重trust_remote_codeTrue允许执行模型仓库中的自定义代码这是加载 InternLM 系列模型所必需的torch_dtypetorch.float16以半精度加载权重显著降低显存占用配合 24G 显存可以流畅运行 7B 模型model.eval()将模型切换为推理模式关闭 Dropout 等训练相关行为最后用uvicorn.run(app, host0.0.0.0, port6006, workers1)启动服务。host0.0.0.0允许外部访问port6006为默认服务端口AutoDL 可将该端口映射到本地workers1保持单进程因为模型常驻显存多 worker 会重复加载模型导致显存溢出。启动 API 服务在终端中进入代码目录并运行cd /root/autodl-tmp python api.py首次启动需要加载约 14GB 的模型权重等待模型加载完成后终端会输出类似如下的日志Loading checkpoint shards: 100%权重分片加载完成Started server process [xxxx]服务器进程已启动Application startup complete.应用启动完成Uvicorn running on http://0.0.0.0:6006 (Press CTRLC to quit)Uvicorn 正在 6006 端口提供服务出现Uvicorn running on http://0.0.0.0:6006即代表服务部署成功。调用验证curl 与 Python requests服务默认部署在6006端口通过POST方法进行调用。方式一curl 命令行调用curl -X POST http://127.0.0.1:6006 \ -H Content-Type: application/json \ -d {prompt: 你好}方式二Python requests 调用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(你好))调用后得到的返回值为如下 JSON 结构{response:你好有什么我可以帮助你的吗,status:200,time:2024-02-05 18:08:19}两个调用方式的核心都是向http://127.0.0.1:6006发送Content-Type: application/json的 POST 请求请求体携带{prompt: 你好}字段再从响应中解析response字段作为模型回答。在本地访问 AutoDL 上的 API 服务由于服务运行在 AutoDL 云端机器上若要在本地直接调用需要将云端 6006 端口映射到本地。AutoDL 平台提供了端口映射能力在控制台开放对应端口后即可通过映射后的地址在本地访问 API这也是api.py中注释用 6006 端口可以将 autodl 的端口映射到本地的含义。具体映射步骤可参考仓库中的 02-AutoDL开放端口.md 文档。常见问题排查模型加载失败 / 找不到权重确认已先执行model_download.py完成下载且api.py中的模型名与下载 ID 一致检查cache_dir与 transformers 默认缓存路径是否匹配。显存不足OOM确认租用的是 24G 显存机器若机器显存更小可考虑将torch_dtypetorch.float16配合量化方案使用或改用 4bit 量化部署。外部无法访问确认host0.0.0.0未被修改在 AutoDL 场景下确认 6006 端口已正确映射。首次响应慢模型加载完成后首次推理需完成 warmup属正常现象后续请求会明显更快。延伸基于同一模型的更多玩法本次 FastAPI 部署是 InternLM2-7B-Chat 落地应用的第一步仓库中围绕同一模型还提供了完整的进阶路线可无缝衔接本部署02-InternLM2-7B-chat langchain 接入.md基于本地部署的 InternLM2 自定义 LLM 类将其接入 LangChain 框架搭建知识库助手03-InternLM2-7B-chat WebDemo 部署.md基于 Streamlit 搭建可视化对话界面04-InternLM2-7B-chat Xtuner Qlora 微调.md使用 XTuner 在 8GB 显存下对 InternLM2-7B 进行 QLoRA 轻量级微调打造专属 AI 助手通用环境配置可参考 01-pip、conda换源.md 与 03-模型下载.md。至此你已经完成了 InternLM2-7B-Chat 的完整 FastAPI 服务化部署从镜像选择、依赖安装、模型下载到服务启动与双方式调用验证。该服务可直接作为下游应用的 LLM 底座用于对话、知识库问答、Agent 工具调用等各类场景。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表