主要内容

AcceleratedFunction

加速深度学习功能

    描述

    一个AcceleratedFunction存储基础函数的跟踪

    重用缓存的跟踪依赖于函数的输入和输出:

    • 对于任何dlarray物体或结构dlarray对象输入时,跟踪取决于对象的大小、格式和底层数据类型dlarray.也就是说,加速函数触发一个新的跟踪dlarray缓存中不包含具有大小、格式或底层数据类型的输入。任何dlarray与以前缓存的跟踪仅值不同的输入不会触发新的跟踪。

    • 对于任何dlnetwork的大小、格式和底层数据类型dlnetwork状态和可学习参数。也就是说,加速函数触发一个新的跟踪dlnetwork具有可学习参数或状态的输入,其大小、格式和底层数据类型不包含在缓存中。任何dlnetwork输入只与先前缓存的跟踪的状态值和可学习参数不同,不会触发新的跟踪。

    • 对于其他类型的输入,跟踪取决于输入的值。也就是说,加速函数对缓存中不包含值的其他类型的输入触发新的跟踪。与以前缓存的跟踪值相同的任何其他输入都不会触发新的跟踪。

    • 跟踪取决于函数输出的数量。也就是说,加速函数使用以前看不到的输出参数数量触发对函数调用的新的跟踪。与先前缓存的跟踪具有相同数量输出参数的任何函数调用都不会触发新的跟踪。

    在必要时,软件通过计算底层函数并将结果跟踪缓存到AcceleratedFunction对象。

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

    试着用dlaccelerate对于这样的函数调用:

    • 是长时间运行的

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

    • 是否有写入文件或显示输出等副作用

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

    请注意

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

    谨慎

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

    创建

    创建一个AcceleratedFunction对象,则使用dlaccelerate函数。

    属性

    全部展开

    此属性是只读的。

    底层函数,指定为函数句柄。

    数据类型:function_handle

    标志以启用跟踪,指定为真正的

    数据类型:逻辑

    缓存大小,指定为正整数。

    缓存大小对应于要缓存的输入和输出组合的最大数量。

    数据类型:

    此属性是只读的。

    缓存命中率,指定为范围[0,100]中的标量。

    缓存命中率对应于重用计算的百分比。

    数据类型:

    此属性是只读的。

    缓存占用率,指定为范围[0,100]中的一个标量。

    缓存占用率对应于正在使用的缓存的百分比。

    数据类型:

    检查模式,指定为以下之一:

    • “没有”-不要检查加速结果。

    • “宽容”检查加速结果和基础函数的结果是否在给定的公差范围内CheckTolerance财产。如果值不在此容忍范围内,则函数抛出警告。

    校验公差,指定为正标量。

    如果CheckMode属性是“宽容”,则该函数检查加速结果和基础函数的结果是否在给定的公差范围内CheckTolerance财产。如果值不在此容忍范围内,则函数抛出警告。

    数据类型:

    对象的功能

    clearCache 清晰加速深度学习功能跟踪缓存

    例子

    全部折叠

    加载dlnetwork对象和类的名称dlnetDigits.mat

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

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

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

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

    clearCache (accfun)

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

    accfun
    accfun =带有属性的AcceleratedFunction: Function: @modelLoss Enabled: 1 CacheSize: 50 HitRate: 0 Occupancy: 0 CheckMode: 'none' CheckTolerance: 1.0000e-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,gradient,state] = dlfeval(accfun,net,X,T);

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

    accfun。入住率
    Ans = 2

    模型损失函数

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

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

    加载dlnetwork对象和类的名称dlnetDigits.mat

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

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

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

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

    clearCache (accfun)

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

    accfun
    accfun =带有属性的AcceleratedFunction: Function: @modelLoss Enabled: 1 CacheSize: 50 HitRate: 0 Occupancy: 0 CheckMode: 'none' CheckTolerance: 1.0000e-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,gradient,state] = dlfeval(accfun,net,X,T);

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

    accfun。入住率
    Ans = 2

    方法清除缓存clearCache函数。

    clearCache (accfun)

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

    accfun。入住率
    Ans = 0

    模型损失函数

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

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

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

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

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

    加速函数myUnsupportedFun的示例末尾列出了dlaccelerate函数。这个函数myUnsupportedFun产生随机噪声并将其添加到输入。此函数不支持加速,因为该函数生成不支持加速的随机数dlarray对象。

    accfun = dlaccelerate(@myUnsupportedFun)
    函数:@myUnsupportedFun启用:1 CacheSize: 50 HitRate: 0占用率:0 CheckMode: 'none' CheckTolerance: 1.0000e-04

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

    clearCache (accfun)

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

    accfun。CheckMode =“宽容”
    函数:@myUnsupportedFun启用:1 CacheSize: 50 HitRate: 0占用率:0 CheckMode: 'tolerance' CheckTolerance: 1.0000e-04

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

    dlX = darray (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对象支持加速。若要在加速函数中使用随机数生成,请确保该函数使用兰德函数“喜欢”选项设置为已跟踪dlarray对象(一个dlarray对象,它依赖于输入dlarray对象)。

    加速函数mySupportedFun,列在示例的末尾。这个函数mySupportedFun方法生成噪声,从而向输入添加噪声“喜欢”选项,该选项带有dlarray对象。

    accfun2 = dlaccelerate(@mySupportedFun);

    方法清除以前缓存的任何跟踪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 =“没有”

    例子函数

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

    函数out = myUnsupportedFun(dlX) sz = size(dlX);噪声= rand(sz);out = dlX +噪声;结束

    这个函数mySupportedFun方法生成噪声,从而向输入添加噪声“喜欢”选项,该选项带有dlarray对象。

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

    版本历史

    在R2021a中引入

    Baidu
    map