Ollama 如何处理并行请求

配置 ollama 以并行执行请求。

目录

当 Ollama 服务器同时收到两个请求时,其行为取决于其配置和可用的系统资源。

五只可爱的羊驼站在田野中

并发请求处理

  • 并行处理Ollama 支持请求的并发处理。如果系统有足够的可用内存(CPU 推理使用 RAM,GPU 推理使用 VRAM),可以同时加载多个模型,每个加载的模型可以并行处理多个请求。这由环境变量 OLLAMA_NUM_PARALLEL 控制,该变量设置每个模型可以同时处理的最大并行请求数。默认情况下,该值设置为 4(或 1,具体取决于内存可用性),但可以进行调整。

  • 批处理:当多个相同模型的请求同时到达时,Ollama 会将它们合并成一个批次进行处理。这意味着两个请求会并行处理,用户将同时看到响应流回。服务器不会故意等待以填满一个批次;处理会在请求可用时立即开始。

排队和限制

  • 排队:如果并发请求数超过配置的并行处理能力(例如,某个模型的请求数超过 OLLAMA_NUM_PARALLEL),额外的请求将被排队。队列采用先进先出(FIFO)的顺序进行处理。

  • 队列限制:队列的最大请求数由 OLLAMA_MAX_QUEUE 控制(默认值:512)。如果队列已满,新请求将收到 503 错误,表示服务器过载。

  • 模型加载:同时加载的不同模型数量由 OLLAMA_MAX_LOADED_MODELS 控制。如果请求需要加载新模型且内存不足,Ollama 会卸载空闲模型以腾出空间,请求将被排队,直到模型加载完成。

示例场景

如果两个相同模型的请求同时到达,且服务器的并行处理能力设置为至少 2,两个请求将被合并成一个批次处理,两个用户将同时收到响应。如果并行处理能力设置为 1,一个请求将立即处理,另一个请求将被排队,直到第一个请求完成。

如果请求是针对不同模型且内存充足,两个模型都可以加载,请求可以并行处理。如果内存不足,可能需要卸载一个模型,请求将被排队。

总结表

场景 结果
两个请求,相同模型,足够并行处理能力 两个请求一起并行处理(批处理)
两个请求,相同模型,parallelism=1 一个请求立即处理,第二个请求排队直到第一个完成
两个请求,不同模型,足够内存 两个模型加载,请求并行处理
两个请求,不同模型,内存不足 一个请求排队,直到内存可用或模型卸载

总之,Ollama 设计为在服务器配置为并发处理且资源充足时,能够高效处理多个同时请求。否则,请求将被排队并按顺序处理。

内存不足处理

当 Ollama 遇到内存不足无法处理传入请求时,它会采用一系列排队机制和资源管理策略来保持系统稳定:

请求排队

  • 当内存无法立即分配时,新请求将被放入一个先进先出(FIFO)队列。
  • 队列大小由 OLLAMA_MAX_QUEUE 控制(默认值:512 个请求)。
  • 如果队列达到容量,新请求将收到 503 “服务器过载”错误。

模型管理

  • 当模型处于空闲状态时,可能会从内存中卸载以释放资源供排队请求使用。
  • 同时加载的模型数量由 OLLAMA_MAX_LOADED_MODELS 限制(默认值:3×GPU 数量或 3 用于 CPU)。

内存优化

  • 尝试对相同模型的请求进行批处理,以最大化内存效率。
  • 对于 GPU 推理,每个模型需要完整的 VRAM 分配 - 不支持部分加载。

失败场景

关键内存耗尽:当排队请求超过可用资源时,Ollama 可能会:

  • 将数据写入磁盘(严重降低性能)
  • 返回“内存不足”错误
  • 在极端情况下,崩溃模型实例
配置控制设置 目的 默认值
OLLAMA_MAX_QUEUE 最大排队请求数 512
OLLAMA_NUM_PARALLEL 每个加载模型的并行请求数 4(或 1,如果受限)
OLLAMA_MAX_LOADED_MODELS 最大同时加载模型数 3×GPU 数量或 3

管理员应监控内存使用情况,并根据硬件能力调整这些参数。内存不足处理在运行大型模型(7B+ 参数)或处理多个并发请求时变得尤为重要。

Ollama 优化策略

启用 GPU 加速,使用 export OLLAMA_CUDA=1,并通过 export OLLAMA_NUM_THREADS=84 设置 CPU 线程。

硬件增强

  • 内存:13B 模型使用 32GB+,70B 模型使用 64GB+
  • 存储:使用 NVMe SSD 以加快模型加载/交换速度
  • GPU:NVIDIA RTX 3080/4090,16GB+ VRAM 用于大型模型

运营策略

  • 批处理请求:同时处理多个查询以分摊内存开销
  • 自动模型卸载:允许 Ollama 从内存中清除空闲模型
  • 缓存常用模型:保持常用模型在内存中

监控与故障排除

  • 使用 nvidia-smi(GPU)和 htop(CPU/RAM)识别瓶颈
  • 对于内存错误:
    • 升级为量化模型
    • 减少并发请求数
    • 增加交换空间

优化工作流程示例:

# 使用量化模型并启用 GPU 加速
export OLLAMA_CUDA=1
ollama run llama2:7b-q4_0 --context-size 2048

# 限制加载模型和并行请求数
export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_NUM_PARALLEL=4

这些调整可以将内存使用量减少 30-60%,同时保持响应质量,尤其在运行多个模型或处理高请求量时效果显著。

Ollama:请求批处理与并行执行

在 Ollama 中,批处理指的是将多个传入请求组合在一起并作为一个单元进行处理。这可以更高效地利用计算资源,尤其是在运行受益于并行操作的硬件(如 GPU)时。

当多个相同模型的请求同时到达时,如果内存允许,Ollama 可以将它们合并成一个批次进行处理。这可以提高吞吐量,并减少每个请求的延迟,因为模型可以利用针对批次优化的矩阵操作。

当请求的大小和复杂度相似时,批处理特别有效,因为这可以更好地利用硬件资源。

在 Ollama 中,并行执行指的是同时处理多个请求,无论是针对相同模型还是不同模型,这取决于可用内存和配置。

Ollama 支持两个级别的并行性:

  • 多模型加载:如果内存充足,可以加载多个模型并同时处理请求。
  • 每个模型的并行请求:每个加载的模型可以并行处理多个请求,由 OLLAMA_NUM_PARALLEL 设置控制(默认值为 1 或 4,取决于内存)。

当请求数超过并行限制时,它们将被排队(FIFO)直到达到 OLLAMA_MAX_QUEUE

总结

Ollama 利用批处理和并行执行来高效处理多个请求。批处理将请求组合在一起进行同时处理,而并行执行允许多个请求(或模型)同时运行。这两种 方法 都依赖于系统内存,并可根据需要进行配置以实现最佳性能。

有用的链接