主要内容

深度学习功能定制培训循环的加速

当使用dlfeval函数在一个自定义训练循环,软件每个输入痕迹dlarray对象模型的损失函数来确定计算图用于自动分化。这种跟踪过程可能需要一些时间,可以花时间再计算相同的痕迹。通过优化、缓存和重用的痕迹,可以加速梯度计算的深度学习功能。您还可以优化、缓存和重用痕迹加速其他深度学习功能,不需要自动分化,例如您还可以加速模型用于预测函数和函数。

加快调用深度学习函数,您可以使用dlaccelerate函数来创建一个AcceleratedFunction对象,自动优化、缓存和重用的痕迹。您可以使用dlaccelerate函数来加速模型函数和模型直接损失函数。

返回的AcceleratedFunction对象缓存调用底层函数的痕迹和重用缓存结果相同的输入模式时重新出现。

试着用dlaccelerate函数调用:

  • 是长时间运行的

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

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

调用函数一样调用底层函数的加速。注意,加速函数不是一个函数处理。

请注意

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

因为缓存痕迹的本质,并不是所有的功能都支持加速度。金宝app

缓存过程可以缓存值,你可能期望改变,或者取决于外部因素。你必须照顾当加速功能:

  • 有输入随机或经常变化的价值观

  • 与经常变化的输出价值观

  • 生成随机数

  • 使用如果语句和循环和条件,取决于的值dlarray对象

  • 输入,处理,或者取决于处理吗

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

因为缓存过程需要额外的计算、加速会导致在某些情况下再运行代码。这种情况可能发生在软件花时间创建新的缓存经常得不到重用。例如,当您传递多个mini-batches不同的序列长度的函数,每个独特的软件触发一个新的跟踪序列长度。

加速功能可以做以下时只计算一个新的跟踪。

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

  • 使用文件输入或输出

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

当使用并行加速功能,如在使用parfor循环,然后每个工人维护自己的缓存。缓存不转移到主机。

函数和自定义层用于加速函数也必须支持加速度。金宝app

您可以嵌套,递归地调用加速功能。然而,它通常是更有效有一个加速功能。

直接促进深度学习功能

在大多数情况下,您可以直接促进深度学习的功能。例如,您可以加快模型取代直接损失函数调用模型损失函数与调用相应的加速功能:

考虑以下的使用dlfeval函数在一个定制的培训循环。

(损失、渐变、状态)= dlfeval (@modelLoss、参数X, T,状态)
加速模型损失函数和评价加速功能,使用dlaccelerate函数和评价返回AcceleratedFunction对象:
accfun = dlaccelerate (@modelLoss);(损失、渐变、状态)= dlfeval (accfun、参数X, T,状态)

因为不是直接连接到缓存的痕迹AcceleratedFunction对象和它们之间共享AcceleratedFunction使用相同的底层函数的对象,您可以创建的AcceleratedFunction在循环体或之前定制的培训。

促进深度学习的部分功能

如果一个深度学习函数不完全支持加速度,例如,功能要求金宝app如果声明的条件取决于的价值dlarray的对象,那么你可以加速部分深度学习函数通过创建一个单独的函数包含任何受支持的函数调用你想加速。金宝app

例如,考虑下面的代码片段,调用不同的功能取决于之和dlarray对象X是消极的或负的。

如果总和(X,“所有”)< 0 Y = negFun1(参数X);Y Y = negFun2(参数);其他的X Y = posFun1(参数);Y Y = posFun2(参数);结束

因为如果声明的值取决于dlarray一个函数对象,包含这个代码片段不支持加速度。金宝app但是,如果代码块内部使用的主体如果声明支持加速度,然后金宝app你可以加速这些部分分别通过创建一个包含这些新功能块和加速新功能。

例如,创建功能negFunAllposFunAll包含代码块中使用的主体如果声明。

函数Y = negFunAll(参数,X) Y = negFun1(参数X);Y Y = negFun2(参数);结束函数Y = posFunAll(参数,X) Y = posFun1(参数X);Y Y = posFun2(参数);结束
然后,加速这些函数和使用他们的身体如果语句代替。
accfunNeg = dlaccelerate (@negFunAll) accfunPos = dlaccelerate (@posFunAll)如果总和(X,“所有”)< 0 Y = accfunNeg(参数X);其他的X Y = accfunPos(参数);结束

重用缓存

