混合精度訓練是在模型訓練期間使用較低精度的運算(float16
和 bfloat16
),以使其運行速度更快並使用更少的記憶體。使用混合精度可以在現代 GPU 上將效能提升 3 倍以上,在 TPU 上提升 60%。
現今,大多數模型都使用 float32
資料類型,它佔用 32 位元的記憶體。但是,有兩種較低精度的資料類型,float16
和 bfloat16
,它們各自佔用 16 位元的記憶體。現代加速器(如 Google TPU 和 NVIDIA GPU)可以以 16 位元資料類型更快地執行運算,因為它們具有專門的硬體來執行 16 位元計算,並且可以更快地從記憶體讀取 16 位元資料類型。因此,在這些裝置上應盡可能使用這些較低精度的資料類型。
但是,變數儲存(以及某些敏感計算)仍應使用 float32
以保持數值穩定性。盡可能使用 16 位元精度,並將模型的某些關鍵部分保留在 float32
中,模型將運行得更快,同時訓練和使用 32 位元精度時也是如此。
Keras 層或模型使用的精度策略由 keras.mixed_precision.DTypePolicy
實例控制。每個層都有自己的 DTypePolicy
。您可以通過 dtype
引數(例如 MyLayer(..., dtype="mixed_float16")
)在個別層上設定它,或者您可以通過工具程式 keras.mixed_precision.set_global_policy
設定一個全域值供所有層預設使用。
通常,若要在 GPU 上開始使用混合精度,您只需在程式開始時呼叫 keras.mixed_precision.set_global_policy("mixed_float16")
即可。在 TPU 上,您將呼叫 keras.mixed_precision.set_global_policy("mixed_bfloat16")
。
雖然混合精度可以在大多數硬體上運行,但它只會加速最新的 NVIDIA GPU 和 Google TPU 上的模型。NVIDIA GPU 支援使用 float16 和 float32 的混合,而 TPU 支援 bfloat16 和 float32 的混合。
在 NVIDIA GPU 中,計算能力為 7.0 或更高的 GPU 將從混合精度中獲得最大的效能優勢,因為它們具有稱為 Tensor Cores 的特殊硬體單元,可加速 float16 矩陣乘法和卷積。較舊的 GPU 在使用混合精度時沒有數學效能優勢,但是記憶體和頻寬節省可以實現一些加速。您可以在 NVIDIA 的 CUDA GPU 網頁上查詢 GPU 的計算能力。從混合精度中受益最大的 GPU 範例包括 RTX GPU、V100 和 A100。
即使在預期不會加速的 CPU 和較舊的 GPU 上,混合精度 API 仍然可以用於單元測試、除錯,或僅僅是試用 API。但是,在 CPU 上,混合精度會運行得慢得多。
您可以使用以下命令檢查您的 GPU 類型
nvidia-smi -L