随便写一点。
概念区分:FLOPS(全大写)是指floating point operations per second的缩写,每秒浮点运算次数,这是一个计算速度,是衡量硬件性能的指标。FLOPs是指floating point operations,意思是浮点运算数,这是一个计算量,是衡量模型复杂度的。
看了一个估算模型训练过程中每秒浮点运算次数的工具代码。
首先导入相关的模块。
然后定义了一个函数get_device_flops,这个函数主要是根据当前的GPU型号估算理论峰值FLOPS。如下为常见的FLOPS单位列表,从小到大进行排序:B K M G T P。定义的函数默认返回的是T单位。
B:Base,基础单位,表述每秒一次浮点运算。
K:Kilo,千次浮点运算,1K = 10^3B。
M :Mega,百万次浮点运算,1 MFLOPS = 10^6 BFLOPS。
G :Giga,十亿次浮点运算,1 GFLOPS = 10^9 BFLOPS。
T : Tera,万亿次浮点运算,1 TFLOPS = 10^12 BFLOPS。
P :Peta,千万亿次浮点运算,1 PFLOPS = 10^15 BFLOPS 1。
定义了一个unit_convert在里面,主要是为了将一个数值(FLOPS)转换为指定的单位。
获取GPU型号。
然后定义了一个FlopsCounter的类,主要是用于估算模型在训练过程中的每秒浮点运算次数FLOPS,配置的对象是Qwen2Config或LlamaConfig的类型。
定义了一个函数,将模型的配置参数提取出来计算出实际的FLOPS。计算的参数包括MLP层、注意力线性层、嵌入层和语言模型头。
定义了一个estimate_flops的方法,用于估算模型再处理当前批次数据时的实际每秒浮点运算次数。主要是为了将上面的东西整合起来。