参考链接:https://www.cnblogs.com/huggingface/p/18387636
简介
ggml 是一个用 C 和 C++ 编写、专注于 Transformer 架构模型推理的机器学习库。该项目完全开源,处于活跃的开发阶段,开发社区也在不断壮大。ggml 和 PyTorch、TensorFlow 等机器学习库比较相似,在llama.cpp中被广泛应用。
基本概念
但由于 ggml 是一个 低层 的库,理解这些概念能让你更大幅度地掌控性能。
- ggml_context: 一个装载各类对象 (如张量、计算图、其他数据) 的“容器”。
- ggml_cgraph: 计算图的表示,可以理解为将要传给后端的“计算执行顺序”。
- ggml_backend: 执行计算图的接口,有很多种类型: CPU (默认) 、CUDA、Metal (Apple Silicon) 、Vulkan、RPC 等等。
- ggml_backend_buffer_type: 表示一种缓存,可以理解为连接到每个 ggml_backend 的一个“内存分配器”。比如你要在 GPU 上执行计算,那你就需要通过一个buffer_type (通常缩写为 buft ) 去在 GPU 上分配内存。
- ggml_backend_buffer: 表示一个通过 buffer_type 分配的缓存。需要注意的是,一个缓存可以存储多个张量数据。
- ggml_gallocr: 表示一个给计算图分配内存的分配器,可以给计算图中的张量进行高效的内存分配。
- ggml_backend_sched: 一个调度器,使得多种后端可以并发使用,在处理大模型或多 GPU 推理时,实现跨硬件平台地分配计算任务 (如 CPU 加 GPU 混合计算)。该调度器还能自动将 GPU 不支持的算子转移到 CPU 上,来确保最优的资源利用和兼容性。
简单示例
代码库:https://github.com/ggerganov/ggml
使用 ggml的基本步骤:
- 分配一个 ggml_context 来存储张量数据(包括输入和输出)
- 分配张量并赋值
- 创建一个 ggml_cgraph (以context为参数)
- 构建计算图
- 绑定要获取的结果
- 真正开始计算,获取结果
- 释放内存并退出
下面是一个矩阵相乘的例子:
1 |
|