如何通过ollama-python包高效并发调用本地Llama 3.1模型
如何通过ollama-python包高效并发调用本地Llama 3.1模型
嘿,我刚好有过大规模调用本地LLM的实战经验,针对你要处理2万+请求的需求,结合ollama-python包给你几个实用的方案,帮你把效率拉上去:
一、用线程池实现并发调用(最适合你的场景)
因为调用ollama本质是向本地的ollama服务发起网络请求,属于IO密集型任务,线程池的开销比进程池小很多,是性价比最高的方案。这里给你一个直接能用的代码示例:
import ollama from concurrent.futures import ThreadPoolExecutor # 替换成你的20000+查询列表,这里用示例数据模拟 queries = [f"简单解释一下{p}" for p in ["人工智能", "机器学习", "深度学习", "大语言模型"] * 5000] def invoke_llama(query): """封装单次模型调用逻辑,处理异常""" try: # 调用generate接口,也可以根据需求换成chat接口 response = ollama.generate(model="llama3.1:7b", prompt=query) return {"query": query, "response": response["response"]} except Exception as e: return {"query": query, "error": str(e)} if __name__ == "__main__": # 线程数建议根据你的CPU核心数和ollama服务承载能力调整,先从8-12开始测试 with ThreadPoolExecutor(max_workers=10) as executor: # 批量提交任务并同步获取所有结果 results = list(executor.map(invoke_llama, queries)) # 后续处理结果,比如保存到文件或者数据库 for idx, res in enumerate(results): if "error" in res: print(f"第{idx+1}个请求失败: {res['query']} - 错误信息: {res['error']}") else: # 这里只打印响应前50个字符,避免输出过长 print(f"第{idx+1}个请求: {res['query']}\n响应摘要: {res['response'][:50]}...\n")
注意事项:
max_workers不要盲目设大,不然会把ollama服务压垮,建议先从8开始测试,观察CPU、内存的占用情况再调整;- 如果你的查询有重复,可以加个缓存字典,把已经调用过的prompt和响应存起来,避免重复请求,能省不少时间。
二、进程池方案(特殊场景适用)
如果你的场景是CPU密集型(比如需要对模型返回结果做大量计算),可以改用ProcessPoolExecutor,但因为ollama是独立服务,调用本身是IO密集型,所以线程池通常足够。如果要试进程池,只需要把上面代码里的ThreadPoolExecutor换成ProcessPoolExecutor就行,其他逻辑不用改。
三、额外优化技巧,进一步提升速度
- 优化ollama配置:修改ollama的配置文件(比如Linux下是
~/.ollama/config.json),调整num_ctx(上下文窗口)到适合你查询的长度,避免不必要的内存占用;如果内存足够,也可以增大num_threads让模型用更多CPU核心推理。 - 使用量化模型:如果当前用的是全精度模型,换成4bit或8bit量化的
llama3.1:7b(比如ollama里的llama3.1:7b-q4_0),推理速度会大幅提升,内存占用也会减少,能支持更多并发请求。 - 流式响应(可选):如果不需要等完整响应再处理,可以用ollama的流式调用,边接收边处理结果,代码示例如下:
def invoke_llama_stream(query): response = "" for chunk in ollama.generate(model="llama3.1:7b", prompt=query, stream=True): response += chunk["response"] return {"query": query, "response": response}
这个对批量处理的整体速度提升有限,但能减少单请求的等待感知时间。
关于批量请求的说明
目前ollama官方并没有提供直接的批量请求接口,所以用并发多线程/进程的方式,就是模拟批量发送请求的效果,由ollama服务来调度处理多个请求。
备注:内容来源于stack exchange,提问作者Brandon Walton




