FLOPs和FLOPS的區別
- FLOPs?(Floating Point Operations)是指模型或算法執行過程中總的浮點運算次數,單位是“次”
- FLOPS?(Floating Point Operations Per Second)是指硬件設備(如 GPU 或 CPU)每秒能夠執行的浮點運算次數,單位是“次/秒”
MFU
模型算力利用率(Model FLOPs Utilization, MFU)和硬件算力利用率(Hardware FLOPs Utilization, HFU)是評估某一模型實現對芯片計算性能利用情況的常用指標。
- 模型算力利用率:是指模型一次前反向計算消耗的矩陣算力與機器算力的比值
- 硬件算力利用率:是指考慮重計算后,模型一次前反向計算消耗的矩陣算力與機器算力的比值
矩陣相乘
矩陣是A(大小H×D),參數矩陣B(大小D×W),Y=AB的FLOPs公式就是:
H × W × ( D + (D?1)) = H × W × (2D?1)?
其中Y的每個元素都是經過D次相乘以及D-1加法。如果考慮常數項或者考慮加入bias,即Y中每一個元素需要額外進行一次加法,則可以將公式中的-1省略,即:2 ×?H × D?× W
矩陣乘法FLOPs與參數量Parameter
一個全連接層的神經網絡計算的過程可以看成是兩個矩陣進行相乘的操作,忽略掉激活函數(activation)部分的計算,假設輸入矩陣是A、矩陣大小是H×I,全連接層的參數矩陣是B、矩陣大小是I×W,全連接層矩陣計算過程實際就是:Y=AB
所以,對于輸入值大小Input_size是H?,矩陣乘法中有:
FLOPs = 2 × H × D × W = 2 × Input_size × Parameter
即可以簡單認為一個token的計算量是參數量的2倍
Transformer FLOPs計算
?參數量計算參考Transformer Decoder-Only 參數量計算-CSDN博客,且通過上面分析,可以知道1個token的計算量是參數量的2倍,從而可以計算transformer的每層FLOPs如下
(其中embed層的計算是查表計算,計算量為4×d_model)
推理時每個token需要的算力:C_forward per token?≈?2N?
根據反向傳播的計算量是前向傳播的2倍的結論,假設模型整個訓練過程語料Token數是?T?,可以估算Transfomer訓練(前向傳播+反向傳播)的FLOPs 約等于: C_train? ≈??2N?× 3?× T = 6NT
如果考慮激活重計算技術(Activation Recomputation),反向傳播的計算量大概是前向傳播的3倍,則訓練FLOPs 約等于8NT
實際情況時間估算
上面說的算理想情況:即首要考慮 GPU 前后向時算矩陣運算這個時間大頭,而且 隱藏層維度d_model >> 序列長度n_ntx,利用率100%,不考慮更新、通信、切分、其他步驟(加載數據、log等等)。
實際情況不可能達到 100%,如果考慮到上述效率,一般要打折扣。折扣系數要看框架,目前比較高效的框架算上通信加載也就0.5,模型大通常來說折扣還會高。