Skip to content

计算图 (Compute Graph) 是 GGML 中描述张量运算关系的数据结构,以有向无环图 (DAG) 表示,支持前向传播和自动微分。

为什么需要 compute-graph

LLM 的 forward pass 涉及数百个张量运算(矩阵乘法、归一化、激活函数等)。计算图将这些运算组织为 DAG,使得 GGML 可以:

  • 自动推导运算顺序
  • 优化执行计划(算子融合、内存复用)
  • 支持自动微分(反向传播)
  • 将运算分发到不同硬件后端

核心原理

c
struct ggml_cgraph {
    int n_nodes;                        // 节点数
    struct ggml_tensor * nodes[GGML_MAX_NODES]; // 运算节点
    int n_leafs;                        // 叶子节点数
    struct ggml_tensor * leafs[GGML_MAX_NODES]; // 输入张量
};

工作流程:

  1. 构建 — 用户通过 ggml_mul_mat(), ggml_add() 等创建张量运算
  2. 收集ggml_build_forward_expand() 将目标张量的所有依赖加入图
  3. 执行ggml_graph_compute() 按拓扑序遍历并计算每个节点
  4. 微分ggml_build_backward_expand() 自动构建梯度计算图

在源码中的实现

  • ggml/include/ggml.hggml_cgraph 结构和图操作 API
  • ggml/src/ggml.c — 图构建和执行实现
  • ggml/src/ggml-backend.cpp — 后端执行计算图
  • src/llama-model.cpp — 为 Transformer 层构建计算图

相关概念

  • ggml — 计算图所在的张量库
  • tensor — 计算图中的节点
  • backend — 计算图的执行后端