Skip to content

张量 (Tensor) 是 GGML 中的基本数据单元,表示 n 维数组,支持多种数据类型包括浮点和量化格式。

为什么需要 tensor

LLM 推理本质上是大量的矩阵/张量运算。GGML 需要一个统一的张量表示来支持各种运算(矩阵乘法、卷积、归一化等),同时要能表示不同精度的数据以实现量化推理。

核心原理

c
struct ggml_tensor {
    enum ggml_type type;        // 数据类型
    int n_dims;                 // 维度数 (1-4)
    int64_t ne[GGML_MAX_DIMS];  // 每个维度的元素数
    size_t nb[GGML_MAX_DIMS];   // 每个维度的字节步长
    void * data;                // 数据指针
    struct ggml_tensor * grad;  // 梯度 (用于自动微分)
};

维度约定:

  • ne[0] 是最内层维度(行方向)
  • ne[n_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 — 张量内存分配

相关概念