news 2026/9/12 17:55:15

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
书生·浦语 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 租用服务器时,镜像选择遵循以下组合(文档中的推荐配置):

  • 框架(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

各依赖在本次部署中的角色如下:

依赖包版本作用
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', 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

通过DEVICEDEVICE_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 提供的生成参数配置类,如需对temperaturetop_pmax_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 17:54:10

Kafka运行环境安装

一、前言 kafka是基于jdk和zk上运行的,安装kafka前必须安装jdk和zk。 二、jdk安装 2.1 下载jdk 安装文件:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK 2.2 设置环境变量 2.2.1 windows环境下需要设置 安装完成后…

作者头像 李华
网站建设 2026/9/12 17:53:10

从零开始用ESP32+HC-SR501实现人体感应:接线、代码与避坑指南

半夜想起来去客厅倒杯水,走廊的灯自己亮起来,这不是什么电影特效,而是一块十几块的开发板加上一块几块钱的传感器就能实现的效果。说的就是ESP32和HC-SR501这个组合。玩嵌入式这几年,每年都会有人问我“零基础第一步到底做什么好”…

作者头像 李华
网站建设 2026/9/12 17:52:22

大模型技术栈解析:从LLM到RAG与Agent实战

1. 大模型技术全景图:从基础架构到智能应用最近半年,AI领域的新名词像雨后春笋般冒出来,每次参加技术会议都能听到一堆缩写词在会场里飞来飞去。上周我在一个开发者活动上,听到旁边两位工程师的对话:"我们系统用R…

作者头像 李华
网站建设 2026/9/12 17:52:01

中文语音识别实战:从CTC+Attention建模到端到端部署

简介:本资源是一套完整的基于深度学习的中文语音识别系统实现方案,面向人工智能初学者、语音处理方向学生及Python开发者,解决从音频预处理、声学模型训练到解码识别的全流程实践问题。压缩包共88个文件,含30个Python核心脚本&…

作者头像 李华
网站建设 2026/9/12 17:48:15

常用控件的介绍(下)

0.引言 现在开始介绍的各种Qt中的控件,都是继承自QWidget,所以QWidget的属性在接下来的控件中都是可以使用的。也就是刚刚QWidget中涉及到的各种属性/函数/使用方法,针对接下来要介绍的Qt中的各种控件都是有效的,下面来学习Qt中提…

作者头像 李华