單gpu時,思路很簡單,前向、後向都在乙個gpu上進行,模型引數更新時只涉及乙個gpu。
多gpu時,有模型並行和資料並行兩種情況。
模型並行指模型的不同部分在不同gpu上執行。
資料並行指不同gpu上訓練資料不同,但模型是同乙個(相當於是同乙個模型的副本)。
tensorflow支援的是資料並行。
資料並行的原理:cpu負責梯度平均和引數更新,在gpu上訓練模型的副本。
多gpu平行計算的過程如下:
1)模型副本定義在gpu上;
2)對於每乙個gpu, 都是從cpu獲得資料,前向傳播進行計算,得到loss,並計算出梯度;
3)cpu接到gpu的梯度,取平均值,然後進行梯度更新。
這個在tf的實現思路如下:
模型引數儲存在乙個指定gpu/cpu上,模型引數的副本在不同gpu上,每次訓練,提供batch_size*gpu_num資料,並等量拆分成多個batch,分別送入不同gpu。前向在不同gpu上進行,模型引數更新時,將多個gpu後向計算得到的梯度資料進行平均,並在指定gpu/cpu上利用梯度資料更新模型引數。
假設有兩個gpu(gpu0,gpu1),模型引數實際存放在cpu0上,實際一次訓練過程如下圖所示:
為了能讓乙個slim模型在多個gpu上訓練更加容易,這個模組提供了一系列幫助函式,比如create_clones()、optimize_clones()、deploy()、gather_clone_loss()、_add_gradients_summaries()、_sum_clones_gradients()等,該模組位於:
用法如下:
g = tf.graph()
# 定義部署配置資訊,你可以將此類的例項傳遞給deploy()以指定如何部署要構建的模型。 如果未傳遞,則將使用從預設deployment_hparams構建的例項。
config = model_deploy.deploymentconfig(num_clones=2, clone_on_cpu=true)
# 在儲存變數的裝置上建立global step
with tf.device(config.variables_device()):
global_step = slim.create_global_step()
# 定義輸入
with tf.device(config.inputs_device()):
images, labels = loaddata(...)
inputs_queue = slim.data.prefetch_queue((images, labels))
# 定義優化器
with tf.device(config.optimizer_device()):
optimizer = tf.train.momentumoptimizer(flags.learning_rate, flags.momentum)
# 定義模型和損失函式
def model_fn(inputs_queue):
images, labels = inputs_queue.dequeue()
predictions = createnetwork(images)
slim.losses.log_loss(predictions, labels)
# 模型部署
model_dp = model_deploy.deploy(config, model_fn, [inputs_queue],optimizer=optimizer)
# 開始訓練
slim.learning.train(model_dp.train_op, my_log_dir,summary_op=model_dp.summary_op)
clone namedtuple:把那些每次呼叫model_fn的關聯值儲存在一起
deployedmodel namedtuple: 把那些需要被多個副本訓練的值儲存在一起
deploymentconfig的引數:
GPU程式設計模型
gpu graphical processing unit 是顯示卡內用於圖形處理的器件。和cpu相比,cpu是序列執行,而gpu是多個核並行執行。gpu是乙個高效能的多核處理器,有很高的計算速度和資料吞吐率。在gpu上的運算能獲得相對於cpu而言很高的加速比。第 一 第二代gpu出現的時候,gpu...
pytorch 多GPU訓練(單機多卡 多機多卡)
首先是資料集的分布處理 需要用到的包 torch.utils.data.distributed.distributedsampler torch.utils.data.dataloader torch.utils.data.dataset distributedsampler這個包我們用來確保dat...
caffe 呼叫多塊gpu
一.檢測配置 使用命令檢視機器裡面安裝了幾塊顯示卡 二.更改配置檔案 在檢視到機器裡面安裝的顯示卡不止一塊時,就可以通過更改配置檔案,在編譯通過後,就可以使用多個gpu同時執行。設定makefile.config 開啟開關 use nccl 1,並新增nccl庫路徑 use nccl 1 將之前的注...