在每一次前向传播时(从输入层到输出层,通常用于计算损失),都需要进行O*I次乘法,并将所有乘法的结果相加,最终总运算次数约等于于2*O*I FLOP(Floating Point Operations)即2N,而每一次反向传播(即从输出层到输入层的反向计算,通常用于更新参数)的总计算量为4N FLOP,即对于前文所属的简单神经网络,对每一个数据点进行的一轮训练所需要的总计算量为6N FLOP,当总数据量为D时,最终的总计算量即为6ND FLOP。
以上为CCL给出的一个简单算例,但需要注意的是,前述6ND的结果仅适用于算例中提到的单层全连接神经网络,工程中具有实用价值的神经网络因输入输出中间其他层的存在以及多个神经网络的相互配合(如transformer模型),将会使得运算量呈指数级增长,并引入除了乘法和加法之外的其他运算过程,因此实际模型中总运算量的计算也会非常复杂,CCL给出的算例仅具有参考价值,在实际合规应当由工程人员结合实际模型结构和BIS提供的指引进行准确计算,不可直接套用前述6ND FLOP的公式。
当然,该算例并非毫无价值,其给出了计算运算量的一般方法的同时,结合技术注释的其他文本提出了一个重要原则,即运算量的计算是与实际实现和硬件无关的(regardless of the implementation and hardware limitations),无论使用什么样的硬件平台或算法,任何实际产生的数学运算都应将计入运算量,应当计入总运算量,除非能够实际减少运算量,否则仅仅是算子层面的优化并不能规避该阈值。当然,如果通过改进算法,在实际减少了运算量的情况下,达到了与高运算量模型相当的性能的,4E091的注释2也确保这种模型不会因为其高性能就落入其管制范围。
(二) 数据处理阶段运算量的例外
4E091关于运算的定义中,明确排除了数据收集和预处理阶段产生的运算。但也有例外,如果一个模型中超过10%的运算(operations)是基于由同一个数据生成模型生成的非公开合成数据(synthetic data),那么操作这个数据生成模型生成合成数据的运算量(即推理运算量)也应该算在内。如果这个数据生成模型的参数未被公开,那么最初用于训练这个数据生成模型运算量也应当被计算在内,而这个运算量会比推理运算量大得多。
即如果模型A使用了模型B生成的数据D进行训练,且基于模型B的输出进行训练的运算量超过了其总运算量的10%,则B用于生成D的运算量也应当累加进A中,如果B的参数未被公开(即通常所说的闭源模型),则用于训练B本身的运算量也应当被计算。
同时,CCL为了防止通过多个变体模型规避掉前述10%的阈值,其规定,基于同一个模型的变体(如不同的检查点或微调后的版本)生成的数据,视同为同一个模型。还是前面的例子,如果A使用的是B生成的数据D和B的变体B’生成的数据D’进行训练,只要基于D和D’进行训练的运算量总和超过了10%,都会触发前述累加条款。
对于多个未公开的数据生成模型生成的数据共同用于一个模型的训练,且最终运算量超过10%的,则仅应当计算被用的最多的那个模型的运算量。
CCL中还规定了一个“不重复计算”原则防止运算量虚高,例如,某公司使用数据生成模型A用于训练模型B和模型C,而B和C生成的数据又用于训练模型D,则训练A的运算量只计入模型D的运算量一次。