Skip to content

GGML 张量库基础 — 概念

张量 (Tensor)

GGML 中的张量用 ggml_tensor 结构体表示:

c
struct ggml_tensor {
    enum ggml_type type;    // 数据类型 (F32, F16, Q4_0, ...)
    int n_dims;             // 维度数
    int64_t ne[GGML_MAX_DIMS]; // 每个维度的大小
    size_t nb[GGML_MAX_DIMS];  // 每个维度的步长 (bytes)
    void * data;            // 数据指针
    struct ggml_tensor * grad; // 梯度张量
    // ... 操作与图信息
};

关键设计:

  • ne[] (number of elements) — 每维元素数,如 [rows, cols]
  • nb[] (number of bytes) — 每维字节步长,支持非连续内存
  • type — 支持 F32、F16、以及多种量化类型 (Q4_0, Q5_1, Q8_0 等)

数据类型

类型比特数说明
GGML_TYPE_F3232标准 float
GGML_TYPE_F1616半精度
GGML_TYPE_BF1616BF16
GGML_TYPE_Q4_04.54-bit 量化 (block)
GGML_TYPE_Q5_15.55-bit 量化
GGML_TYPE_Q8_08.58-bit 量化
GGML_TYPE_IQ4_XS4.25超低比特量化

计算图

GGML 使用计算图描述运算:

构建方式:

c
struct ggml_context * ctx = ggml_init(params);
struct ggml_tensor * x = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 1);
ggml_set_param(ctx, x);
struct ggml_tensor * a = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 1);
struct ggml_tensor * b = ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 1);
struct ggml_tensor * x2 = ggml_mul(ctx, x, x);
struct ggml_tensor * f = ggml_add(ctx, ggml_mul(ctx, a, x2), b);

自动微分

  • 标记为 param 的张量会自动计算梯度
  • ggml_set_param(ctx, tensor) 将张量标记为可训练参数
  • 反向传播通过 ggml_build_backward_expand() 自动构建梯度图

内存管理

  • ggml_context 是一个内存池,所有张量从中分配
  • ggml_init() 创建上下文,需指定内存大小
  • ggml_free() 一次性释放所有张量

相关概念