keras多顯卡訓(xùn)練方式
使用keras進(jìn)行訓(xùn)練,默認(rèn)使用單顯卡,即使設(shè)置了os.environ['CUDA_VISIBLE_DEVICES']為兩張顯卡,也只是占滿了顯存,再設(shè)置tf.GPUOptions(allow_growth=True)之后可以清楚看到,只占用了第一張顯卡,第二張顯卡完全沒用。
要使用多張顯卡,需要按如下步驟:
(1)import multi_gpu_model函數(shù):from keras.utils import multi_gpu_model
(2)在定義好model之后,使用multi_gpu_model設(shè)置模型由幾張顯卡訓(xùn)練,如下:
model=Model(...) #定義模型結(jié)構(gòu) model_parallel=multi_gpu_model(model,gpu=n) #使用幾張顯卡n等于幾 model_parallel.compile(...) #注意是model_parallel,不是model
通過以上代碼,model將作為CPU上的原始模型,而model_parallel將作為拷貝模型被復(fù)制到各個(gè)GPU上進(jìn)行梯度計(jì)算。如果batchsize為128,顯卡n=2,則每張顯卡單獨(dú)計(jì)算128/2=64張圖像,然后在CPU上將兩張顯卡計(jì)算得到的梯度進(jìn)行融合更新,并對模型權(quán)重進(jìn)行更新后再將新模型拷貝到GPU再次訓(xùn)練。
(3)從上面可以看出,進(jìn)行訓(xùn)練時(shí),仍然在model_parallel上進(jìn)行:
model_parallel.fit(...) #注意是model_parallel
(4)保存模型時(shí),model_parallel保存了訓(xùn)練時(shí)顯卡數(shù)量的信息,所以如果直接保存model_parallel的話,只能將模型設(shè)置為相同數(shù)量的顯卡調(diào)用,否則訓(xùn)練的模型將不能調(diào)用。因此,為了之后的調(diào)用方便,只保存CPU上的模型,即model:
model.save(...) #注意是model,不是model_parallel
如果用到了callback函數(shù),則默認(rèn)保存的也是model_parallel(因?yàn)橛?xùn)練函數(shù)是針對model_parallel的),所以要用回調(diào)函數(shù)保存model的話需要自己對回調(diào)函數(shù)進(jìn)行定義:
class OwnCheckpoint(keras.callbacks.Callback):
def __init__(self,model):
self.model_to_save=model
def on_epoch_end(self,epoch,logs=None): #這里logs必須寫
self.model_to_save.save('model_advanced/model_%d.h5' % epoch)
定以后具體使用如下:
checkpoint=OwnCheckpoint(model)
model_parallel.fit_generator(...,callbacks=[checkpoint])
這樣就沒問題了!
補(bǔ)充知識:keras.fit_generator及多卡訓(xùn)練記錄
1.環(huán)境問題
使用keras,以tensorflow為背景,tensorflow1.14多卡訓(xùn)練會(huì)出錯(cuò) python3.6
2.代碼
2.1
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '4,5'
2.2 自定義generator函數(shù)
def img_image_generator(path_img, path_lab, batch_size, data_list):
while True:
# 'train_list.csv'
file_list = pd.read_csv(data_list, sep=',',usecols=[1]).values.tolist()
file_list = [i[0] for i in file_list]
cnt = 0
X = []
Y1 = []
for file_i in file_list:
x = cv2.imread(path_img+'/'+file_i, cv2.IMREAD_GRAYSCALE)
x = x.astype('float32')
x /= 255.
y = cv2.imread(path_lab+'/'+file_i, cv2.IMREAD_GRAYSCALE)
y = y.astype('float32')
y /= 255.
X.append(x.reshape(256, 256, 1))
Y1.append(y.reshape(256, 256, 1))
cnt += 1
if cnt == batch_size:
cnt = 0
yield (np.array(X), [np.array(Y1), np.array(Y1)])
X = []
Y1 = []
2.3 函數(shù)調(diào)用及訓(xùn)練
generator_train = img_image_generator(path1, path2, 4, pathcsv_train) generator_test= img_image_generator(path1, path2, 4, pathcsv_test) model.fit_generator(generator_train, steps_per_epoch=237*2, epochs=50, callbacks=callbacks_list, validation_data=generator_test, validation_steps=60*2)
3. 多卡訓(xùn)練
3.1 復(fù)制model
model_parallel = multi_gpu_model(model, gpus=2)
3.2 checkpoint 定義
class ParallelModelCheckpoint(ModelCheckpoint): def __init__(self, model, filepath, monitor='val_out_final_score', verbose=0,\ save_best_only=False, save_weights_only=False, mode='auto', period=1): self.single_model = model super(ParallelModelCheckpoint, self).__init__(filepath, monitor, verbose, save_best_only, save_weights_only, mode, period) def set_model(self, model): super(ParallelModelCheckpoint, self).set_model(self.single_model)
使用
model_checkpoint = ParallelModelCheckpoint(model=model, filepath=filepath, monitor='val_loss',verbose=1, save_best_only=True, mode='min')
3.3 注意的問題
保存模型是時(shí)候需要使用以原來的模型保存,不能使用model_parallel保存
以上這篇keras多顯卡訓(xùn)練方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用everything庫構(gòu)建文件搜索和管理工具
在這篇博客中,我將分享如何使用 Python 的 everytools庫構(gòu)建一個(gè)簡單的文件搜索和管理工具,這個(gè)工具允許用戶搜索文件、查看文件路徑、導(dǎo)出文件信息到 Excel,以及生成配置文件,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-08-08
OpenCV-Python使用分水嶺算法實(shí)現(xiàn)圖像的分割與提取
在圖像的處理過程中,經(jīng)常需要從圖像中將前景對象作為目標(biāo)圖像分割或者提取出來。本文就介紹了使用分水嶺算法實(shí)現(xiàn)圖像的分割與提取,感興趣的可以了解一下2021-06-06
Python中計(jì)數(shù)器Counter的使用技巧分享
計(jì)數(shù)器(Counter)是Python標(biāo)準(zhǔn)庫collections模塊中提供的一個(gè)強(qiáng)大工具,用于統(tǒng)計(jì)可哈希對象的出現(xiàn)次數(shù),本文將介紹Python中計(jì)數(shù)器的基本用法、高級功能等內(nèi)容,希望對大家有所幫助2023-11-11
python實(shí)現(xiàn)馬丁策略的實(shí)例詳解
這篇文章主要介紹了python實(shí)現(xiàn)馬丁策略的實(shí)例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
python實(shí)現(xiàn)自動(dòng)打卡小程序
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)打卡小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
利用keras使用神經(jīng)網(wǎng)絡(luò)預(yù)測銷量操作
這篇文章主要介紹了利用keras使用神經(jīng)網(wǎng)絡(luò)預(yù)測銷量操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Python神奇的內(nèi)置函數(shù)locals的實(shí)例講解
今天小編就為大家分享一篇關(guān)于Python神奇的內(nèi)置函數(shù)locals的實(shí)例講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
Python密碼學(xué)概述雙倍強(qiáng)度加密教程
這篇文章主要為大家介紹了Python密碼學(xué)概述雙倍強(qiáng)度加密教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-05-05

