Ускорение функции глубокого обучения для пользовательских учебных циклов

При использовании 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".

Смотрите также

| | | | |

Похожие темы