Slim模型部署多GPU

2022-05-08 08:45:26 字數 2074 閱讀 3626

單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 將之前的注...