[特殊字符] 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 的并发瓶颈,再到通过环境变量调优,希望这篇教程能帮你打通本地大模型应用开发的"最后一公里"。如果你在部署过程中遇到任何问题,欢迎在评论区留言交流!

相关推荐
坚果派·白晓明17 小时前
【鸿蒙PC三方库移植适配框架解读系列】第八篇:扩展lycium框架使其满足rust三方库适配
c语言·开发语言·华为·rust·harmonyos·鸿蒙
小徐学编程-zZ18 小时前
量产测试数据
python·压力测试·数据库架构
花间相见18 小时前
【PaddleOCR教程01】PP-OCRv5 全面指南:从模型架构到实战部署
开发语言·r语言
QQ80578065118 小时前
django基于机器学习的电商评论情感分析系统设计实现
python·机器学习·django
wx090918 小时前
stata实现机器学习的环境配置
python·机器学习·stata
小短腿的代码世界18 小时前
Qt 股票订单撮合引擎:高频交易系统的核心心脏
开发语言·数据库·qt·系统架构·交互
nuowenyadelunwen20 小时前
CS 61A Lab 2 笔记:短路求值、高阶函数与 Lambda 表达式
python·函数式编程·cs61a·berkeley
谙弆悕博士20 小时前
快速学C语言——第16章:预处理
c语言·开发语言·chrome·笔记·创业创新·预处理·业界资讯
yuan1999720 小时前
基于 C# 实现的 Omron HostLink (FINS) 协议 PLC 通讯
开发语言·c#
qq_4228286220 小时前
android图形学之SurfaceControl和Surface的关系 五
android·开发语言·python