Appearance
张量 (Tensor) 是 GGML 中的基本数据单元,表示 n 维数组,支持多种数据类型包括浮点和量化格式。
为什么需要 tensor
LLM 推理本质上是大量的矩阵/张量运算。GGML 需要一个统一的张量表示来支持各种运算(矩阵乘法、卷积、归一化等),同时要能表示不同精度的数据以实现量化推理。
核心原理
c
struct ggml_tensor {
enum ggml_type type; // 数据类型
struct ggml_backend_buffer * buffer; // 所属 buffer(NULL 时由 ggml_context 管理)
int64_t ne[GGML_MAX_DIMS]; // 每个维度的元素数
size_t nb[GGML_MAX_DIMS]; // 每个维度的字节步长
enum ggml_op op; // 产生该张量的算子
int32_t op_params[...]; // 算子参数
int32_t flags;
struct ggml_tensor * src[GGML_MAX_SRC]; // 算子的输入张量
struct ggml_tensor * view_src; // view 的源张量
size_t view_offs; // view 偏移
void * data; // 数据指针
char name[GGML_MAX_NAME];
void * extra;
char padding[8];
};维度约定(n_dims 仅是查询函数,不是结构体字段):
ne[0]是最内层维度(行方向)ne[GGML_MAX_DIMS-1]是最外层维度(batch)nb[0]= 单个元素的字节数nb[i]=nb[i-1] * ne[i-1]
数据类型:F32、F16、BF16、Q4_0、Q4_1、Q5_0、Q5_1、Q8_0、IQ 系列、K-quants 等。
在源码中的实现
ggml/include/ggml.h—ggml_tensor结构体定义ggml/src/ggml.c— 张量创建和管理函数ggml/include/ggml-alloc.h— 张量内存分配
相关概念
- ggml — 张量所在的计算库
- compute-graph — 张量在计算图中的角色
- quantization — 张量的量化数据类型
- backend — 张量在不同设备上的内存管理