重用一个缓存跟踪取决于函数的输入和输出:

  • 对于任何dlarray对象或结构dlarray对象的输入,跟踪取决于大小,格式,和底层的数据类型dlarray。即加速函数触发一个新的跟踪dlarray输入与大小,格式,或潜在的数据类型不包含在缓存中。任何dlarray输入不同的价值只有通过先前缓存的跟踪不引发一个新的跟踪。

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

  • 对于其他类型的输入,跟踪取决于输入的值。即加速功能触发一个新的跟踪与价值不包含在其他类型的输入缓存。任何其他输入相同的值作为一个先前缓存的跟踪不引发一个新的跟踪。

  • 跟踪的数量取决于函数输出。即加速功能触发一个新的跟踪函数调用以前所未有的数量的输出参数。任何函数调用相同数量的输出参数作为一个先前缓存的跟踪不引发一个新的跟踪。

必要时,软件缓存任何新的痕迹通过评估底层函数和缓存结果跟踪AcceleratedFunction对象。

谨慎

一个AcceleratedFunction对象不知道更新底层函数。如果你修改函数与加速相关函数,然后清除缓存使用clearCache目标函数或者使用命令明确的功能

存储和清除缓存

AcceleratedFunction对象存储在一个队列缓存:

  • 该软件添加新队列后面的痕迹。

  • 当缓存已满,软件丢弃缓存项的队列。

  • 当缓存重用,软件将缓存项队列的后面。这有助于防止软件一般丢弃重用缓存条目。

AcceleratedFunction对象不直接持有缓存。这意味着:

  • 多个AcceleratedFunction对象有相同的底层函数共享相同的缓存。

  • 包含一个清算或覆盖一个变量AcceleratedFunction对象不清除缓存。

  • 覆盖一个包含一个变量AcceleratedFunction与另一个AcceleratedFunction使用相同的底层函数不清除缓存。

加速功能相同的底层函数共享相同的缓存。

清除缓存加速功能,使用clearCache对象的功能。或者,您可以清除所有在当前的MATLAB函数®会议使用的命令明确的功能清除所有

请注意

清理AcceleratedFunction变量不清楚缓存与输入函数相关联。为一个清除缓存AcceleratedFunction对象不再存在于工作区,创建一个新的AcceleratedFunction对象相同的功能和使用clearCache新对象的函数。或者,您可以清除所有功能在当前会话使用MATLAB命令明确的功能清除所有

加速度的考虑

因为缓存痕迹的本质,并不是所有的功能都支持加速度。金宝app

缓存过程可以缓存值,你可能期望改变,或者取决于外部因素。你必须照顾当加速功能:

  • 有输入随机或经常变化的价值观

  • 与经常变化的输出价值观

  • 生成随机数

  • 使用如果语句和循环和条件,取决于的值dlarray对象

  • 输入,处理,或者取决于处理吗

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

因为缓存过程需要额外的计算、加速会导致在某些情况下再运行代码。这种情况可能发生在软件花时间创建新的缓存经常得不到重用。例如,当您传递多个mini-batches不同的序列长度的函数,每个独特的软件触发一个新的跟踪序列长度。

加速功能可以做以下时只计算一个新的跟踪。

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

  • 使用文件输入或输出

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

当使用并行加速功能,如在使用parfor循环,然后每个工人维护自己的缓存。缓存不转移到主机。

函数和自定义层用于加速函数也必须支持加速度。金宝app

函数与随机输入或经常变化的值

时必须照顾加速功能,随机或经常变化的值作为输入,如损失函数模型,将随机噪声作为输入,并将其添加到输入数据。如果任何随机或经常变化的输入不加速功能dlarray对象,那么函数触发一个新的跟踪每个前所未有的价值。

你可以检查这样的场景通过检查入住率HitRate的属性AcceleratedFunction对象。如果入住率房地产是高的HitRate很低,那么这可能表明呢AcceleratedFunction对象创造了许多新的痕迹,它不重用。

dlarray对象输入值的变化不会触发新的痕迹。防止经常变化的输入触发为每个评估新的痕迹,重构你的代码,这样随机的输入dlarray输入。

例如,考虑模型的损失函数,它接受一个随机的噪声值:

函数(损失、渐变、状态)= modelLoss(参数X, T,状态,噪音)X = X +噪声;[Y,状态]=模型(参数X,状态);损失= crossentropy (Y, T);梯度= dlgradient(损失、参数);结束

加速这个模型损失函数,转换的输入噪音dlarray在评估之前加速功能。因为modelLoss功能也支持金宝appdlarray输入噪声,您不需要更改的功能。

