[特殊字符] Python异步调用本地Ollama大模型实战:从Demo到高并发避坑指南

在本地部署大模型(如使用 Ollama 跑 Qwen2.5、Llama3)进行开发时,如何高效地调用模型接口?当面对多用户并发请求时,为什么模型响应会越来越慢?

本文将带你从编写一个标准的异步调用 Demo 开始,深入剖析 Ollama 的并发瓶颈,并给出生产环境的优化方案。

一、 基础实战:编写异步调用 Demo

Ollama 在本地启动后,默认提供了一个兼容 OpenAI 格式的 REST API。我们可以直接复用 Python 生态中成熟的 aiohttp 异步框架来调用它。

以下是一个完整的异步调用 Demo,适配了本地的 qwen2.5:7b 模型:

import aiohttp

import asyncio

import logging

配置基础日志,方便查看调用过程

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')

logger = logging.getLogger(name)

async def call_local_ollama(query, model_name="qwen2.5:7b"):

"""

异步调用本地 Ollama 部署的大模型

"""

1. Ollama 本地默认地址 + OpenAI 兼容的聊天接口路径

ollama_url = "http://localhost:11434/v1/chat/completions"

复制代码
# 2. 组装请求头(Ollama 不需要真实的 API Key,但接口规范通常要求带上)
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer ollama"  # 填任意值即可,ollama不会校验
}

# 3. 组装请求数据
data = {
    "model": model_name,
    "messages": [{"role": "user", "content": query}],
    "stream": False  # 关闭流式输出,一次性获取完整回复
}

logger.info(f"准备调用本地大模型,提问: {query}")

# 4. 复用 aiohttp 异步调用方式
# 本地大模型推理受硬件限制可能较慢,建议将超时时间适当延长
timeout = aiohttp.ClientTimeout(total=120)

try:
    async with aiohttp.ClientSession(timeout=timeout) as session:
        async with session.post(ollama_url, headers=headers, json=data) as response:
            if response.status == 200:
                response_json = await response.json()
                content = response_json["choices"][0]["message"]["content"]
                usage = response_json.get("usage", {})
                logger.info(f"调用成功!Token消耗: 提示词{usage.get('prompt_tokens')} + 生成{usage.get('completion_tokens')}")
                return content
            else:
                error_text = await response.text()
                logger.error(f"调用失败,状态码: {response.status}, 错误信息: {error_text}")
                return None
except Exception as e:
    logger.error(f"请求发生异常: {str(e)}")
    return None

async def main():

questions = "你好,请用一句话介绍一下你自己。", "用Python写一个快速排序算法。"

for q in questions:

result = await call_local_ollama(q)

if result:

print(f"n模型回复:n{result}n" + "-"*50)

if name == "main":

asyncio.run(main())

💡 运行前准备:

确保 Ollama 服务已启动(终端输入 ollama serve)。

确保本地已拉取模型(通过 ollama list 查看,如 qwen2.5:7b)。

二、 进阶思考:这个 Demo 能解决并发问题吗?

直接说结论:上面的 Demo 客户端支持高并发,但 Ollama 的默认服务端配置会成为瓶颈。

客户端(你的 Demo): 使用 aiohttp 和 asyncio,意味着你的程序可以同时向 Ollama 发起成百上千个网络请求,而不会因为等待某个回复而卡死。在"发请求"这个环节,它是完全没问题的。

服务端(Ollama 默认状态): 默认配置下的 Ollama 就像一个"单窗口办事员"。它默认一次只处理一个推理请求,其他请求必须在队列里排队。当并发用户超过 3-4 个时,响应延迟会呈指数级飙升,甚至出现请求超时的情况。

三、 性能优化:如何让 Ollama 支撑更多并发?

如果你必须使用 Ollama 来承接多用户并发,可以通过调整环境变量来优化其并发性能。

核心解决方案:调整 OLLAMA_NUM_PARALLEL

Ollama 提供了一个关键的环境变量 OLLAMA_NUM_PARALLEL,可以强制让它同时处理多个请求(本质是利用 GPU 显存开辟多个 KV-cache 槽位)。

操作步骤(以 Linux/macOS 为例):

在启动 Ollama 服务前,设置环境变量。例如,允许同时处理 4 个请求:

export OLLAMA_NUM_PARALLEL=4

export OLLAMA_MAX_QUEUE=1024 # 适当调大请求队列长度,防止请求被直接拒绝

ollama serve

⚠️ 注意事项:

增加 OLLAMA_NUM_PARALLEL 的值会显著提高显存(VRAM)的占用。你需要根据自己的显卡大小(比如 24GB 的 RTX 4090 跑 7B 模型)来合理设置这个数值,否则会报显存不足的错误。

四、 生产环境建议与安全避坑

专业高并发选型:vLLM

如果是内部小团队(<5人)使用,开启 OLLAMA_NUM_PARALLEL 配合上面的 Demo 即可。但如果是面向大量外部用户的生产级需求(对 QPS 和延迟有严格要求),强烈建议放弃 Ollama,改用专为高并发设计的推理框架,如 vLLM。vLLM 采用了动态内存分页和连续批处理技术,同样的硬件下,并发吞吐量可以是 Ollama 的十几倍。

⚠️ 本地部署的安全隐患

既然打算让"大量用户"调用本地部署的大模型,必须注意网络安全。Ollama 默认配置存在未授权访问的安全风险。

不要直接将 11434 端口暴露在公网!

务必通过防火墙限制访问 IP,或者在 Ollama 前面加一层带有身份鉴权(API Key)的网关(如 Nginx + 鉴权插件),防止恶意用户盗取模型数据或耗尽服务器算力。

总结

从编写一个标准的 aiohttp 异步 Demo,到理解 Ollama 的并发瓶颈,再到通过环境变量调优,希望这篇教程能帮你打通本地大模型应用开发的"最后一公里"。如果你在部署过程中遇到任何问题,欢迎在评论区留言交流!

相关推荐
阿耶同学几秒前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
花酒锄作田16 小时前
Pydantic校验配置文件
python
hboot17 小时前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
ZhengEnCi1 天前
P2M-Matplotlib折线图完全指南-从数据可视化到趋势分析的Python绘图利器
python·matlab·数据可视化
ZhengEnCi1 天前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab
曲幽1 天前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
用户8358086187911 天前
基于 Self-RAG 与列表级重排序的进阶 RAG 系统设计与实现
python
Warson_L2 天前
Python `Annotated` 与 LangGraph Reducer 学习笔记
python
韩师傅2 天前
海天线算法的前世今生
python·计算机视觉
韩师傅2 天前
当你的甲方设备过烂,要如何快速出效果?
python·计算机视觉