本文這部分API是用於horovod編寫tensorflow2.0+程序時需要用到的。
官方原文直通車:https://horovod.readthedocs.io/en/latest/api.html#module-horovod.tensorflow.keras
官網國內時能打開時打不開。打不開就多試幾次。
純手打,禁止轉載。有錯誤請評論指出,感謝。
1.horovod.tensorflow.keras.
init
(comm=None)
功能:horovod初始化
參數:comm-一個指定通訊方式。可以是MPI_COMM_WORLD或MPI。默認爲None代表使用MPI_COMM_WORLD
2.horovod.tensorflow.keras.
shutdown
()
功能:關閉horovod
3.horovod.tensorflow.keras.
size
()
功能:獲取Horovod的processes數量。(翻譯補充:因爲horovod是每個GPU對應一個process,所以這個命令也相當於獲取所有使用的GPU數量)
返回:一個整數,int。
4.horovod.tensorflow.keras.
local_size
()
功能:獲取本地節點的processes數量。(翻譯補充:參考3中的解釋,本命令用於獲取本地節點所使用的GPU數量)
返回:一個整數,int。
5.horovod.tensorflow.keras.
rank
()
功能:獲取horovod中正在運行的process編號。(翻譯補充:假如horovod訓練使用3個節點,每個節點用2個GPU,則一共有6個線程同時工作,這6個線程的編號是0,1,2,3,4,5,這就是該命令返回值的範圍。)
返回:一個整數,int。
6.horovod.tensorflow.keras.
local_rank
()
功能:獲取當前節點下正在運行的process編號。(翻譯補充:假如horovod訓練使用3個節點,每個節點用2個GPU。則local——rank命令返回值範圍就是0或1,不會超過1。)
返回:一個整數,int。
7.horovod.tensorflow.keras.
mpi_threads_supported
()
功能:查詢是否支持MPI多線程。如果支持,則可以混合使用MPI庫,例如mpi4py。
返回:布爾值。支持返回True,不支持返回False。
8.horovod.tensorflow.keras.
mpi_enabled
()
功能:查看當前運行時下,MPI模式是否開啓。如果開啓可以在controller或data transfer operations中使用MPI。
返回:布爾值。開啓返回True,沒開啓返回False。
9.horovod.tensorflow.keras.
mpi_built
()
功能:查看當前horovod是否支持MPI編譯。
返回:布爾值。支持返回True,不支持返回False。
10.horovod.tensorflow.keras.
gloo_enabled
()
功能:查看當前運行時下,gloo模式是否開啓。(皮一下:這裏官方文檔多寫了個is,看他啥時候改)
返回:布爾值。開啓返回True,沒開啓返回False。
11.horovod.tensorflow.keras.
gloo_built
()
功能:查看當前horovod是否支持MPI編譯。
返回:布爾值。支持返回True,不支持返回False。
12.horovod.tensorflow.keras.
nccl_built
()
功能:查看當前horovod是否支持NCCL編譯。
返回:布爾值。支持返回True,不支持返回False。
13.horovod.tensorflow.keras.
ddl_built
()
功能:查看當前horovod是否支持DDL編譯。
返回:布爾值。支持返回True,不支持返回False。
14.horovod.tensorflow.keras.
ccl_built
()
功能:查看當前horovod是否支持CCL編譯。
返回:布爾值。支持返回True,不支持返回False。
15. class horovod.tensorflow.keras.
Compression
功能:選擇allreduce過程中想要使用的梯度計算方法。
16.horovod.tensorflow.keras.
DistributedOptimizer
(optimizer, name=None, device_dense='', device_sparse='', compression=<class 'horovod.tensorflow.compression.NoneCompressor'>, sparse_as_dense=False)
功能:封裝其他的keras.optimizers.Optimizer,從而能夠用於horovod自動根據實際GPU數量來計算allreduce過程的參數。
參數:
-
optimizer – 優化器(翻譯補充:就是和keras的優化器一樣。)
-
name – 梯度下降過程的可選名稱前綴。默認是“Distribution”+優化器類型。
-
device_dense – 計算dense tensors所用的設備. 如果horovod是用的HOROVOD_GPU_OPERATIONS,則默認設備是GPU.
-
device_sparse – 計算sparse tensors所用的設備. 如果horovod是用的HOROVOD_GPU_OPERATIONS,則默認設備是GPU.
-
compression – 指定reduce過程的壓縮算法(Compression algorithm)。默認是不使用任何壓縮算法的。
- sparse_as_dense – 將全部稀疏梯度(sparse gradients)當作稠密張量(dense tensors)。如果原始sparse gradients有很高的稠密性,則 開啓這個功能有助於提高性能和內存利用率。默認不開啓。
17.horovod.tensorflow.keras.
broadcast_global_variables
(root_rank)
功能:將全部全局變量(global variables)從root_rank廣播給其他所有進程(ranks)。
參數:root_rank – 要發出廣播的rank,就是廣播站。(正整數 uint)
18.horovod.tensorflow.keras.
allreduce
(value, name=None, average=True)
功能:對tensor-compatible值進行allreduce操作。(翻譯補充,這個tensor-compatible還真不知道怎麼翻譯合適就沒翻譯。)
參數:
-
value – 一個需要reduce的tensor-compatible值。注:所有rank的輸入尺寸必須一致。
-
name – 此操作創建的常量的可選名。
-
average – 布爾值。如果是True代表reduce過程對所有ranks計算平均值。如果是False則計算總和(sum)。
19.horovod.tensorflow.keras.
allgather
(value, name=None)
功能:對tensor-compatible值進行allgather操作。(翻譯補充,這個tensor-compatible還真不知道怎麼翻譯合適就沒翻譯。)注:這個操作對輸入值的第一個維度進行連接,因此除第一個維度(0維度)外其他維度的形狀、尺度均需要保持一致。
參數:
-
value – 一個需要gather的tensor-compatible值。
-
name – 此操作創建的常量的可選名稱前綴。
20.horovod.tensorflow.keras.
broadcast
(value, root_rank, name=None)
功能:廣播一個tensor-compatible值給其他ranks。
參數:
-
value – 一個需要reduce的tensor-compatible值。注:所有rank的輸入尺寸必須一致。
-
root_rank – 要發出廣播的rank,就是廣播站。(正整數 uint)
-
name – 此操作創建的常量的可選名稱。
21.horovod.tensorflow.keras.
load_model
(filepath, custom_optimizers=None, custom_objects=None, compression=<class 'horovod.tensorflow.compression.NoneCompressor'>)
功能:加載一個Keras模型,並使用Horovod DistributedOptimizer。DistributedOptimizer會封裝底層的優化器,因此優化器狀態(相關參數、權重)都會被加載進來。默認情況下,keras.optimizers 模塊中的所有優化器都會被加載並封裝,無需custom_optimizers或custom_objects等特殊操作。
參數:
-
filepath – 字符串格式。保存模型的路徑;或h5py文件。
-
custom_optimizers – 模型加載時要支持的Optimizer子類的可選列表。列表(list)類型。
-
custom_objects – 反序列化過程中,可選映射名稱(字符串)到自定義類或函數的字典。字典類型。
-
compression – 布爾型。reduce過程中,每個worker節點對收發數據是否壓縮。默認爲不壓縮,即False。
返回:Keras模型實例。
Raises:
-
ImportError – h5py文件不可用。
-
ValueError – 非法的savefile。
22.
class horovod.tensorflow.keras.callbacks.BroadcastGlobalVariablesCallback
(root_rank, device='')
功能:創建一個Keras Callback用於初始化階段容root_rank向其他所有ranks廣播(同步)全局變量。這是訓練初始化時必備的一步,用於讓所有works上的隨機初始化權重或從checkponts文件讀取的權重保持一致。
參數:
-
root_rank – 要發出廣播的rank號。(正整數 uint)
-
device – 發出廣播的設備。如果horovod是用HOROVOD_GPU_OPERATIONS的,則默認使用GPU。
23.
class horovod.tensorflow.keras.callbacks.MetricAverageCallback
(device='')
功能:創建一個Keras Callback用於在每個epoch結束時計算所有進程中指標的均值。適合與ReduceLROnPlateau、TensorBoard等配合使用。 (再皮一下,官方文檔中conjunction少了個n,寫成conjuction了。)
參數:device – Allreduce過程使用的設備。如果horovod是用HOROVOD_GPU_OPERATIONS的,則默認使用GPU。
24.
class horovod.tensorflow.keras.callbacks.LearningRateScheduleCallback
(multiplier, start_epoch=0, end_epoch=None, staircase=True, momentum_correction=True, steps_per_epoch=None, initial_lr=None)
功能:在訓練過程(start_epoch到end_epoch過程)調整學習率。實際學習率=initial_lr * multiplier。multiplier 可以是一個常數,也可以是一個以epoch爲自變量的函數即f(epoch) = lr’。
如果multiplier 是一個函數,同時 staircase=True,學習率會在每個epoch開始前就被調整好,並且回傳給multiplier 函數的epoch參數是一個整數。(翻譯補充:這裏強調epoch是整數主要原因是和staircase=False情況做對比。)
如果multiplier 是一個函數,同時 staircase=False,學習率同樣會在每個batch開始前就被調整好,但是回傳給multiplier 函數的epoch參數是一個浮點數,該浮點數epoch計算公式爲epoch‘=epoch+batch/steps_per_epoch。所以staircase的關閉主要是用於學習率的平滑調整。
注意:該API僅在v0.21.0版本及以上纔有。
參數:
-
multiplier – 如上面介紹的,是一個常數,或是一個關於epoch的函數。
-
start_epoch – 設置需要開始調整學習率epoch。默認爲0。正整數。
-
end_epoch – 設置一個epoch來停止調整學習率。默認爲None表示到訓練結束都一直調整學習率。正整數 or None。
-
staircase – 布爾量。決定學習率是逐epoch調整還是逐batch調整。默認爲False代表逐epoch調整。反之True代表逐batch調整。
-
momentum_correction – 布爾量。用於設置是否將動量校正應用於具有動量的優化器。默認True,即應用動量矯正。
-
steps_per_epoch – 如果Keras版本>=2.0.0則無需管這個參數。但如果是老版本要自己填steps_per_epoch值。正整數。具體可以參考Keras的API手冊。
-
initial_lr – 訓練開始的學習率值。浮點數。
25.
class horovod.tensorflow.keras.callbacks.LearningRateWarmupCallback
(warmup_epochs=5, momentum_correction=True, steps_per_epoch=None, verbose=0, initial_lr=None)
功能:用於實現學習率預熱(Warm up)設置。關於預熱(Warm up)訓練的詳情參見原論文https://arxiv.org/pdf/1706.02677.pdf。
注意:該API僅在v0.21.0版本及以上纔有。
參數:
-
warmup_epochs – 設置預熱的epoch數量。默認爲5。正整數。
-
momentum_correction – 布爾量。用於設置是否將動量校正應用於具有動量的優化器。默認True,即應用動量矯正。
-
steps_per_epoch – 如果Keras版本>=2.0.0則無需管這個參數。但如果是老版本要自己填steps_per_epoch值。正整數。具體可以參考Keras的API手冊。
-
verbose – 詳細模式。0或1。默認0代表關閉詳細模式。
-
initial_lr – 訓練開始的學習率值。浮點數。