簡體   English   中英

是否可以在單個 python 腳本中在多個 GPU 上並行訓練多個 Keras 模型?

[英]Is it possible to train multiple Keras models in parallel on multiple GPUs in a single python script?

如果我想訓練 Keras 模型並有多個 GPU 可用,有幾種有效使用它們的方法:

  1. 將 GPU 分別分配給不同的 model,並並行訓練它們(例如,用於超參數調整或不同架構之間的比較)。 For example, I have model1 that I assign to GPU1, and model2 to GPU2, and after one global data loading operation, Keras would run model.fit() for each model in parallel on each GPU.

  2. 划分一個 model 並在所有 GPU 上並行訓練。 這是通過將 model 分成連續的塊,然后計算整個 model 的所有梯度來完成的。 它的實現方式不適用於不同的獨立模型。

  3. 潛水數據並將不同批次的數據輸入不同 GPU 上的相同 model。

似乎有很多關於 2) 和 3) 的文檔

https://keras.io/guides/distributed_training/

https://www.run.ai/guides/multi-gpu/keras-multi-gpu-a-practical-guide/

https://www.pyimagesearch.com/2017/10/30/how-to-multi-gpu-training-with-keras-python-and-deep-learning/

但是我找不到1)的任何解決方案,並且要求它的帖子沒有解決方案:

同時在不同的 GPU 上訓練多個 keras/tensorflow 模型

似乎,在這些選項已經可用的情況下,還可以選擇為每個 model 分配不同的 GPU 並並行訓練。 有什么我想念的嗎?

編輯:一種建議的解決方案是運行不同的 python 腳本。 但這不是最佳的,因為它是按腳本划分每個 GPU,而不是按 model,這意味着腳本的所有其他部分都需要運行兩次,冗余。 如果數據加載部分很昂貴,這將非常低效,因為兩個腳本將競爭數據訪問。

盡管我知道這不是所需要的,但其中一種解決方案是使用TFRecords 這是 OP 描述的場景,我們將在其中運行不同的 python 腳本 - 每個腳本對應於相同 model 的某些變體。 關於訓練 ANN,您應該意識到,在大多數情況下,當 GPU 很忙時,CPU 相對空閑。 在加載數據集時,有兩種情況:

  1. 在開始時加載整個數據集(具有相同 model 的n不同變體 - 這是 memory 中相同數據集的n倍,這對於大數據可能是致命的,我們花費n倍以上的時間來加載數據)

  2. 創建為每個批次查詢的數據訓練/測試生成器(內存問題已部分解決,但我們可能會花費更多時間等待數據 - 從不同的磁盤位置讀取等...)

2. 場景的問題是,在每批之后,我們必須等待下一批被加載、准備(如增強等)並轉移到 GPU。 TensorFlow 提供 TFRecords,這是一種用於存儲數據的二進制格式。 除了格式本身,還有 API 用於查詢以這種格式存儲的數據,其想法是當 GPU 忙時,我們可以異步准備下一批 CPU,從而解決瓶頸問題。 在這里很好地描述了這一點:

https://www.tensorflow.org/guide/data_performance

當然,其中沒有一個全局加載功能,但這是在低 memory 使用率和快速數據集訪問之間的良好折衷。 根據與 GPU 相比 CPU 必須完成的工作量,這可能是您問題的部分解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM