llama.cpp发布b11351:ggml新增alloc_buffer_n缓冲类型接口
该版本在ggml_backend_buffer_type_i接口上新增alloc_buffer_n方法与公开API ggml_backend_buft_alloc_buffer_n,并新增get_alloc_size_n回调与对应公开API。
AI解读:这次改动发生在ggml的缓冲类型接口层:原来的缓冲类型接口只能整体申请缓冲区,新版本加入了alloc_buffer_n方法,让同一次张量分配可以按需拆成多个缓冲区。
对普通用户最直接的变化是,多设备或需要切分缓冲区的场景下,内存分配有了统一入口:默认实现负责拆分和分配,meta缓冲类型则按设备拆子上下文再委托给简单缓冲类型。
这类改动不改变模型效果,也不会让本地推理立刻变快。真正受影响的是维护后端适配、做自定义缓冲类型或调试显存占用的人,他们需要给新接口补上实现。
llama.cpp发布版本b11351,合入PR #23671,在ggml的缓冲类型接口中新增alloc_buffer_n方法。
按发布说明,ggml_backend_buffer_type_i接口新增alloc_buffer_n,并公开API ggml_backend_buft_alloc_buffer_n。
新增接口与默认实现
发布说明显示,默认实现位于ggml-backend.cpp,负责多缓冲区拆分,并通过ggml_tallocr完成张量分配。
meta缓冲类型提供自定义实现:创建每个设备的子上下文,再委托给简单缓冲类型。
ggml_backend_alloc_ctx_tensors_from_buft现在先把张量收集成列表,再交给新API;同时移除了临时的ggml_backend_meta_alloc_ctx_tensors_from_buft。
- 在现有缓冲类型接口上为cpu、metal、openvino、hexagon、webgpu、zdnn、virtgpu、repack添加了值为NULL的alloc_buffer_n。
- 新增公开API ggml_backend_buft_alloc_buffer_n。
- 默认实现处理多缓冲区拆分与张量分配。
get_alloc_size_n与后续修正
同一PR还新增了ggml_backend_buft_get_alloc_size_n公开API,以及可选的get_alloc_size_n回调。
发布说明称,alloc_buffer_n默认实现与get_alloc_size_n默认实现之间共享张量到缓冲区的规划逻辑;alloc_buffer_n默认实现中把未检查的realloc换成std::vector;ggml_backend_alloc_ctx_tensors_from_buft_size改用新API。
提交记录还包含若干修正:恢复默认实现中缓冲区分配或张量初始化失败时的GGML_LOG_ERROR并指出失败的张量名;检查malloc结果并去掉ggml_backend_alloc_ctx_tensors_from_buft中的 _impl间接层;修复cur_buf_size在刷新缓冲区后的初始化;修正TAG_ALLOC_SHARED_BUFFER_SPLIT拼写错误;为共享缓冲区拆分逻辑添加TODO标记。
- 新增测试覆盖alloc_buffer_n与get_alloc_size_n。
- 测试附带描述说明。
- 提交记录提到处理编译警告与报告malloc失败。