噪音= dlarray(噪音,“SSCB”);accfun = dlaccelerate (@modelLoss);(损失、渐变、状态)= dlfeval (accfun、参数X, T,状态,噪音);

或者,你可以加速模型的部分损失函数,不需要随机输入。

函数随机数生成

加速时必须小心使用随机数生成函数,如函数生成随机噪声的输入。当软件缓存函数产生随机数的痕迹,不是dlarray缓存对象,软件生成的随机样本的痕迹。重用跟踪时,加速函数使用缓存的随机样本。加速功能不产生新的随机值。

随机数生成使用“喜欢”选择的兰德函数与一个dlarray对象支持加速度金宝app。使用随机数生成的加速功能,确保使用的函数兰德函数与“喜欢”选项设置为追踪dlarray对象(一个dlarray对象,它取决于一个输入dlarray对象)。

例如,考虑以下损失函数模型。

(损失、渐变、状态)= modelLoss(参数X, T,状态)深圳=大小(X);噪音=兰德(深圳);X = X +噪声;[Y,状态]=模型(参数X,状态);损失= crossentropy (Y, T);梯度= dlgradient(损失、参数);结束

以确保兰德为每一个评估函数生成一个新值,使用“喜欢”选择与追踪dlarray对象X

(损失、渐变、状态)= modelLoss(参数X, T,状态)深圳=大小(X);噪音=兰德(深圳,“喜欢”,X);X = X +噪声;[Y,状态]=模型(参数,X);损失= crossentropy (Y, T);梯度= dlgradient(损失、参数);结束

或者,你可以加速模型的部分损失函数,不需要生成随机数。

使用如果语句和循环

你必须注意当使用加速功能如果语句和循环。特别是,您可以得到意想不到的结果,当你加速功能如果语句或循环,产生不同的代码路径函数输入相同的大小和格式。

加速功能与如果语句或循环条件取决于函数的值输入或来自外部源的值(例如,随机数生成的结果)可能会导致意想不到的行为。当缓存一个新的跟踪加速功能,如果函数包含一个如果语句或循环,那么软件缓存所生成的代码路径的跟踪如果语句或循环条件,特定的痕迹。因为改变的价值dlarray输入不会引发新的跟踪,重用跟踪不同的值时,软件使用相同的缓存跟踪(包含相同的缓存代码路径),即使不同的值会导致一个不同的代码路径。

通常,包含加速功能如果语句或循环和条件,不依赖于函数的值输入或外部因素(例如,循环遍历元素数组中)不会导致意外行为。例如,因为大小的变化dlarray输入触发一个新的跟踪,当重用跟踪输入相同的大小、缓存的代码路径输入的大小保持一致,即使有差异值。

从缓存的代码路径,避免意想不到的行为如果语句,您可以重构你的代码,这样就决定了正确结果通过结合所有分支的结果和提取所需的解决方案。

例如,考虑这段代码。

如果tf Y = funcA (X);其他的Y = funcB (X);结束
支持加金宝app速,你可以用下面的代码替换它的形式。
Y = tf * funcA (X) + ~ tf * funcB (X);
另外,要避免不必要的乘法操作,您还可以使用这个替代。
Y =猫(3,funcA (X) funcB (X));Y = Y (:,:, (tf - tf));
请注意,这些技术可能导致更长时间的运行代码,因为他们需要执行的代码用于两个分支如果声明。

使用如果语句和循环依赖dlarray对象的值,加速的主体如果语句或循环。

函数输入取决于处理

加速时必须照顾函数依赖的对象句柄作为输入参数,如minibatchqueue对象有一个预处理函数指定为一个函数处理。的AcceleratedFunction对象时抛出一个错误评估函数与输入取决于处理。

相反,你可以加速模型的部分损失函数,不需要输入,取决于处理。

调试

你必须照顾当调试加速功能。缓存的痕迹不支持断点。金宝app当使用加速功能,软件达到破发点在底层函数只在跟踪过程中。

调试代码的底层函数使用断点,禁用加速度通过设置启用财产

调试缓存的痕迹,您可以比较输出的加速与底层函数的输出功能,通过设置CheckMode财产“宽容”

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

dlaccelerate功能不支持加速金宝appdlode45函数时,GradientMode选择是“直接”。加速调用的代码dlode45函数,设置GradientMode选项“伴随”或加速部分不调用的代码dlode45函数与GradientMode选项设置为“直接”

另请参阅

|||||

相关的话题