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