吐槽
在連續挖了好幾個坑之後,又開了一個新的坑:推理最佳化。它屬於一個llm底層的應用,目的是在作業系統層面來最佳化llm的執行速度進而最佳化整個模型。
那閒話少說,我們正式開始。
llm的過程
prefill階段與decoding階段
prefill
decoding
這兩者的區別是prefill會先把所有的資料進行拿出來計算,後者只會拿很小一塊
推理最佳化的Benchmark
吞吐量
單位時間內系統能吐出多少個decoding
影響因素:模型最佳化,輸入資料長度
First Token Latency(很重要)
首次prefill階段所花費的時間
影響因素:輸入長度
Latency
生成每個詞的間隔
影響因素:輸入長度
QPS(每秒請求數)
QPS=K/這K個請求的時間
影響因素:顯示卡利用率
LLM推理的子過程
最佳化
1/流水線前後處理與高效能取樣
本質是處理過程中的Tokenize和Detokenize部分可以在cpu中進行處理,這樣就不必浪費gpu資源進而提升效率。
2/動態批處理
利用流水線思想最佳化處理過程,透過將多個使用者的過程結合在一起來提升處理速度,具體來說在self Attention層分成了Flash attention和Decoding attention兩個部分一起處理merge step。
3/Cache現存管理
過去的cache是直接給每一個使用者分配一個固定大小的記憶體,也有最佳化版本將使用者的資訊切塊來分配,都是存在問題的。ppl中採用的VM Allocator在過去的cache基礎上做了修改,會根據使用者過去的資訊來做一個預測長度。這樣可以有效的減少浪費
4/KV Cache量化
Q:什麼是量化?
A:將浮點數表示的資料轉換為更小的資料型別,如整數或固定點數,從而減少儲存空間和計算開銷。
KV快取決定了伺服器能服務的使用者數量,最佳化快取就是提升效能
應用在self attation,K,V三個層中
5/矩陣乘法量化
矩陣乘法在模型中花費佔比70%以上
量化大體方向
int8 VS int4
int8相比於fp16 載入權重減半,計算時間減半。
int4載入權重會減少的更多,但會多一個解量化的時間,且不減半計算時間。
在伺服器中多用int8是因為解量化的時間與計算時間正相關,而伺服器中計算佔比較大。