1. 计算图(Computational Graph)
计算图是机器学习模型在计算机内存中的数据结构表示。从本质上讲,训练好的大模型就是一个及其复杂的数据公式。在程序中,这个公式被表示为一个“有向无环图”(DAG):图中的节点代表具体的数学运算(例如矩阵乘法、激活函数),而节点之间的连线则代表在运算之间流动的数据(即张量Tensor)。 在大模型的运行生命周期中,计算图处于初始化加载与准备阶段(即在真正开始生成文本之前)。
- 当你启动模型时,运行环境(如ONNX Runtime或LiteRT)首先会将模型文件解析并转换为内存中的计算图表示。
- 接着,运行环境会将这个图进行“独立于硬件的优化”,比如将几个相邻的小运算融合(算子融合)成一个大运算,以减少开销。
- 优化完成后,运行环境会将这个庞大的计算图切分成多个子图,并根据底层硬件的能力,讲不通的子图分配给不同的硬件去执行。在这一切准备就绪后,模型才会进入接受用户输入并逐个字生成结果的推理阶段。
2. 异构(Heterogeneous)
在计算机架构中,“异构”指的是一个系统中混合了多种不同类型的处理器或计算单元。在过去,软件主要依赖通用处理器(CPU)来完成所有工作;而在异构系统中,设备同时搭载了CPU、GPU(图形处理器)以及专门用于AI加速的NPU(神经网络引擎)等多种架构的物理硅片。 在大模型的语境下,“异构调度”之所以重要,是因为大模型不同阶段的物理特征差异极大:
- 预填充阶段(处理prompt输入):这个阶段是高度墨迹的矩阵乘法运算,非常适合交给擅长并发计算的NPU或独立GPU来处理。
- 解码阶段(逐个生成回答的Token):这个阶段由于每次只生成一个词,计算量不大,但极度依赖内存带宽(需要不断读取上下文缓存),此时依赖提前静态编译的NPU效率往往会大幅下降,反而更适合交给具有更好缓存亲和力的CPU或集成显卡(iGPU)来处理。 因此,先进的运行环境必须具备“异构执行图”的能力,它能在模型运行的一瞬间,聪明地将计算图切开,把不同的运算任务动态分配给设备上最适合处理该任务的芯片,从而实现性能和能耗的最佳平衡。
3. 计算图与模型权重之间的关系
可以简单理解为“工厂流水线”与“原材料”的关系。
- 分工不同(结构与数据):计算图本身是一张逻辑“蓝图”,它定义了数据需要经过哪些具体的运算步骤(如矩阵乘法、加法等),但图结构本身并不包含具体的数值。而“储存的大量权重”则是模型在训练阶段耗费海量算力学习到的庞大参数,它们是真正具有智能的“数据”,在程序底层通常以多维数组(张量,即NDArray)的形式存在。
- 运行时的相互结合:当运行环境加载大模型时,它首先在内存中解析并构建出计算图的结构。随后,运行环境会调用内存分配器,将存储的权重作为运行时的实际值(Runtime values)“填充”或绑定到计算图的特定常量节点上。只有当这些具体的权重数据流入图中的各个节点时,计算图才能真正处理你的输入并生成文本。
- 大模型带来的动态调度关系:在处理早期的小模型时,计算图通常要求将所有的权重一次性全部加载到系统内存(DRAM)中才开始运行。但由于大语言模型的权重动辄数十GB,现代运行环境改变了二者的交互方式。例如,借助Apple Core AI的系统级调度,计算图在运行时可以动态评估当前的需求,让绝大部分权重静默地储存在手机闪存汇总,只有当计算图的某个分支真正需要用到特定的“专家参数”时,才将那极少部分的权重数据临时、流式地加载到内存中参与运算。这种将计算逻辑与庞大权重数据动态解绑的设计,是目前大模型能在端侧有线内存在运行的核心基石。