1. 程式人生 > 程式設計 >keras實現多GPU或指定GPU的使用介紹

keras實現多GPU或指定GPU的使用介紹

1. keras新版本中加入多GPU並行使用的函式

下面程式段即可實現一個或多個GPU加速:

注意:使用多GPU加速時,Keras版本必須是Keras2.0.9以上版本

from keras.utils.training_utils import multi_gpu_model  #匯入keras多GPU函式
import VGG19   #匯入已經寫好的函式模型,例如VGG19

if G <= 1:
  print("[INFO] training with 1 GPU...")
  model = VGG19()

# otherwise,we are compiling using multiple GPUs
else:
  print("[INFO] training with {} GPUs...".format(G))
  # we'll store a copy of the model on *every* GPU and then combine
  # the results from the gradient updates on the CPU
  with tf.device("/cpu:0"):
    # initialize the model
    model1 = VGG19()
    # make the model parallel(if you have more than 2 GPU)
    model = multi_gpu_model(model1,gpus=G)

2.指定使用某個GPU

首先在終端檢視主機中GPU編號:

watch -n -9 nvidia-smi

查詢結果如下所示:

keras實現多GPU或指定GPU的使用介紹

顯示主機中只有一塊GPU,編號為0

2.1 下面方法是直接在終端執行時加入相關語句實現指定GPU的使用

export CUDA_VISIBLE_DEVICES=0 python test.py
# 表示執行test.py檔案時,使用編號為0的GPU卡
export CUDA_VISIBLE_DEVICES=0,2 python test.py
# 表示執行test.py檔案時,使用編號為0和2的GPU卡

2.2 下面方法是在Python程式中新增

import os
# 使用第一張與第三張GPU卡
os.environ["CUDA_VISIBLE_DEVICES"] = "0,2"

補充知識:踩坑記----large batch_size cause low var_acc

有時候,我們在訓練模型前期,會出現很高的train_acc(訓練準確率),但var_acc(驗證準確率)卻很低。這往往是因為我們模型在訓練過程中已經進入區域性最優,或者出現過擬合的現象。造成這種情況有多種原因,我只提出以下幾點,有補充的可以在下面留言,我補充。

(1).訓練資料分佈不均勻,可能你的訓練資料某一類別佔據了大多數,比如95%的資料為蘋果,5%的資料為其他類別,那麼模型為了擬合訓練資料,則模型會偏袒於把識別結果歸屬於蘋果,而驗證集的資料是正常的,那麼便會出現高train_acc,低val_acc。

(2).訓練資料沒有shuffle,那麼整個batch裡面將會是同一個類別資料,比如都為蘋果的圖片,那麼訓練一個batch,那麼模型輸出將會往這一類別靠攏,會形成一個很高的acc的假象,但這個模型泛化能力卻很低,因為這個模型都只會為了擬合這批同類的資料。

(3).訓練集跟驗證集的預處理不一致,這個是細節問題,輸入的圖片分佈不一致,那麼必然會影響到驗證結果。

(4).模型過於複雜,造成過擬合現象,特別是在於訓練資料集不多的情況下,更容易出現過擬合。

(5).這個也是最難發現的,就是過大的batch_size,造成訓練前期,模型還未收斂,出現很高的train_acc,卻有很低的val_acc,親測,在120個類別,引數只有七萬的分類模型中,在batch-size等於64的情況下,在第二個epoch時,train_acc達到80%,val_acc卻只有6%,train_loss跟val_loss也是相差很大,而在batch_size在等於8的情況下,在第二個epoch,train_acc跟val_acc皆能達到60%,且還有上升的趨勢。至於為什麼,個人認為,模型在大的batch_size的情況下,模型泛化能力下降,且更難擬合,每個epoch所包含的step也更少,且在adam的優化演算法,前期的學習率較高,模型出現了振盪,一直在區域性最優值徘徊,具體原因不知。

接下來分析下,batc_size對模型的影響:

large batch_size:

好處:訓練的更快,每一step都包含更多的訓練集,模型準確率會更高,不容易受到噪聲的影響,穩定性更好。

small batch_size:

好處:不容易陷入區域性最優,泛化能力更強。

總結:

(1).large batch_size,雖然訓練模型的訓練誤差會更低,但往往在execute的時候,效果卻不盡人意。

(2).在時間允許的情況下,建議batch_size在32或以下。

以上這篇keras實現多GPU或指定GPU的使用介紹就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。