大模型API调用及部署服务实战指南
目录
API调用
调用大模型API是指:直接使用编程方式调用第三方提供(无需本地部署大模型)的大模型服务或者自己训练好的模型的服务,通过网络请求获取模型生成的结果。
优点:
- 无需本地部署大模型,无需硬件资源要求,无需关注模型训练,只需要按次数付费。
- 可以实现循环、定时等自动化任务。
一般流程:
API密钥(身份验证) - 构造请求内容 - 发送请求 - 解析响应结果
示例:
不同的平台调用方式和返回结果可能不一样,参考api文档就好。
-
使用OpenAI调用deepseek-r1
import OpenAI导入的是 OpenAI 开发的 Python SDK(软件开发工具包),本质是一套封装好的 HTTP 请求工具,方便开发者调用符合其规范的 API
from openai import OpenAI
# 1. 设置API密钥
client = OpenAI(
api_key="xxx-xxx-xxx-xxx",
base_url="https://<第三方域名>/v1", #指向的是第三方平台(兼容 OpenAI 路径)
timeout=1800, # 深度思考模型耗费时间会较长,建议设置一个较长的超时时间,推荐为30分钟
)
# 2. 调用模型
def ds_infer(prompt):
response = client.chat.completions.create(
model="deepseek-r1-xxxx", # 替换 <Model> 为模型的Model ID
messages=[
{
"role": "user",
"content": prompt
}
],
max_tokens=1024,
temperature=0.0,
)
# CoT:思考过程
# think = ''
# if hasattr(response.choices[0].message, 'reasoning_content'):
# think += response.choices[0].message.reasoning_content
# think = '<think>\n' + think + '</think>\n'
answer = response.choices[0].message.content
return answer
# 3. 测试调用
result = ds_infer("解释什么是API")
print(result)
-
使用百度千帆平台调用deepseek-r1
先在百度智能云控制台创建一个APIKey,
API参考链接:文本生成 - 千帆AI应用开发者中心-API参考qianfan-api | 百度智能云文档
import requests
import json
def main():
url = "https://qianfan.baidubce.com/v2/chat/completions" #文本生成任务,不同的生成任务不一样
payload = json.dumps({
"model": "deepseek-r1", #模型名称
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "你好,你是谁" #prompt
}
]
})
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer bce-v3/ALTAK-*********/614fb**********' #Bearer APIKey
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
if __name__ == '__main__':
main()
-
调用自己训练的模型
- 详见下一节部署成本地服务并调用
-
Ollama:
一款轻量工具,可在本地快速下载和运行开源大模型(如 Llama 3、Mistral、Qwen 等)。
-
安装 Ollama
- 官网下载:Download Ollama on Windows(支持 Windows、macOS、Linux)。
- 下载模型直接进行交互:
-
打开 PyCharm 的终端(Terminal)或系统命令行,执行以下命令:
- 首次运行会自动下载模型(需联网,大小约 3-10GB 不等)。
- 下载完成后直接进入交互模式,可直接输入问题测试。
-
D:\project_auto_ad\RL>ollama run qwen2.5
pulling manifest
pulling 2bada8a74506: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 4.7 GB
pulling 66b9ea09bd5b: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 68 B
pulling eb4402837c78: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 1.5 KB
pulling 832dd9e00a68: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 11 KB
pulling 2f15b3218f05: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 487 B
pulling 2f15b3218f05: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 487 B
verifying sha256 digest
writing manifest
success
>>> 你是谁?明天气温多少
我是Qwen,由阿里云开发的AI助手。关于明天气温的问题,由于我无法实时获取最新的气象信息,请您查阅可靠的气象预报来源以获得准确的天气情况。您可以查询本地气象站或使用相关 weather APP 来
获取最准确的信息。希望我的回答对您有所帮助!
#####################下载地址#############################
"C:\Users\80554\.ollama\models\manifests\registry.ollama.ai\library\qwen2.5"
- 直接调用本地Ollama模型(已经下载到本地的)
Ollama 启动后会在本地创建 API 服务(默认地址:
http://localhost:11434/api/chat),可通过requests调用:
import requests
import json
def call_ollama_local(prompt, model="qwen2.5"):
url = "http://localhost:11434/api/chat"
data = {
"model": model,
"messages": [{"role": "user", "content": prompt}],
"stream": False # 非流式返回
}
response = requests.post(url, json=data)
if response.status_code == 200:
return response.json()["message"]["content"]
else:
return f"调用失败:{response.text}"
# 测试本地模型
if __name__ == "__main__":
result = call_ollama_local("你是谁?具体说一下")
print(result)
# 我是Qwen,一个由阿里云开发的语言模型助手。我能够回答问题、创作文字,比如写文章、写代码、写公文、写邮件、写剧本等等,还能表达观点,玩游戏。我的目标是帮助用户更高效地完成任务,获得更好的使用体验。如果您有任何问题或需要帮助,请随时告诉我!
将模型部署成本地服务
"""
将本地模型部署为服务(如 API 接口)确实能解决多进程重复加载模型的问题 ——
模型只需加载一次,所有进程通过网络请求调用,既能节省显存,又能支持更高并发,
整体效率会显著提升
"""
FastAPI vs vLLM
|
FastAPI 部署 |
vLLM 部署 |
|
| 优点 |
|
|
| 缺点 |
|
|
👉更灵活,选择FastAPI
可以对base_model+lora进行部署模型,推理是一条一条的推(推理性能不高)
- 部署成服务
from fastapi import FastAPI, HTTPException from pydantic import BaseModel # 用于请求参数校验 from transformers import AutoTokenizer, AutoModelForCausalLM import torch import uvicorn import asyncio from contextlib import asynccontextmanager # 模型管理 class ModelManager: def __init__(self, model_path): self.tokenizer = AutoTokenizer.from_pretrained(model_path) self.model = AutoModelForCausalLM.from_pretrained( model_path, torch_dtype=torch.float16, device_map="auto" ) self.model.eval() def generate(self, prompt, max_length=512): inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device) with torch.no_grad(): outputs = self.model.generate( **inputs, max_length=max_length, temperature=0.7, do_sample=temperature>0, pad_token_id=self.tokenizer.eos_token_id ) return self.tokenizer.decode(outputs[0], skip_special_tokens=True) # 应用生命周期管理 @asynccontextmanager async def lifespan(app: FastAPI): # 启动时加载模型 model_path = "./merged_model" # 修改为本地模型路径 app.state.model_manager = ModelManager(model_path) yield # 关闭时清理 if hasattr(app.state, 'model_manager'): del app.state.model_manager # 初始化FastAPI应用 app = FastAPI( title="LLM推理服务", description="基于FastAPI的LLM模型部署服务", version="1.0.0", lifespan=lifespan ) # 请求/响应模型 class GenerationRequest(BaseModel): prompt: str max_length: int = 512 temperature: float = 0.7 class GenerationResponse(BaseModel): generated_text: str inference_time: float # API端点/请求接口(POST请求) @app.post("/sft_v3_generate_campaign", response_model=GenerationResponse) async def generate_text(request: GenerationRequest): try: import time start_time = time.time() result = app.state.model_manager.generate( request.prompt, max_length=request.max_length ) inference_time = time.time() - start_time return GenerationResponse( generated_text=result, inference_time=inference_time ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/health") async def health_check(): return {"status": "healthy", "model_loaded": hasattr(app.state, 'model_manager')} # 启动服务(在终端运行时执行) if __name__ == "__main__": # 启动服务:host=0.0.0.0允许局域网访问,port=8000为端口号 uvicorn.run(app, host="0.0.0.0", port=8000, workers=1) # workers=1避免模型重复加载 - 调用本地服务
import requests # 服务端API地址 API_URL = "http://localhost:8000/sft_v3_generate_campaign" #部署的本地模型接口 def call_model(prompt): """ 调用模型API 字段与部署服务的参数名要相同 """ try: payload = { "prompt": prompt, "max_length": 512, "temperature": 0.1, } response = requests.post(API_URL, json=payload, timeout=60) # 设置超时 response.raise_for_status() # 检查请求是否成功 result = response.json() return result.get("generated_text", "") except requests.RequestException as e: print(f"请求API出错: {str(e)}") return None # 测试调用 if __name__ == "__main__": result = call_model("解释什么是API") print(result)
👉提高推理速度/大数据集推理,优先vLLM(并行处理)
vLLM只能部署合并好的模型,未合并的模型(如只包含增量权重的 LoRA 模型)无法直接部署。
直接使用vLLM框架
vllm 框架已经封装了所有底层逻辑(如模型加载、KV 缓存优化、PagedAttention 实现、API 服务启动等),用户只需通过命令行参数指定核心配置(模型路径、端口、硬件资源等)。
python -m vllm.entrypoints.openai.api_server是 vllm 提供的OpenAI 兼容 API 服务入口,通过命令行参数即可启动一个高性能的大模型服务,省去了手动编写 HTTP 接口、优化推理逻辑的工作。
- 部署成服务
# 可以使用.sh文件 #!/bin/bash # model 本地合并的模型路径或 Hugging Face Hub 模型名称 # served-model-name 服务的模型标识(调用时需指定,如 OpenAI 兼容接口中的 model 参数) # dtype 数据类型(float16/bfloat16/float32,默认 auto,优先用 float16 节省显存) # tensor-parallel-size 显卡/GPU数量(单卡设为1,多卡设为卡数,如2) # gpu-memory-utilization GPU 显存利用率上限(0-1,默认 0.9,预留部分显存避免 OOM) # cpu-offload 启用 CPU 卸载(显存不足时将部分层放到 CPU,牺牲性能换显存) # max-num-batched-tokens 批处理的最大 token 数(影响吞吐量,默认 32768,根据显存调整) # max-num-seqs 最大并发序列数(默认 256,控制同时处理的请求数) # enable-paged-attention 启用 PagedAttention 优化(默认开启,vllm 高性能核心) # port 8000 \ # 服务端口 # host 0.0.0.0 # 允许局域网访问 # allow-Origin 跨域请求允许的源(如 * 允许所有源,用于前端调用) # api-key 设置 API 密钥(启用认证,需在请求头中携带 Authorization: Bearer <key>) # temperature 全局默认温度参数(0-1,控制生成随机性,可被请求参数覆盖) # max-token 全局默认最大生成 token 数(可被请求参数覆盖) python -m vllm.entrypoints.openai.api_server \ --model /root/xxx/model-merged \ --served-model-name sft_v0_model \ --tensor-parallel-size 1 \ --dtype float16 \ --port 8000 \ --host 0.0.0.0
- 调用本地服务
from openai import OpenAI client = OpenAI( base_url="http://localhost:8000/v1", # vLLM 服务的 API 前缀 api_key="dummy-key" # vLLM 不校验 API Key,填任意值即可 ) def call_model(model_name, instruction): response = client.chat.completions.create( model=model_name, # 替换为你的模型名称 messages=[ { "role": "user", "content": instruction }, ], max_tokens=512, temperature=0.0, # do_sample=False ) response = response.choices[0].message.content return response
Ms-Swift + 集成vLLM推理框架
可以使用基于 ms-swift 框架(一个大模型微调部署工具)部署服务的 shell 命令,主要用于加载多个 LoRA 适配器并通过 vLLM 后端启动推理服务。
- Swift 负责 “上层统筹”:处理模型加载(包括 LoRA 权重合并)、服务启动、API 接口封装(兼容 OpenAI 格式)等流程。
- vLLM 负责 “底层推理”:当指定
--infer_backend vllm时,Swift 会将模型推理的核心工作交给 vLLM 执行,而非使用 Swift 自带的基础推理逻辑。实现“便捷部署+高性能推理”的结合。
- 部署:
CUDA_VISIBLE_DEVICES=0 \
swift deploy \
--adapters lora1=./checkpoint-80 lora2=./checkpoint-124 \
--model base_model_id_or_path \ #如果lora中指定的base_model不在本地模型库中,需要显式指定路径
--infer_backend vllm \
--temperature 0.0 \
--max_new_tokens 512
- 检查可用模型列表
发送 GET 请求到 http://localhost:8000/v1/models,会返回服务支持的模型列表
curl http://localhost:8000/v1/models
示例结果:
{"data":[{"id":"qwen2.5","object":"model","created":1758251320,"owned_by":"swift"},{"id":"lora1","object":"model","created":1758251320,"owned_by":"swift"},{"id":"lora2","object":"model","created":1758251320,"owned_by":"swift"}],"object":"list"}
分别代表:基座模型(qwen2.5)、基座模型+Lora1、基座模型+Lora2
- 使用openai库调用api
from openai import OpenAI
# 初始化客户端,指定服务地址
client = OpenAI(
base_url="http://localhost:8000/v1", # 服务的 API 前缀
api_key="dummy-key" # Swift 服务通常不验证 API key,填任意值即可
)
# 调用对话接口(/v1/chat/completions)
response = client.chat.completions.create(
model="Qwen2.5-7B-Instruct", # 选择models中的某一个需要的服务名称
messages=[
{"role": "user", "content": "你好,介绍一下自己"} # 你的提问
],
temperature=0.3, # 与部署时的参数一致(可选,也可在此处覆盖)
max_tokens=1024 # 生成的最大token数
)
# 打印结果
print(response.choices[0].message.content)更多推荐

所有评论(0)