Skip to content

张量 (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.hggml_tensor 结构体定义
  • ggml/src/ggml.c — 张量创建和管理函数
  • ggml/include/ggml-alloc.h — 张量内存分配

相关概念