主要内容

在 GPU 上重现网络训练

自 R2024b 起

此示例说明如何在 GPU 上多次训练网络并获得相同结果。

确保模型训练和推断在 GPU 上的可重现性有利于试验和调试。在 GPU 上重现模型训练对于验证深度学习系统尤为重要。

准备训练数据和网络

使用支持函数 prepareDigitsDataprepareAutoencoderLayers 来准备训练数据和网络架构。这些函数按照为图像到图像的回归准备数据存储示例中所述准备数据和构建自编码器网络,并以支持文件的形式包含在此示例中。

[dsTrain,dsVal] = prepareDigitsData;
layers = prepareAutoencoderLayers;

定义训练选项

指定训练选项。除了以下例外情况外,这些选项与 为图像到图像的回归准备数据存储 示例中的选项相同。

  • 进行 5 轮训练。五轮训练不足以使网络收敛,但足以证明训练是否完全可重现。

  • 返回对应于最后一次训练迭代的网络。这可以确保公平比较经过训练的网络。

  • 在 GPU 上训练网络。默认情况下,trainnet 函数使用 GPU(如果有)。在 GPU 上进行训练需要 Parallel Computing Toolbox™ 许可证和受支持的 GPU 设备。有关受支持设备的信息,请参阅GPU 计算要求 (Parallel Computing Toolbox)

  • 禁用所有可视化。

options = trainingOptions("adam", ...
    MaxEpochs=5, ...
    MiniBatchSize=500, ...
    ValidationData=dsVal, ...
    ValidationPatience=5, ...
    OutputNetwork="last-iteration", ...
    ExecutionEnvironment="gpu", ...
    Verbose=false);

检查是否选择了 GPU 及其是否可用于训练。

gpu = gpuDevice;
disp(gpu.Name + " selected.")
NVIDIA RTX A5000 selected.

训练网络两次并比较结果

使用 trainnet 函数训练网络两次。为了确保随机数生成不会影响训练,请在训练之前分别使用 rnggpurng (Parallel Computing Toolbox) 函数在 CPU 和 GPU 上设置随机数生成器和种子。

rng("default")
gpurng("default")
net1 = trainnet(dsTrain,layers,"mse",options);

rng("default")
gpurng("default")
net2 = trainnet(dsTrain,layers,"mse",options);

检查已训练网络的可学习参数是否相等。由于训练使用非确定性算法,因此两个网络的可学习参数不同。

isequal(net1.Learnables.Value,net2.Learnables.Value)
ans = logical
   0

绘制第一次训练运行和第二次训练运行的第一个卷积层权重之间的差异。绘图显示两个网络的权重存在微小差异。

learnablesDiff = net1.Learnables.Value{1}(:) - net2.Learnables.Value{1}(:);
learnablesDiff = extractdata(learnablesDiff);

figure
bar(learnablesDiff)
ylabel("Difference in Weight Value")
xlabel("Learnable Parameter Number")

设置确定性选项并训练网络

使用 deep.gpu.deterministicAlgorithms 函数将 GPU 确定性状态设置为 true,并捕获先前的 GPU 确定性状态,以便稍后还原。对 GPU 深度学习运算的所有后续调用都仅使用确定性算法。

previousState = deep.gpu.deterministicAlgorithms(true);

使用 trainnet 函数训练网络两次,每次都设置 CPU 和 GPU 随机数生成器和种子。只使用确定性算法可能会减慢训练和推断速度。

rng("default")
gpurng("default")
net3 = trainnet(dsTrain,layers,"mse",options);

rng("default")
gpurng("default")
net4 = trainnet(dsTrain,layers,"mse",options);

检查已训练网络的可学习参数是否相等。由于只使用了确定性算法,因此两个网络的可学习参数相等。

isequal(net3.Learnables.Value,net4.Learnables.Value)
ans = logical
   1

绘制第一次训练运行和第二次训练运行的第一个卷积层权重之间的差异。绘图显示两个网络的权重没有差异。

learnablesDiff = net3.Learnables.Value{1}(:) - net4.Learnables.Value{1}(:);
learnablesDiff = extractdata(learnablesDiff);

figure
bar(learnablesDiff)
ylabel("Difference in Weight Value")
xlabel("Learnable Parameter Number")

将 GPU 确定性状态还原为其原始值。

deep.gpu.deterministicAlgorithms(previousState);

另请参阅

| | (Parallel Computing Toolbox) | |

主题