exponenta event banner

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
    
    

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

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

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

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

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

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

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

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

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

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

    Представлен в R2021a