dlaccelerate

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

    Синтаксис

    Описание

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

    Возвращенный AcceleratedFunction объектные кэши трассировки вызовов базовой функции и повторных использований кэшируемый результат, когда тот же входной набор повторяется.

    Попытайтесь использовать dlaccelerate для вызовов функции, что:

    • продолжительны

    • имейте dlarray объекты, структуры dlarray объекты или dlnetwork объекты как входные параметры

    • не имейте побочных эффектов как запись в файлы или отображение вывода

    Вызовите ускоренную функцию, как вы вызвали бы базовую функцию. Обратите внимание на то, что ускоренная функция не является указателем на функцию.

    Примечание

    При использовании dlfeval функция, программное обеспечение автоматически ускоряется forward и predict функции для dlnetwork входной параметр. Если вы ускоряете функцию глубокого обучения, где большинство расчета происходит в вызовах forward или predict функции для dlnetwork введите, затем вы не можете видеть улучшение в учебное время.

    Для получения дополнительной информации смотрите Ускорение Функции Глубокого обучения для Пользовательских Учебных Циклов.

    пример

    accfun = dlaccelerate(fun) создает AcceleratedFunction объект, который сохраняет базовые трассировки заданного указателя на функцию fun.

    Внимание

    AcceleratedFunction объект не знает об обновлениях базовой функции. Если вы изменяете функцию, сопоставленную с ускоренной функцией, то очистите кэш с помощью clearCache возразите функции или альтернативно используйте команду clear functions.

    Примеры

    свернуть все

    Загрузите dlnetwork имена объектов и имена классов из файла MAT dlnetDigits.mat.

    s = load("dlnetDigits.mat");
    dlnet = s.dlnet;
    classNames = s.classNames;

    Ускорьтесь градиенты модели функционируют modelGradients перечисленный в конце примера.

    fun = @modelGradients;
    accfun = dlaccelerate(fun);

    Очистите любые ранее кэшируемые трассировки от ускоренной функции с помощью clearCache функция.

    clearCache(accfun)

    Просмотрите свойства ускоренной функции. Поскольку кэш пуст, Occupancy свойство 0.

    accfun
    accfun = 
      AcceleratedFunction with properties:
    
              Function: @modelGradients
               Enabled: 1
             CacheSize: 50
               HitRate: 0
             Occupancy: 0
             CheckMode: 'none'
        CheckTolerance: 1.0000e-04
    
    

    Возвращенный AcceleratedFunction объектно-ориентированная память трассировки базовых вызовов функции и повторных использований кэшируемый результат, когда тот же входной набор повторяется. Чтобы использовать ускоренную функцию в пользовательском учебном цикле, замените вызовы функции градиентов модели с вызовами ускоренной функции. Можно вызвать ускоренную функцию, как вы вызвали бы базовую функцию. Обратите внимание на то, что ускоренная функция не является указателем на функцию.

    Выполните ускоренную функцию градиентов модели со случайными данными с помощью dlfeval функция.

    X = rand(28,28,1,128,'single');
    dlX = dlarray(X,'SSCB');
    
    T = categorical(classNames(randi(10,[128 1])));
    T = onehotencode(T,2)';
    dlT = dlarray(T,'CB');
    
    [gradients,state,loss] = dlfeval(accfun,dlnet,dlX,dlT);

    Просмотрите Occupancy свойство ускоренной функции. Поскольку функция была выполнена, кэш непуст.

    accfun.Occupancy
    ans = 2
    

    Функция градиентов модели

    modelGradients функционируйте берет dlnetwork объект dlnet, мини-пакет входных данных dlX с соответствующей целью маркирует dlT и возвращает градиенты потери относительно настраиваемых параметров в dlnet, сетевое состояние и потеря. Чтобы вычислить градиенты, используйте dlgradient функция.

    function [gradients,state,loss] = modelGradients(dlnet,dlX,dlT)
    
    [dlYPred,state] = forward(dlnet,dlX);
    loss = crossentropy(dlYPred,dlT);
    gradients = dlgradient(loss,dlnet.Learnables);
    
    end

    Загрузите dlnetwork имена объектов и имена классов из файла MAT dlnetDigits.mat.

    s = load("dlnetDigits.mat");
    dlnet = s.dlnet;
    classNames = s.classNames;

    Ускорьтесь градиенты модели функционируют modelGradients перечисленный в конце примера.

    fun = @modelGradients;
    accfun = dlaccelerate(fun);

    Очистите любые ранее кэшируемые трассировки от ускоренной функции с помощью clearCache функция.

    clearCache(accfun)

    Просмотрите свойства ускоренной функции. Поскольку кэш пуст, Occupancy свойство 0.

    accfun
    accfun = 
      AcceleratedFunction with properties:
    
              Function: @modelGradients
               Enabled: 1
             CacheSize: 50
               HitRate: 0
             Occupancy: 0
             CheckMode: 'none'
        CheckTolerance: 1.0000e-04
    
    

    Возвращенный AcceleratedFunction объектно-ориентированная память трассировки базовых вызовов функции и повторных использований кэшируемый результат, когда тот же входной набор повторяется. Чтобы использовать ускоренную функцию в пользовательском учебном цикле, замените вызовы функции градиентов модели с вызовами ускоренной функции. Можно вызвать ускоренную функцию, как вы вызвали бы базовую функцию. Обратите внимание на то, что ускоренная функция не является указателем на функцию.

    Выполните ускоренную функцию градиентов модели со случайными данными с помощью dlfeval функция.

    X = rand(28,28,1,128,'single');
    dlX = dlarray(X,'SSCB');
    
    T = categorical(classNames(randi(10,[128 1])));
    T = onehotencode(T,2)';
    dlT = dlarray(T,'CB');
    
    [gradients,state,loss] = dlfeval(accfun,dlnet,dlX,dlT);

    Просмотрите Occupancy свойство ускоренной функции. Поскольку функция была выполнена, кэш непуст.

    accfun.Occupancy
    ans = 2
    

    Очистите кэш с помощью clearCache функция.

    clearCache(accfun)

    Просмотрите Occupancy свойство ускоренной функции. Поскольку кэш был очищен, кэш пуст.

    accfun.Occupancy
    ans = 0
    

    Функция градиентов модели

    modelGradients функционируйте берет dlnetwork объект dlnet, мини-пакет входных данных dlX с соответствующей целью маркирует dlT и возвращает градиенты потери относительно настраиваемых параметров в dlnet, сетевое состояние и потеря. Чтобы вычислить градиенты, используйте dlgradient функция.

    function [gradients,state,loss] = modelGradients(dlnet,dlX,flT)
    
    [dlYPred,state] = forward(dlnet,dlX);
    loss = crossentropy(dlYPred,flT);
    gradients = dlgradient(loss,dlnet.Learnables);
    
    end

    В этом примере показано, как проверять, что выходные параметры ускоренных функций совпадают с выходными параметрами базовой функции.

    В некоторых случаях выходные параметры ускоренных функций отличаются к выходным параметрам базовой функции. Например, необходимо заботиться при ускорении функций, которые используют генерацию случайных чисел, такую как функция, которая генерирует случайный шум, чтобы добавить к сетевому входу. При кэшировании трассировки функции, которая генерирует случайные числа, которые не являются dlarray объекты, ускоренные функциональные кэши, приводящие случайные числа к трассировке. При многократном использовании трассировки ускоренная функция использует кэшируемые случайные значения. Ускоренная функция не генерирует новые случайные значения.

    Чтобы проверять, что выходные параметры ускоренной функции совпадают с выходными параметрами базовой функции, используйте CheckMode свойство ускоренной функции. Когда CheckMode свойством ускоренной функции является 'tolerance' и выходные параметры отличаются больше, чем заданный допуск, ускоренная функция выдает предупреждение.

    Ускорьте функциональный myUnsupportedFun, перечисленный в конце примера с помощью dlaccelerate функция. Функциональный myUnsupportedFun генерирует случайный шум и добавляет его во вход. Эта функция не поддерживает ускорение, потому что функция генерирует случайные числа, которые не являются dlarray объекты.

    accfun = dlaccelerate(@myUnsupportedFun)
    accfun = 
      AcceleratedFunction with properties:
    
              Function: @myUnsupportedFun
               Enabled: 1
             CacheSize: 50
               HitRate: 0
             Occupancy: 0
             CheckMode: 'none'
        CheckTolerance: 1.0000e-04
    
    

    Cleare любые ранее кэшируемые трассировки с помощью clearCache функция.

    clearCache(accfun)

    Чтобы проверять, что выходные параметры снова использованных кэшируемых трассировок совпадают с выходными параметрами базовой функции, установите CheckMode свойство к 'tolerance'.

    accfun.CheckMode = 'tolerance'
    accfun = 
      AcceleratedFunction with properties:
    
              Function: @myUnsupportedFun
               Enabled: 1
             CacheSize: 50
               HitRate: 0
             Occupancy: 0
             CheckMode: 'tolerance'
        CheckTolerance: 1.0000e-04
    
    

    Выполните ускоренную функцию с массивом из единиц, как введено в виде dlarray входной параметр.

    dlX = dlarray(ones(3,3));
    dlY = accfun(dlX)
    dlY = 
      3x3 dlarray
    
        1.8147    1.9134    1.2785
        1.9058    1.6324    1.5469
        1.1270    1.0975    1.9575
    
    

    Выполните ускоренную функцию снова с тем же входом. Поскольку ускоренные функциональные повторные использования кэшируемые случайные шумовые значения вместо того, чтобы генерация новые случайные значения, выходные параметры снова использованной трассировки отличаются от выходных параметров базовой функции. Когда CheckMode свойством ускоренной функции является 'tolerance' и выходные параметры отличаются, ускоренная функция выдает предупреждение.

    dlY = accfun(dlX)
    Warning: Accelerated outputs differ from underlying function outputs.
    
    dlY = 
      3x3 dlarray
    
        1.8147    1.9134    1.2785
        1.9058    1.6324    1.5469
        1.1270    1.0975    1.9575
    
    

    Генерация случайных чисел с помощью 'like' опция rand функция с dlarray ускорение поддержки объектов. Чтобы использовать генерацию случайных чисел в ускоренной функции, гарантируйте, что функция использует rand функция с 'like' набор опции к прослеженному dlarray объект (dlarray объект, который зависит от входа dlarray объект.

    Ускорьте функциональный mySupportedFun, перечисленный в конце примера. Функциональный mySupportedFun добавляет шум к входу путем генерации шума с помощью 'like' опция с прослеженным dlarray объект.

    accfun2 = dlaccelerate(@mySupportedFun);

    Cleare любые ранее кэшируемые трассировки с помощью clearCache функция.

    clearCache(accfun2)

    Чтобы проверять, что выходные параметры снова использованных кэшируемых трассировок совпадают с выходными параметрами базовой функции, установите CheckMode свойство к 'tolerance'.

    accfun2.CheckMode = 'tolerance';

    Выполните ускоренную функцию дважды с тем же входом как прежде. Поскольку выходные параметры снова использованного кэша совпадают с выходными параметрами базовой функции, ускоренная функция не выдает предупреждение.

    dlY = accfun2(dlX)
    dlY = 
      3x3 dlarray
    
        1.7922    1.0357    1.6787
        1.9595    1.8491    1.7577
        1.6557    1.9340    1.7431
    
    
    dlY = accfun2(dlX)
    dlY = 
      3x3 dlarray
    
        1.3922    1.7060    1.0462
        1.6555    1.0318    1.0971
        1.1712    1.2769    1.8235
    
    

    Проверка выходного соответствия требует дополнительной обработки и увеличивает время, требуемое для вычисления функции. После проверки выходных параметров, набор CheckMode свойство к 'none'.

    accfun1.CheckMode = 'none';
    accfun2.CheckMode = 'none';

    Функции, взятые в качестве примера,

    Функциональный myUnsupportedFun генерирует случайный шум и добавляет его во вход. Эта функция не поддерживает ускорение, потому что функция генерирует случайные числа, которые не являются dlarray объекты.

    function out = myUnsupportedFun(dlX)
    
    sz = size(dlX);
    noise = rand(sz);
    out = dlX + noise;
    
    end

    Функциональный mySupportedFun добавляет шум к входу путем генерации шума с помощью 'like' опция с прослеженным dlarray объект.

    function out = mySupportedFun(dlX)
    
    sz = size(dlX);
    noise = rand(sz,'like',dlX);
    out = dlX + noise;
    
    end

    Входные параметры

    свернуть все

    Функция глубокого обучения, чтобы ускориться в виде указателя на функцию.

    Чтобы узнать больше о разработке функций глубокого обучения для ускорения, смотрите Ускорение Функции Глубокого обучения для Пользовательских Учебных Циклов.

    Пример: @modelGradients

    Типы данных: function_handle

    Выходные аргументы

    свернуть все

    Ускоренная функция глубокого обучения, возвращенная как AcceleratedFunction объект.

    Больше о

    свернуть все

    Ускоряющие факторы

    Из-за природы кэширования трассировок не все функции поддерживают ускорение.

    Процесс кэширования может кэшировать значения, которые вы можете ожидать изменять или которые зависят от внешних факторов. Необходимо заботиться при ускорении функций что:

    • имейте входные параметры со случайными или часто изменяющимися значениями

    • имейте выходные параметры с часто изменяющимися значениями

    • генерация случайных чисел

    • используйте if операторы и while циклы с условиями, которые зависят от значений dlarray объекты

    • имейте входные параметры, которые являются указателями или которые зависят от указателей

    • Считайте данные из внешних источников (например, при помощи datastore или minibatchqueue объект

    Ускоренные функции могут сделать следующее при вычислении новой трассировки только.

    • измените глобальное состояние такой как, поток случайных чисел или глобальные переменные

    • используйте ввод или вывод файла

    • отобразите данные с помощью графики или отображения командной строки

    При использовании ускоренных функций параллельно, такой как тогда, когда с помощью parfor цикл, затем каждый рабочий обеспечивает его собственный кэш. Кэш не передается хосту.

    Функции и пользовательские слои, используемые в ускоренных функциях, должны также поддержать ускорение.

    Для получения дополнительной информации смотрите Ускорение Функции Глубокого обучения для Пользовательских Учебных Циклов.

    dlode45 Не поддерживает ускорение когда GradientMode "direct"

    dlaccelerate функция не поддерживает ускорение dlode45 функционируйте когда GradientMode опцией является "direct". Получившаяся ускоренная функциональная сила возвращает неожиданные результаты. Ускорять код, который вызывает dlode45 функция, набор GradientMode опция к "adjoint" или ускорьте части своего кода, которые не вызывают dlode45 с GradientMode набор опции к "direct".

    Введенный в R2021a