llama.cpp b11375修复GGML_SCHED_NO_REALLOC下的图重分配中止问题
该版本将循环状态合并为单次get_rows采集,使预留节点规模只取决于n_rs,并在Mamba ssm_scan自定义getter下让单序列ubatch不再复制状态。
AI解读:llama.cpp发布b11375,核心改动是图形调度层面的修复:build_rs原先用单独的get_rows采集额外状态(n_rs - n_seqs行),最坏情况的预留使n_rs等于n_seqs,该节点被分配为零行。
当ubatch的cell不连续时,这会在节点数不变的情况下强制触发图重分配,而在GGML_SCHED_NO_REALLOC下会中止;新版本改为用一次get_rows采集全部n_rs状态,ubatch状态与额外状态都是它的视图。
由于该get_rows的大小只取决于n_rs,而预留已把n_rs设为最大值,触发条件被消除;Mamba ssm_scan使用自定义getter从第二个状态采集,因此单序列ubatch不复制任何状态。
视图按图在输入中构建一次,以保持图的主机侧开销不变。这一描述来自llama.cpp的发布说明。
llama.cpp发布b11375,修复了一处在GGML_SCHED_NO_REALLOC下会中止的问题:build_rs此前用单独的get_rows采集额外状态(n_rs - n_seqs行)。
单次get_rows取代额外的状态采集节点
worst-case预留场景下n_rs等于n_seqs,因此那个额外状态节点被分配为零行。任何cell不连续的ubatch都会在节点数不变的情况下强制触发图重分配,并在GGML_SCHED_NO_REALLOC下中止。
- 先前实现:build_rs使用自己的get_rows采集额外状态(n_rs - n_seqs行)
- 触发条件:ubatch的cell不连续
- 后果:节点数不变仍强制图重分配,在GGML_SCHED_NO_REALLOC下中止
视图机制与开销控制
现在改为单个get_rows采集全部n_rs状态,ubatch状态与额外状态都是该节点的视图,其大小只取决于n_rs,而预留已把n_rs设置为最大值。视图按图在输入中构建一次,以保持图的主机侧开销不变。
- 单个get_rows采集n_rs个状态,其大小只取决于n_rs
- ubatch状态与额外状态为视图
- Mamba ssm_scan使用自定义getter从第二个状态采集,单序列ubatch不复制状态
- 视图每图在输入中构建一次,主机侧开销不变
发布产物
b11375同时提供多平台预编译包,覆盖macOS Apple Silicon(arm64)与macOS Intel(x64)、iOS XCFramework、Ubuntu(x64与arm64的CPU、Vulkan、CUDA 12.8/13.4、ROCm 10.0、OpenVINO、SYCL FP32/FP16)、Linux arm64 Snapdragon(CPU、Adreno GPU、Hexagon NPU)、Android arm64及Windows(x64/arm64的CPU、CUDA 12.4/13.4、Vulkan、OpenVINO、SYCL、ROCm 10.0)等构建。发布说明中,macOS arm64的KleidiAI构建与openEuler构建均标注为DISABLED,UI单独打包。
- macOS/iOS:Apple Silicon (arm64)、Apple Silicon KleidiAI(DISABLED)、Intel (x64)、iOS XCFramework
- Linux:Ubuntu x64/arm64的CPU、Vulkan、CUDA 12.8、CUDA 13.4、ROCm 10.0、OpenVINO、SYCL
- Linux arm64 Snapdragon:CPU、Adreno GPU、Hexagon NPU,附有安装指南
- Android:arm64 CPU、arm64 Snapdragon(CPU、Adreno GPU、Hexagon NPU)
- Windows:x64/arm64 CPU、CUDA 12.4/13.4、Vulkan、OpenVINO、SYCL、ROCm 10.0、OpenCL Adreno
- openEuler与KleidiAI构建标注为DISABLED;UI单独打包