Appearance
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_F32 | 32 | 标准 float |
GGML_TYPE_F16 | 16 | 半精度 |
GGML_TYPE_BF16 | 16 | BF16 |
GGML_TYPE_Q4_0 | 4.5 | 4-bit 量化 (block) |
GGML_TYPE_Q5_1 | 5.5 | 5-bit 量化 |
GGML_TYPE_Q8_0 | 8.5 | 8-bit 量化 |
GGML_TYPE_IQ4_XS | 4.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()一次性释放所有张量
相关概念
- compute-graph — 计算图的详细设计
- quantization — 张量量化原理
- backend — 计算图在后端上的执行