При использовании dlfeval
функция в пользовательском учебном цикле, программное обеспечение прослеживает каждый вход dlarray
объект градиентов модели функционирует, чтобы определить график расчета, используемый для автоматического дифференцирования. Этот процесс трассировки может занять время и может провести время, повторно вычисляя ту же трассировку. Путем оптимизации, кэшируясь и снова используя трассировки, можно ускорить расчет градиента в функциях глубокого обучения. Можно также оптимизировать, кэшироваться, и трассировки повторного использования, чтобы ускорить другие функции глубокого обучения, которые не требуют автоматического дифференцирования, например, можно также ускорить функции модели и функции, используемые для предсказания.
Чтобы ускорить вызовы функций глубокого обучения, можно использовать dlaccelerate
функция, чтобы создать AcceleratedFunction
возразите, что автоматически оптимизирует, кэши, и снова использует трассировки. Можно использовать dlaccelerate
функция, чтобы ускорить функции модели и градиенты модели функционирует непосредственно.
Возвращенный AcceleratedFunction
объектные кэши трассировки вызовов базовой функции и повторных использований кэшируемый результат, когда тот же входной набор повторяется.
Попытайтесь использовать dlaccelerate
для вызовов функции, что:
продолжительны
имейте dlarray
объекты, структуры dlarray
объекты или dlnetwork
объекты как входные параметры
не имейте побочных эффектов как запись в файлы или отображение вывода
Вызовите ускоренную функцию, как вы вызвали бы базовую функцию. Обратите внимание на то, что ускоренная функция не является указателем на функцию.
Примечание
При использовании dlfeval
функция, программное обеспечение автоматически ускоряется forward
и predict
функции для dlnetwork
входной параметр. Если вы ускоряете функцию глубокого обучения, где большинство расчета происходит в вызовах forward
или predict
функции для dlnetwork
введите, затем вы не можете видеть улучшение в учебное время.
Из-за природы кэширования трассировок не все функции поддерживают ускорение.
Процесс кэширования может кэшировать значения, которые вы можете ожидать изменять или которые зависят от внешних факторов. Необходимо заботиться при ускорении функций что:
имейте входные параметры со случайными или часто изменяющимися значениями
имейте выходные параметры с часто изменяющимися значениями
генерация случайных чисел
используйте if
операторы и while
циклы с условиями, которые зависят от значений dlarray
объекты
имейте входные параметры, которые являются указателями или которые зависят от указателей
Считайте данные из внешних источников (например, при помощи datastore или minibatchqueue
объект
Ускоренные функции могут сделать следующее при вычислении новой трассировки только.
измените глобальное состояние такой как, поток случайных чисел или глобальные переменные
используйте ввод или вывод файла
отобразите данные с помощью графики или отображения командной строки
При использовании ускоренных функций параллельно, такой как тогда, когда с помощью parfor
цикл, затем каждый рабочий обеспечивает его собственный кэш. Кэш не передается хосту.
Функции и пользовательские слои, используемые в ускоренных функциях, должны также поддержать ускорение.
Можно вложить и рекурсивно вызвать ускоренные функции. Однако обычно более эффективно иметь одну ускоренную функцию.
В большинстве случаев можно ускориться, глубокое обучение функционирует непосредственно. Например, можно ускориться, градиенты модели функционируют непосредственно, заменяя вызовы функции градиентов модели с вызовами соответствующей ускоренной функции:
Рассмотрите следующее использование dlfeval
функция в пользовательском учебном цикле.
[gradients,state,loss] = dlfeval(@modelGradients,parameters,dlX,dlT,state)
dlaccelerate
функционируйте и оцените возвращенный AcceleratedFunction
объект:accfun = dlaccelerate(@modelGradients); [gradients,state,loss] = dlfeval(accfun,parameters,dlX,dlT,state)
Поскольку кэшируемые трассировки непосредственно не присоединены к AcceleratedFunction
возразите и что они совместно используются AcceleratedFunction
объекты, которые используют ту же базовую функцию, можно создать AcceleratedFunction
или в или перед пользовательским учебным телом цикла.
Если функция глубокого обучения не полностью поддерживает ускорение, например, функции, которые требуют if
оператор с условием, которое зависит от значения dlarray
объект, затем можно ускориться, части функции глубокого обучения путем создания отдельной функции содержит любые поддерживаемые вызовы функции, которые вы хотите ускорить.
Например, рассмотрите следующий фрагмент кода, который вызывает различные функции в зависимости от ли сумма dlarray
объект dlX
является отрицательным или неотрицательным.
if sum(dlX,'all') < 0 dlX = negFun1(parameters,dlX); dlX = negFun2(parameters,dlX); else dlX = posFun1(parameters,dlX); dlX = posFun2(parameters,dlX); end
Поскольку if
оператор зависит от значения dlarray
объект, функция, которая содержит этот фрагмент кода, не поддерживает ускорение. Однако, если блоки кода, используемые в теле if
ускорение поддержки оператора, затем можно ускорить эти части отдельно путем создания новой функции, содержащей те блоки и ускоряющей новые функции вместо этого.
Например, создайте функции negFunAll
и posFunAll
это содержит блоки кода, используемые в теле if
оператор.
function dlX = negFunAll(parameters,dlX) dlX = negFun1(parameters,dlX); dlX = negFun2(parameters,dlX); end function dlX = posFunAll(parameters,dlX) dlX = posFun1(parameters,dlX); dlX = posFun2(parameters,dlX); end
if
оператор вместо этого.accfunNeg = dlaccelerate(@negFunAll) accfunPos = dlaccelerate(@posFunAll) if sum(dlX,'all') < 0 dlX = accfunNeg(parameters,dlX); else dlX = accfunPos(parameters,dlX); end
Многократное использование кэшируемой трассировки зависит от входных параметров функции и выходных параметров:
Для любого dlarray
объект или структура dlarray
возразите входным параметрам, трассировка зависит от размера, формата и базового типа данных dlarray
. Таким образом, ускоренная функция инициировала новую трассировку для dlarray
входные параметры с размером, форматом или базовым типом данных, не содержавшимся в кэше. Любой dlarray
входные параметры, отличающиеся только значением к ранее кэшируемой трассировке, не инициировали новую трассировку.
Для любого dlnetwork
входные параметры, трассировка зависит от размера, формата и базового типа данных dlnetwork
состояние и настраиваемые параметры. Таким образом, ускоренная функция инициировала новую трассировку для dlnetwork
входные параметры с настраиваемыми параметрами или состояние с размером, форматом и базовым типом данных, не содержавшимся в кэше. Любой dlnetwork
входные параметры, отличающиеся только значением состояния и настраиваемых параметров к ранее кэшируемой трассировке, не инициировали новую трассировку.
Для других типов входа трассировка зависит от значений входа. Таким образом, ускоренная функция инициировала новую трассировку для других типов входа со значением, не содержавшимся в кэше. Любые другие входные параметры, которые имеют то же значение как ранее кэшируемая трассировка, не инициировали новую трассировку.
Трассировка зависит от количества функциональных выходных параметров. Таким образом, ускоренная функция инициировала новую трассировку для вызовов функции с ранее невидимыми количествами выходных аргументов. Любые вызовы функции с тем же количеством выходных аргументов как ранее кэшируемая трассировка не инициировали новую трассировку.
Когда необходимо, кэши программного обеспечения любые новые трассировки путем выполнения базовой функции и кэширования получившейся трассировки в AcceleratedFunction
объект.
Внимание
AcceleratedFunction
объект не знает об обновлениях базовой функции. Если вы изменяете функцию, сопоставленную с ускоренной функцией, то очистите кэш с помощью clearCache
возразите функции или альтернативно используйте команду clear functions
.
AcceleratedFunction
объекты хранят кэш в очереди:
Программное обеспечение добавляет новые трассировки в конец очереди.
Когда кэш полон, программное обеспечение отбрасывает кэшируемый элемент во главе очереди.
Когда кэш снова используется, программное обеспечение перемещает кэшируемый элемент к концу очереди. Это помогает, препятствует тому, чтобы программное обеспечение отбросило обычно снова используемые кэшируемые элементы.
AcceleratedFunction
объекты непосредственно не содержат кэш. Это означает что:
Несколько AcceleratedFunction
объекты, которые имеют ту же базовую функцию, совместно используют тот же кэш.
Очистка или перезапись переменной, содержащей AcceleratedFunction
объект не очищает кэш.
Перезапись переменной, содержащей AcceleratedFunction
с другим AcceleratedFunction
с той же базовой функцией не очищает кэш.
Ускоренные функции, которые имеют ту же базовую функцию, совместно используют тот же кэш.
Чтобы очистить кэш от ускоренной функции, используйте clearCache
объектная функция. В качестве альтернативы можно очистить все функции в текущем MATLAB® сеанс с помощью команд clear functions
или clear all
.
Примечание
Очистка AcceleratedFunction
переменная не очищает кэш, сопоставленный с функцией ввода. Очистить кэш для AcceleratedFunction
возразите, что больше не существует в рабочей области, создайте новый AcceleratedFunction
возразите против той же функции и используйте clearCache
функция на новом объекте. В качестве альтернативы можно очистить все функции в текущем сеансе работы с MATLAB с помощью команд clear functions
или clear all
.
Из-за природы кэширования трассировок не все функции поддерживают ускорение.
Процесс кэширования может кэшировать значения, которые вы можете ожидать изменять или которые зависят от внешних факторов. Необходимо заботиться при ускорении функций что:
имейте входные параметры со случайными или часто изменяющимися значениями
имейте выходные параметры с часто изменяющимися значениями
генерация случайных чисел
используйте if
операторы и while
циклы с условиями, которые зависят от значений dlarray
объекты
имейте входные параметры, которые являются указателями или которые зависят от указателей
Считайте данные из внешних источников (например, при помощи datastore или minibatchqueue
объект
Ускоренные функции могут сделать следующее при вычислении новой трассировки только.
измените глобальное состояние такой как, поток случайных чисел или глобальные переменные
используйте ввод или вывод файла
отобразите данные с помощью графики или отображения командной строки
При использовании ускоренных функций параллельно, такой как тогда, когда с помощью parfor
цикл, затем каждый рабочий обеспечивает его собственный кэш. Кэш не передается хосту.
Функции и пользовательские слои, используемые в ускоренных функциях, должны также поддержать ускорение.
Необходимо заботиться при ускорении функций, которые принимают случайные или часто изменяющиеся значения, как введено, такие как функция градиентов модели, которая берет случайный шум в качестве входа и добавляет его во входные данные. Если какими-либо случайными или часто изменяющимися входными параметрами к ускоренной функции не является dlarray
объекты, затем функция инициировала новую трассировку для каждого ранее невидимого значения.
Можно проверять на сценарии как это путем осмотра Occupancy
и HitRate
свойства AcceleratedFunction
объект. Если Occupancy
свойство высоко и HitRate
является низким, затем это может указать что AcceleratedFunction
объект создает много новых трассировок, которые он не снова использует.
Для dlarray
объектный вход, изменения в значении, чтобы не инициировать новые трассировки. Чтобы препятствовать тому, чтобы часто вход изменения инициировал новые трассировки для каждой оценки, осуществите рефакторинг свой код, таким образом, что случайными входными параметрами является dlarray
входные параметры.
Например, рассмотрите функцию градиентов модели, которая принимает случайный массив шумовых значений:
function [gradients,state,loss] = modelGradients(parameters,dlX,dlT,state,noise) dlX = dlX + noise; [dlYPred,state] = model(parameters,dlX,state); loss = crossentropy(dlYPred,dlT); gradients = dlgradient(loss,parameters); end
Чтобы ускорить эту функцию градиентов модели, преобразуйте вход noise
к dlarray
прежде, чем выполнить ускоренную функцию. Поскольку modelGradients
функционируйте также поддерживает dlarray
введите для шума, вы не должны вносить изменения в функцию.
noise = dlarray(noise,'SSCB');
accfun = dlaccelerate(@modelGradients);
[gradients,state,loss] = dlfeval(accfun,parameters,dlX,dlT,state,noise);
В качестве альтернативы можно ускорить части функции градиентов модели, которые не требуют случайного входа.
Необходимо заботиться при ускорении функций, которые используют генерацию случайных чисел, такую как функция градиентов модели, которая генерирует случайный шум, чтобы добавить к сетевому входу. При кэшировании трассировки функции, которая генерирует случайные числа, которые не являются dlarray
объекты, ускоренные функциональные кэши, приводящие случайные числа к трассировке. При многократном использовании трассировки ускоренная функция использует кэшируемые случайные значения. Ускоренная функция не генерирует новые случайные значения.
Генерация случайных чисел с помощью 'like'
опция rand
функция с dlarray
ускорение поддержки объектов. Чтобы использовать генерацию случайных чисел в ускоренной функции, гарантируйте, что функция использует rand
функция с 'like'
набор опции к прослеженному dlarray
объект (dlarray
объект, который зависит от входа dlarray
объект.
Например, рассмотрите следующую функцию градиентов модели.
[gradients,state,loss] = modelGradients(parameters,dlX,dlT,state)
sz = size(dlX);
noise = rand(sz);
dlX = dlX + noise;
[dlYPred,state] = model(parameters,dlX,state);
loss = crossentropy(dlYPred,dlT);
gradients = dlgradient(loss,parameters);
end
Гарантировать что rand
функция генерирует новое значение для каждой оценки, используйте 'like'
опция с прослеженным dlarray
объект dlX
.
[gradients,state,loss] = modelGradients(parameters,dlX,dlT,state) sz = size(dlX); noise = rand(sz,'like',dlX); dlX = dlX + noise; [dlYPred,state] = model(parameters,dlX); loss = crossentropy(dlYPred,dlT); gradients = dlgradient(loss,parameters); end
В качестве альтернативы можно ускорить части функции градиентов модели, которые не требуют генерации случайных чисел.
if
Операторы и while
ЦиклыНеобходимо заботиться при ускорении функций то использование if
операторы и while
циклы. В частности, if
операторы и while
циклы поддерживают ускорение только, когда условия не зависят от значений dlarray
объекты.
Попытка ускорить функции, которые имеют if
операторы и while
циклы с условиями, которые зависят от dlarray
значения могут привести к неожиданному поведению. Когда ускоренные функциональные кэши новая трассировка, если трассировка содержит if
оператор или while
условие цикла, которое зависит от значения dlarray
объект, затем функциональные кэши трассировка получившегося пути выполнения кода, данного if
оператор или while
цикл для того значения. Поскольку изменения в значении dlarray
введите не инициировали новую трассировку, снова используя трассировку, функция использует ту же кэшируемую трассировку (который представляет тот же путь выполнения кода), даже когда различие в значении может привести к различному пути выполнения кода.
Использовать if
операторы и while
циклы, которые зависят от dlarray
объектные значения, ускорьте тело if
оператор или while
цикл только.
Необходимо заботиться при ускорении функций, которые берут объекты, которые зависят от указателей, как введено, таких как minibatchqueue
объект, который имеет функцию предварительной обработки, определил функцией указатель. AcceleratedFunction
возразите выдает ошибку при выполнении функции с входными параметрами в зависимости от указателей.
Вместо этого можно ускорить части функции градиентов модели, которые не требуют входных параметров, которые зависят от указателей.
Необходимо заботиться при отладке ускоренных функций. Кэшируемые трассировки не поддерживают точки останова. При использовании ускоренных функций программное обеспечение достигает точек останова в базовой функции во время процесса трассировки только.
Чтобы отладить код в базовой функции с помощью точек останова, отключите ускорение путем установки Enabled
свойство к false
.
Чтобы отладить кэшируемые трассировки, можно сравнить выходные параметры ускоренных функций с выходными параметрами базовой функции путем установки CheckMode
свойство к 'tolerance'
.
dlode45
Не поддерживает ускорение когда GradientMode
"direct"
dlaccelerate
функция не поддерживает ускорение dlode45
функционируйте когда GradientMode
опцией является "direct"
. Получившаяся ускоренная функциональная сила возвращает неожиданные результаты. Ускорять код, который вызывает dlode45
функция, набор GradientMode
опция к "adjoint"
или ускорьте части своего кода, которые не вызывают dlode45
с GradientMode
набор опции к "direct"
.
dlaccelerate
| AcceleratedFunction
| clearCache
| dlarray
| dlgradient
| dlfeval