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
    

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

    The 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
    

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

    The 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
    
    

    Очистить все ранее кэшированные трассировки с помощью 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);

    Очистить все ранее кэшированные трассировки с помощью 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 цикл, затем каждый рабочий процесс поддерживает свой собственный кэш. Кэш не передается узлу.

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

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

    Введенный в R2021a