书生·浦语 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 租用服务器时,镜像选择遵循以下组合(文档中的推荐配置):
- 框架(Framework):PyTorch
- 框架版本:2.0.0
- Python 版本:3.8(ubuntu20.04)
- CUDA 版本: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 fastapi==0.104.1 pip install uvicorn==0.24.0.post1 pip install requests==2.25.1 pip install modelscope==1.11.0 pip install transformers==4.37.0 pip install streamlit==1.24.0 pip install sentencepiece==0.1.99 pip install accelerate==0.24.1 pip install transformers_stream_generator==0.0.4 pip install protobuf各依赖在本次部署中的角色如下:
| 依赖包 | 版本 | 作用 |
|---|---|---|
fastapi | 0.104.1 | 提供 API 服务框架,用于构建 POST 请求端点 |
uvicorn | 0.24.0.post1 | ASGI 服务器,负责启动并托管 FastAPI 应用 |
requests | 2.25.1 | 客户端调用 API 时发送 HTTP 请求 |
modelscope | 1.11.0 | 从 ModelScope 模型库下载模型权重 |
transformers | 4.37.0 | 加载与运行 InternLM2 模型及分词器 |
streamlit | 1.24.0 | 可选 Web 演示组件(本教程未直接使用,但作为统一环境依赖一并安装) |
sentencepiece | 0.1.99 | 分词器底层依赖,加载 InternLM2 所需 |
accelerate | 0.24.1 | 模型加载与显存管理的加速库 |
transformers_stream_generator | 0.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', revision='master')然后执行下载:
python /root/autodl-tmp/model_download.py代码要点:
snapshot_download的第一个参数为模型名称Shanghai_AI_Laboratory/internlm2-chat-7b;cache_dir指定模型下载的保存路径,这里存放到/root/autodl-tmp(AutoDL 的数据盘路径);revision='master'指定拉取 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_code=True) model = AutoModelForCausalLM.from_pretrained("Shanghai_AI_Laboratory/internlm2-chat-7b", torch_dtype=torch.float16, trust_remote_code=True).cuda() model = model.eval() # 启动FastAPI应用 # 用6006端口可以将autodl的端口映射到本地,从而在本地使用api uvicorn.run(app, host='0.0.0.0', port=6006, workers=1) # 在指定端口和主机上启动应用下面对脚本的关键实现逐段剖析,帮助你在遇到问题时能够独立定位原因:
设备与显存管理
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:%S),response为模型生成的回答文本。服务端同时通过print输出包含时间戳、prompt 与响应的日志行,便于追踪每次调用。
模型加载与启动
tokenizer = AutoTokenizer.from_pretrained("Shanghai_AI_Laboratory/internlm2-chat-7b", trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained("Shanghai_AI_Laboratory/internlm2-chat-7b", torch_dtype=torch.float16, trust_remote_code=True).cuda() model = model.eval()- 模型名沿用 ModelScope 仓库名
Shanghai_AI_Laboratory/internlm2-chat-7b,与下载时的模型 ID 保持一致,transformers 会自动到本地缓存目录中寻找已下载的权重; trust_remote_code=True允许执行模型仓库中的自定义代码,这是加载 InternLM 系列模型所必需的;torch_dtype=torch.float16以半精度加载权重,显著降低显存占用,配合 24G 显存可以流畅运行 7B 模型;model.eval()将模型切换为推理模式,关闭 Dropout 等训练相关行为;- 最后用
uvicorn.run(app, host='0.0.0.0', port=6006, workers=1)启动服务。host='0.0.0.0'允许外部访问,port=6006为默认服务端口(AutoDL 可将该端口映射到本地),workers=1保持单进程,因为模型常驻显存,多 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 CTRL+C 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(url='http://127.0.0.1:6006', headers=headers, data=json.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_dtype=torch.float16配合量化方案使用,或改用 4bit 量化部署。 - 外部无法访问:确认
host='0.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),仅供参考