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

相关推荐
独隅6 小时前
PyTorch 分布式训练完整指南:策略、实现与模型选型
人工智能·pytorch·分布式
Wenweno0o6 小时前
Eino - 从0到1跑通大模型调用
golang·大模型·智能体·eino
华农DrLai7 小时前
怎么用大模型生成推荐的训练数据?Data Augmentation怎么做?
数据库·人工智能·大模型·nlp·prompt
guslegend9 小时前
4月11日(Codex使用)
人工智能·大模型
墨北小七9 小时前
小说大模型的分布式训练——张量并行架构设计与实现
分布式
yuhulkjv33510 小时前
ChatGPT Gemini Claude Grok导出的Excel公式失效
人工智能·ai·chatgpt·excel·豆包·deepseek·ai导出鸭
豆豆10 小时前
政务服务平台站群一体化解决方案
大数据·分布式·微服务·cms·政务·网站管理系统·站群cms
WangJunXiang610 小时前
LVS 负载均衡群集
运维·负载均衡·lvs
百结21410 小时前
LVS 负载均衡群集
运维·负载均衡·lvs
卤炖阑尾炎10 小时前
从原理到实战:LVS 负载均衡集群全解析(OpenEuler 环境)
运维·负载均衡·lvs