Ollama调用多GPU实现负载均衡

文章目录

    • [📊 背景说明](#📊 背景说明)
    • [🛠️ 修改 systemd 服务配置](#🛠️ 修改 systemd 服务配置)
      • [1. 配置文件路径](#1. 配置文件路径)
      • [2. 编辑服务文件](#2. 编辑服务文件)
      • [2. 重新加载配置并重启服务](#2. 重新加载配置并重启服务)
      • [3. 验证配置是否成功](#3. 验证配置是否成功)
    • [📈 应用效果示例](#📈 应用效果示例)
      • [1. 调用单个70b模型](#1. 调用单个70b模型)
      • [2. 调用多个模型(70b和32b模型)](#2. 调用多个模型(70b和32b模型))
    • 总结
    • [📌 附:自动化脚本(可选)](#📌 附:自动化脚本(可选))
    • 额外补充
    • [🧠 1. Open WebUI多用户同时访问同一个模型,是否相互影响?](#🧠 1. Open WebUI多用户同时访问同一个模型,是否相互影响?)
      • [🔍 详细说明:](#🔍 详细说明:)
        • [✅ 互不干扰的部分](#✅ 互不干扰的部分)
        • [⚠️ 可能"互相影响"的部分](#⚠️ 可能“互相影响”的部分)
    • [📚 2. 使用知识库(向量检索/RAG)是否会影响模型?](#📚 2. 使用知识库(向量检索/RAG)是否会影响模型?)
      • [✅ 简短回答](#✅ 简短回答)
      • [🔍 具体解释](#🔍 具体解释)

默认的ollama调用的各种大模型,如deepseek 70b模型,每个模型实例只绑定一张 GPU,如果是多卡,其它卡会一直闲置,造成一定浪费。

本文档介绍如何通过 systemd 配置文件为 Ollama 服务添加 GPU 和调度相关的环境变量,从而实现多 GPU 的高效利用与负载均衡。

📊 背景说明

我们首先通过命令nvidia-smi查看有几张GPU,如下图,可以看到我们当前有4张卡,GPU编号是0,1,2,3(为了之后配置中设置数字)。

如果只是通过Open WebUI 使用ollama的deepseek-r1:70b模型,我们观察GPU使用情况,如下图,可以发现只有一张卡使用,即使是多个用户同时使用deepseek-r1:70b模型,也依然只有单个GPU使用,这造成了极大的资源浪费,没有相应的负载均衡。

如果局域网内用户,几个人访问70b模型,几个人访问32b模型,第一张卡显存占满了之后,才会调用第二张卡,第三张卡和第四张卡永远都不用使用到,造成一定程度上的资源浪费。

Ollama 也只会在部分 GPU 上负载,其他 GPU 处于空闲状态。

Ollama 默认每个模型实例只绑定一张 GPU,并不具备自动负载均衡的能力。

为实现模型多卡部署与更高的吞吐量,我们可以通过设置环境变量来调整 Ollama 的调度行为。

因此我们需要相应的环境设置,设置也很简单。


🛠️ 修改 systemd 服务配置

1. 配置文件路径

Ollama 的 systemd 服务配置文件路径如下:

bash 复制代码
/etc/systemd/system/ollama.service

2. 编辑服务文件

bash 复制代码
sudo vim /etc/systemd/system/ollama.service

默认的整体配置如下:

bash 复制代码
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin"
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_ORIGINS=*"

[Install]
WantedBy=default.target

按下 i 进入插入模式,找到 [Service] 段,我们需要在[Service]的下面添加几个环境变量设置,如下:

bash 复制代码
Environment="CUDA_VISIBLE_DEVICES=0,1,2,3"
Environment="OLLAMA_SCHED_SPREAD=1"
Environment="OLLAMA_KEEP_ALIVE=-1"

参数说明:

  • Environment="CUDA_VISIBLE_DEVICES=0,1,2,3" 代表让ollama能识别到第几张显卡,因为4张显卡,从0开始编号,所以为0,1,2,3。根据你的显卡数量进行设置。
  • Environment="OLLAMA_SCHED_SPREAD=1" 这几张卡均衡使用
  • Environment="OLLAMA_KEEP_ALIVE=-1" 模型一直加载, 不自动卸载,这个设置会一直占用显存不释放,相应会快一些。如果不经常使用模型,可以把这个去掉,啥时候通过Open Webui访问,然后啥时候加载模型,第一次加载一般会慢一些。

添加之后的完整配置:

bash 复制代码
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin"
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_ORIGINS=*"
### 添加如下配置,下面三个是新增的
Environment="CUDA_VISIBLE_DEVICES=0,1,2,3"
Environment="OLLAMA_SCHED_SPREAD=1"
Environment="OLLAMA_KEEP_ALIVE=-1"

[Install]
WantedBy=default.target

按下 Esc,然后输入 :wq 保存并退出。


2. 重新加载配置并重启服务

使用如下命令:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart ollama

💡 注意:若出现 Failed 信息,仅为非关键错误,通常不影响实际运行。

sudo systemctl daemon-reload命令解释:

重新加载 systemd 管理器的配置文件。当你修改了服务的配置文件 (比如 /etc/systemd/system/ollama.service)后,systemd 并不会自动发现这些改动,你需要显式告诉它:"配置文件变了,请重新读取"。

sudo systemctl restart ollama命令解释:

停止重新启动 ollama 服务,使其立即应用你新修改的配置。

3. 验证配置是否成功

查看服务状态:

bash 复制代码
systemctl status ollama

检查环境变量是否注入成功:

bash 复制代码
sudo systemctl show ollama | grep Environment

你应当看到如下输出:

ini 复制代码
Environment=CUDA_VISIBLE_DEVICES=0,1,2,3
Environment=OLLAMA_SCHED_SPREAD=1
Environment=OLLAMA_KEEP_ALIVE=-1

参数说明

参数 含义
CUDA_VISIBLE_DEVICES=0,1,2,3 指定可用的 GPU 编号(0 到 3),表示总共使用 4 张显卡
OLLAMA_SCHED_SPREAD=1 启用多 GPU 均衡调度,让模型推理在多卡之间分摊负载
OLLAMA_KEEP_ALIVE=-1 模型常驻内存,保持加载状态,防止自动卸载,提高响应速度

📈 应用效果示例

1. 调用单个70b模型

进行上述设置之后,我们通过Open Webui访问70b模型,如下

此时查看显存占用,如下图,可以发现此时会同时使用4张卡,模型占用的43G左右的显存会均衡分布在4张卡中,而不是用单个卡推理。

2. 调用多个模型(70b和32b模型)

此时再访问32b的模型,如下:

此时显存占用如下图,可以发现依然会均衡的调用每个GPU,而不会使用单个GPU。


总结

通过为 systemd 添加环境变量配置,Ollama 可以实现:

  • 多 GPU 推理任务的自动均衡调度
  • 模型常驻显存,减少加载时间
  • 灵活控制资源占用,提升整体性能表现

该方法适用于高并发场景、长时间部署服务、模型启动延迟敏感等使用场景。

📌 附:自动化脚本(可选)

如需自动完成上述步骤,可使用以下脚本:

bash 复制代码
#!/bin/bash

SERVICE_FILE="/etc/systemd/system/ollama.service"

# 插入环境变量(如果没有手动加过)
sudo sed -i '/^\[Service\]/a Environment="CUDA_VISIBLE_DEVICES=0,1,2,3"\nEnvironment="OLLAMA_SCHED_SPREAD=1"\nEnvironment="OLLAMA_KEEP_ALIVE=-1"' "$SERVICE_FILE"

# 重新加载并重启服务
sudo systemctl daemon-reload
sudo systemctl restart ollama

# 检查状态
sudo systemctl status ollama

额外补充

🧠 1. Open WebUI多用户同时访问同一个模型,是否相互影响?

🔍 详细说明:

✅ 互不干扰的部分
  • 推理上下文是隔离的:每个用户的输入输出在 WebUI 层面是分开的,彼此看不到对方内容。
  • 会话状态是用户独立的:对话记录、聊天上下文、调用参数不会混淆。
⚠️ 可能"互相影响"的部分
  • GPU 显存竞争
    • 70B 模型非常吃显存,如果同时多个用户发起推理,可能卡顿、OOM、速度变慢
    • 尤其是 batch size、上下文长度较大时会挤爆内存。
    • 此时你看到的"互相影响"其实是性能瓶颈,不是逻辑混乱。
  • 线程/队列调度
    • 如果使用的是单实例模型服务(比如 Ollama 只加载一次模型),请求会被排队处理。
    • 一个用户长时间生成内容可能导致另一个用户响应慢。

📚 2. 使用知识库(向量检索/RAG)是否会影响模型?

✅ 简短回答

不会直接影响模型本身,但会影响模型的"输出内容"。


🔍 具体解释

  • 模型本体(参数、权重)是静态的,不会被修改。
  • 知识库的作用是提供额外的上下文信息(通过检索,拼接在 prompt 前),相当于给模型"补充资料"。
  • 所以:
    • 每个用户的知识库是独立配置的话,互不影响。
    • 如果多个用户使用同一个知识库,那检索到的内容可能类似,影响回答的风格/方向,但不至于"污染"模型。
    • 不会长期改变模型行为,只是短暂地影响一次回答。

参考链接:
https://bbs.huaweicloud.com/blogs/447392

相关推荐
爱的叹息9 分钟前
关于 微服务负载均衡 的详细说明,涵盖主流框架/解决方案的对比、核心功能、配置示例及总结表格
微服务·架构·负载均衡
穷人小水滴2 小时前
制造一只电子喵 (qwen2.5:0.5b 微调 LoRA 使用 llama-factory)
llm·aigc·ollama
Francek Chen3 小时前
【PySpark大数据分析概述】03 PySpark大数据分析
大数据·分布式·数据挖掘·数据分析·pyspark
爱的叹息3 小时前
spring cloud OpenFeign 详解:安装配置、客户端负载均衡、声明式调用原理及代码示例
运维·负载均衡
字节源流3 小时前
【RabbitMQ】队列模型
分布式·rabbitmq
安防视频中间件/视频资源汇聚平台5 小时前
SVMSPro分布式综合安防管理平台-->以S3存储革新,开启智能安防新纪元
分布式
MarkHD5 小时前
第十八天 - ELK日志体系集成 - 自定义Logstash插件 - 练习:分布式日志分析平台
分布式·elk
杰克逊的日记5 小时前
kafka怎么保证消息不被重复消费
分布式·kafka
Hotlogin5 小时前
指纹浏览器技术架构解析:高并发批量注册业务的工程化实践——基于分布式指纹引擎与防关联策略的深度实现
分布式·架构
喵~来学编程啦5 小时前
【全队项目】智能学术海报生成系统PosterGenius--多智能体辩论
人工智能·pytorch·deepseek·多模态技术