dlaccelerate
为定制训练循环加速深度学习功能
描述
使用dlaccelerate
加速自定义训练循环的深度学习函数评估。
返回的AcceleratedFunction
对象缓存对底层函数的调用跟踪,并在再次出现相同的输入模式时重用缓存的结果。
试着用dlaccelerate
对于函数调用:
是长时间运行的
有
dlarray
对象、结构dlarray
对象,或dlnetwork
对象作为输入没有副作用,如写入文件或显示输出
像调用底层函数一样调用加速函数。注意,加速函数不是一个函数句柄。
请注意
当使用dlfeval
功能,软件自动加速向前
而且预测
功能dlnetwork
输入。如果你加速一个深度学习函数,其中大部分计算发生在调用向前
或预测
功能dlnetwork
输入,那么你可能看不到训练时间的改善。
有关更多信息,请参见自定义训练循环的深度学习函数加速.
创建一个accfun
= dlaccelerate (有趣的
)AcceleratedFunction
对象,该对象保留指定函数句柄的基础跟踪有趣的
.
谨慎
一个AcceleratedFunction
对象不知道底层函数的更新。方法修改与加速函数关联的函数,则使用clearCache
对象函数,或者使用该命令明确的功能
.
例子
加速模型梯度函数
加载dlnetwork
MAT文件中的对象和类名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);结束
清除加速函数的缓存
加载dlnetwork
MAT文件中的对象和类名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 +噪声;结束
输入参数
有趣的
- - - - - -深度学习功能
函数处理
输出参数
accfun
-加速深度学习功能
AcceleratedFunction
对象
加速深度学习功能,返回为AcceleratedFunction
对象。
更多关于
加速度的考虑
由于缓存跟踪的性质,并非所有函数都支持加速。金宝app
缓存过程可以缓存您可能希望更改的值或依赖于外部因素的值。当加速函数时,你必须小心:
是否有随机或频繁变化的值的输入
输出值经常变化
生成随机数
使用
如果
语句和而
的值作为条件的循环dlarray
对象输入是句柄还是依赖句柄
从外部源读取数据(例如,通过使用数据存储或
minibatchqueue
对象)
由于缓存过程需要额外的计算,在某些情况下,加速会导致代码运行时间更长。当软件花费时间创建不经常重用的新缓存时,就会发生这种情况。例如,当您将多个不同序列长度的小批量传递给该函数时,软件将为每个独特的序列长度触发一个新的跟踪。
加速函数只能在计算新轨迹时执行以下操作。
修改全局状态,如随机数流或全局变量
使用文件输入或输出
使用图形或命令行显示显示数据
当并行使用加速函数时,例如当使用parfor
循环,然后每个worker维护自己的缓存。缓存没有传输给主机。
加速函数中使用的函数和自定义层也必须支持加速。金宝app
有关更多信息,请参见自定义训练循环的深度学习函数加速.
dlode45
何时不支持加速金宝appGradientMode
是“直接”
的dlaccelerate
函数不支持加速金宝appdlode45
函数,当GradientMode
选择是“直接”
.方法加速调用的代码dlode45
函数,设置GradientMode
选项“伴随”
或加速未调用dlode45
函数与GradientMode
选项设置为“直接”
.
版本历史
R2021a中引入
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。