При использовании dlfeval функция в индивидуальном учебном цикле, программное обеспечение отслеживает каждый вход dlarray объект функции градиентов модели для определения расчетного графика, используемого для автоматического дифференцирования. Этот процесс трассировки может занять некоторое время и может потратить время на повторное вычисление одной и той же трассировки. Оптимизация, кэширование и повторное использование трасс позволяют ускорить вычисления градиента в функциях глубокого обучения. Можно также оптимизировать, кэшировать и повторно использовать трассировки для ускорения других функций глубокого обучения, которые не требуют автоматического дифференцирования, например, можно также ускорить функции модели и функции, используемые для прогнозирования.
Для ускорения вызовов функций глубокого обучения можно использовать dlaccelerate для создания функции AcceleratedFunction объект, который автоматически оптимизирует, кэширует и повторно использует трассировки. Вы можете использовать dlaccelerate функция для непосредственного ускорения функций модели и функций градиентов модели.
Возвращенный AcceleratedFunction объект кэширует следы вызовов базовой функции и повторно использует кэшированный результат при повторном возникновении одного и того же шаблона ввода.
Попробуйте использовать dlaccelerate для вызовов функций, которые:
являются длительными
имеют dlarray объекты, сооружения dlarray объекты, или dlnetwork объекты в качестве входных данных
не имеют побочных эффектов, таких как запись в файлы или отображение выходных данных
Вызовите ускоренную функцию так же, как и базовую функцию. Обратите внимание, что ускоренная функция не является дескриптором функции.
Примечание
При использовании dlfeval функция, программное обеспечение автоматически ускоряет forward и predict функции для dlnetwork вход. Если вы ускоряете функцию глубокого обучения, где большая часть вычислений происходит в вызовах forward или predict функции для dlnetwork ввод, то вы можете не увидеть улучшения во времени обучения.
Из-за характера кэширования следов не все функции поддерживают ускорение.
Процесс кэширования может кэшировать значения, которые можно изменить или которые зависят от внешних факторов. При ускорении функций необходимо следить за тем, чтобы:
иметь входные данные со случайными или часто изменяющимися значениями
иметь выходы с часто меняющимися значениями
генерировать случайные числа
использовать if заявления и while контуры с условиями, зависящими от значений dlarray объекты
имеют входы, которые являются ручками или зависят от ручек
Считывание данных из внешних источников (например, с помощью хранилища данных или 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 объекты
имеют входы, которые являются ручками или зависят от ручек
Считывание данных из внешних источников (например, с помощью хранилища данных или 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 объект (a 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 input не запускают новую трассировку, при повторном использовании трассировки функция использует ту же кэшированную трассировку (которая представляет тот же кодовый путь), даже если разница в значении может привести к другому кодовому пути.
Использовать if заявления и while петли, которые зависят от dlarray значения объектов, ускорение тела if заявление или while только цикл.
Необходимо соблюдать осторожность при ускорении функций, которые принимают объекты, зависящие от дескрипторов, в качестве входных данных, таких как minibatchqueue объект, имеющий функцию предварительной обработки, заданную как дескриптор функции. AcceleratedFunction объект выдает ошибку при вычислении функции с входами в зависимости от дескрипторов.
Вместо этого можно ускорить части функции градиентов модели, для которых не требуются входные данные, зависящие от маркеров.
При отладке ускоренных функций необходимо соблюдать осторожность. Кэшированные трассировки не поддерживают точки разрыва. При использовании ускоренных функций программа достигает точек разрыва в базовой функции только в процессе трассировки.
Чтобы отладить код в базовой функции с помощью точек останова, отключите ускорение, установив Enabled свойство для false.
Чтобы отладить кэшированные трассировки, можно сравнить выходы ускоренных функций с выходами базовой функции, установив CheckMode свойство для 'tolerance'.
AcceleratedFunction | clearCache | dlaccelerate | dlarray | dlfeval | dlgradient