主要内容

dlaccelerate

为定制训练循环加速深度学习功能

    描述

    使用dlaccelerate加速自定义训练循环的深度学习函数评估。

    返回的AcceleratedFunction对象缓存对底层函数的调用跟踪,并在再次出现相同的输入模式时重用缓存的结果。

    试着用dlaccelerate对于函数调用:

    • 是长时间运行的

    • dlarray对象、结构dlarray对象,或dlnetwork对象作为输入

    • 没有副作用,如写入文件或显示输出

    像调用底层函数一样调用加速函数。注意,加速函数不是一个函数句柄。

    请注意

    当使用dlfeval功能,软件自动加速向前而且预测功能dlnetwork输入。如果你加速一个深度学习函数,其中大部分计算发生在调用向前预测功能dlnetwork输入,那么你可能看不到训练时间的改善。

    有关更多信息,请参见自定义训练循环的深度学习函数加速

    例子

    accfun= dlaccelerate (有趣的创建一个AcceleratedFunction对象,该对象保留指定函数句柄的基础跟踪有趣的

    谨慎

    一个AcceleratedFunction对象不知道底层函数的更新。方法修改与加速函数关联的函数,则使用clearCache对象函数,或者使用该命令明确的功能

    例子

    全部折叠

    加载dlnetworkMAT文件中的对象和类名dlnetDigits.mat

    S =负载(“dlnetDigits.mat”);Net = s.net;classNames = s.classNames;

    加速模型损失函数modelLoss在示例末尾列出。

    fun = @modelLoss;Accfun = dlaccelerate(fun);

    方法清除先前缓存的加速函数的跟踪clearCache函数。

    clearCache (accfun)

    查看加速函数的性质。因为缓存是空的,所以入住率属性为0。

    accfun
    accfun =加速功能与属性:功能:@modelLoss启用:1 CacheSize: 50 HitRate: 0占用:0 CheckMode: 'none' CheckTolerance: 1.0000 -04

    返回的AcceleratedFunction对象存储底层函数调用的跟踪,并在再次出现相同的输入模式时重用缓存的结果。要在自定义训练循环中使用加速函数,请将对模型梯度函数的调用替换为对加速函数的调用。可以像调用底层函数一样调用加速函数。注意,加速函数不是一个函数句柄。

    计算随机数据下的加速模型梯度函数dlfeval函数。

    X =兰特(28,28,1,128,“单身”);X = dlarray(X,“SSCB”);T = categorical(classNames(randi(10,[128 1])));T = onehotencode(T,2)';T = dlarray(T,“CB”);[loss,gradients,state] = dlfeval(accfun,net,X,T);

    查看入住率加速函数的性质。因为函数已经求值,所以缓存是非空的。

    accfun。入住率
    Ans = 2

    模型损失函数

    modelLoss函数的参数为dlnetwork对象,一小批输入数据X有相应的目标标签T并返回损失,关于可学习参数的损失梯度,表示网络状态。要计算梯度,请使用dlgradient函数。

    函数[Y,state] = forward(net,X);损失=交叉熵(Y,T);gradients = dlgradient(loss,net.Learnables);结束

    加载dlnetworkMAT文件中的对象和类名dlnetDigits.mat

    S =负载(“dlnetDigits.mat”);Net = s.net;classNames = s.classNames;

    加速模型损失函数modelLoss在示例末尾列出。

    fun = @modelLoss;Accfun = dlaccelerate(fun);

    方法清除先前缓存的加速函数的跟踪clearCache函数。

    clearCache (accfun)

    查看加速函数的性质。因为缓存是空的,所以入住率属性为0。

    accfun
    accfun =加速功能与属性:功能:@modelLoss启用:1 CacheSize: 50 HitRate: 0占用:0 CheckMode: 'none' CheckTolerance: 1.0000 -04

    返回的AcceleratedFunction对象存储底层函数调用的跟踪,并在再次出现相同的输入模式时重用缓存的结果。要在自定义训练循环中使用加速函数,请将对模型梯度函数的调用替换为对加速函数的调用。可以像调用底层函数一样调用加速函数。注意,加速函数不是一个函数句柄。

    计算随机数据下的加速模型梯度函数dlfeval函数。

    X =兰特(28,28,1,128,“单身”);X = dlarray(X,“SSCB”);T = categorical(classNames(randi(10,[128 1])));T = onehotencode(T,2)';T = dlarray(T,“CB”);[loss,gradients,state] = dlfeval(accfun,net,X,T);

    查看入住率加速函数的性质。因为函数已经求值,所以缓存是非空的。

    accfun。入住率
    Ans = 2

    方法清除缓存clearCache函数。

    clearCache (accfun)

    查看入住率加速函数的性质。因为缓存已被清除,所以缓存为空。

    accfun。入住率
    Ans = 0

    模型损失函数

    modelLoss函数的参数为dlnetwork对象,一小批输入数据X有相应的目标标签T并返回损失,关于可学习参数的损失梯度,表示网络状态。要计算梯度,请使用dlgradient函数。

    函数[Y,state] = forward(net,X);损失=交叉熵(Y,T);gradients = dlgradient(loss,net.Learnables);结束

    这个例子展示了如何检查加速函数的输出是否与底层函数的输出匹配。

    在某些情况下,加速函数的输出与基础函数的输出不同。例如,当加速使用随机数生成的函数时,您必须小心,例如生成随机噪声以添加到网络输入的函数。当缓存生成非随机数的函数的跟踪时dlarray对象时,加速函数在跟踪中缓存产生的随机数。在重用跟踪时,加速函数使用缓存的随机值。加速函数不会产生新的随机值。

    要检查加速函数的输出是否与底层函数的输出匹配,请使用CheckMode加速函数的性质。当CheckMode加速函数的性质是“宽容”如果输出差异超过指定的公差,则加速函数抛出警告。

    加速函数myUn金宝appsupportedFun,在示例末尾使用dlaccelerate函数。这个函数myUn金宝appsupportedFun生成随机噪声并将其添加到输入。此函数不支持加速,因为该函数生成的随机数不支持金宝app加速dlarray对象。

    accfun = dlaccelerate(@myUn金宝appsupportedFun)
    accfun =加速功能与属性:功能:@myUnsupportedFun启用:1 CacheSize: 50 HitRat金宝appe: 0占用:0 CheckMode: 'none' CheckTolerance: 1.0000 -04

    方法清除以前缓存的任何跟踪clearCache函数。

    clearCache (accfun)

    要检查重用的缓存跟踪的输出是否与基础函数的输出匹配,请设置CheckMode财产“宽容”

    accfun。CheckMode =“宽容”
    accfun =加速功能与属性:功能:@myUnsupportedFun启用:1 CacheSize: 50 HitRat金宝appe: 0占用:0 CheckMode: 'tolerance' CheckTolerance: 1.0000 -04

    计算一个1数组作为输入的加速函数,指定为dlarray输入。

    dlX = dlarray(ones(3,3));dlY = accfun(dlX)
    dlY = 3×3 dlarray 1.8147 1.9134 1.2785 1.9058 1.6324 1.5469 1.1270 1.0975 1.9575

    用相同的输入再次计算加速函数。由于加速函数重用缓存的随机噪声值,而不是生成新的随机值,因此重用跟踪的输出与底层函数的输出不同。当CheckMode加速函数的性质是“宽容”如果输出不同,加速函数会抛出警告。

    dlY = accfun(dlX)
    警告:加速输出与底层函数输出不同。
    dlY = 3×3 dlarray 1.8147 1.9134 1.2785 1.9058 1.6324 1.5469 1.1270 1.0975 1.9575

    使用随机数生成“喜欢”选项兰德函数使用dlarray对象支持加速。金宝app若要在加速函数中使用随机数生成,请确保该函数使用兰德函数与“喜欢”选项设置为跟踪dlarray对象(一个dlarray对象,它依赖于输入dlarray对象)。

    加速函数my金宝appSupportedFun,在示例的末尾列出。这个函数my金宝appSupportedFun类生成噪声,从而向输入添加噪声“喜欢”带有跟踪的选项dlarray对象。

    accfun2 = dlaccelerate(@my金宝appSupportedFun);

    方法清除以前缓存的任何跟踪clearCache函数。

    clearCache (accfun2)

    要检查重用的缓存跟踪的输出是否与基础函数的输出匹配,请设置CheckMode财产“宽容”

    accfun2。CheckMode =“宽容”

    用与之前相同的输入对加速函数求值两次。因为重用缓存的输出与底层函数的输出匹配,所以加速函数不会抛出警告。

    dlY = accfun2(dlX)
    dlY = 3×3 dlarray 1.7922 1.0357 1.6787 1.9595 1.8491 1.7577 1.6557 1.9340 1.7431
    dlY = accfun2(dlX)
    dlY = 3×3 dlarray 1.3922 1.7060 1.0462 1.6555 1.0318 1.0971 1.1712 1.2769 1.8235

    检查输出是否匹配需要额外的处理,并增加函数计算所需的时间。检查输出后,设置CheckMode财产“没有”

    accfun1。CheckMode =“没有”;accfun2。CheckMode =“没有”

    例子函数

    这个函数myUn金宝appsupportedFun生成随机噪声并将其添加到输入。此函数不支持加速,因为该函数生成的随机数不支持金宝app加速dlarray对象。

    函数out = myUn金宝appsupportedFun(dlX) sz = size(dlX);噪声= rand(sz);out = dlX +噪声;结束

    这个函数my金宝appSupportedFun类生成噪声,从而向输入添加噪声“喜欢”带有跟踪的选项dlarray对象。

    函数out = my金宝appSupportedFun(dlX) sz = size(dlX);噪声= rand(sz,“喜欢”dlX);out = dlX +噪声;结束

    输入参数

    全部折叠

    深度学习的加速函数,指定为函数句柄。

    要了解关于开发用于加速的深度学习函数的更多信息,请参见自定义训练循环的深度学习函数加速

    例子:@modelLoss

    数据类型:function_handle

    输出参数

    全部折叠

    加速深度学习功能,返回为AcceleratedFunction对象。

    更多关于

    全部折叠

    加速度的考虑

    由于缓存跟踪的性质,并非所有函数都支持加速。金宝app

    缓存过程可以缓存您可能希望更改的值或依赖于外部因素的值。当加速函数时,你必须小心:

    • 是否有随机或频繁变化的值的输入

    • 输出值经常变化

    • 生成随机数

    • 使用如果语句和的值作为条件的循环dlarray对象

    • 输入是句柄还是依赖句柄

    • 从外部源读取数据(例如,通过使用数据存储或minibatchqueue对象)

    由于缓存过程需要额外的计算,在某些情况下,加速会导致代码运行时间更长。当软件花费时间创建不经常重用的新缓存时,就会发生这种情况。例如,当您将多个不同序列长度的小批量传递给该函数时,软件将为每个独特的序列长度触发一个新的跟踪。

    加速函数只能在计算新轨迹时执行以下操作。

    • 修改全局状态,如随机数流或全局变量

    • 使用文件输入或输出

    • 使用图形或命令行显示显示数据

    当并行使用加速函数时,例如当使用parfor循环,然后每个worker维护自己的缓存。缓存没有传输给主机。

    加速函数中使用的函数和自定义层也必须支持加速。金宝app

    有关更多信息,请参见自定义训练循环的深度学习函数加速

    dlode45何时不支持加速金宝appGradientMode“直接”

    dlaccelerate函数不支持加速金宝appdlode45函数,当GradientMode选择是“直接”.方法加速调用的代码dlode45函数,设置GradientMode选项“伴随”或加速未调用dlode45函数与GradientMode选项设置为“直接”

    版本历史

    R2021a中引入