Я пытаюсь ускорить обучение некоторых нейронных сетей NARNET, используя поддержку графического процессора, которую вы получаете из набора инструментов для параллельных вычислений, но пока мне это не удалось. Вернее, он работает, но неоправданно медленно. Согласно документации обучение на GPU вместо CPU не должно быть сложнее, чем добавление оператора useGPU, да в команду обучения. Однако, если я просто создам некоторые фиктивные данные, например, синусоиду с 900 значениями, и обучу на ней NARNET, используя ЦП, вот так:

%CPU training
T = num2cell(sin(1:0.01:10));
net = narnet( 1:2, 10 ); 
[ Xs, Xsi, Asi, Ts] = preparets( net, {}, {}, T );
rng(0)
net.trainFcn = 'trainscg';
tic
net = train(net,Xs,Ts,'showResources','yes' );
toc %2.77

Обучение занимает менее 3 секунд. Но при выполнении того же самого на графическом процессоре GTX 760 с поддержкой CUDA:

%GPU training
T = num2cell(sin(1:0.01:10));
net = narnet( 1:2, 10 ); 
[ Xs, Xsi, Asi, Ts] = preparets( net, {}, {}, T );
rng(0)
net.trainFcn = 'trainscg';
tic
net = train(net,Xs,Ts,'useGPU','yes','showResources','yes' );
toc % 1247.6

Невероятно, но тренировка длится более 20 минут!

Я прочитал довольно обширную документацию Mathworks по параллельным вычислениям и вычислениям на графическом процессоре с помощью набора инструментов нейронной сети и увидел, что есть несколько вещей, которые можно/нужно делать при вычислениях с помощью графического процессора, например, преобразование входных и целевых данных в массивы графического процессора перед обучение с помощью команды nndata2gpu и замена любых функций активации tansig на elliotsig, что немного ускоряет обучение:

%Improved GPU training
T = num2cell(sin(1:0.01:10));
net = narnet( 1:2, 10 ); 
[ Xs, Xsi, Asi, Ts ] = preparets( net, {}, {}, T );
rng(0)
net = configure(net,Xs,Ts); 
Xs = nndata2gpu(Xs);
Ts = nndata2gpu(Ts);
Xsi = nndata2gpu(Xsi);
for i=1:net.numLayers
  if strcmp(net.layers{i}.transferFcn,'tansig')
    net.layers{i}.transferFcn = 'elliotsig';
  end
end
net.trainFcn = 'trainscg';
tic
net = train(net,Xs,Ts,'showResources','yes' );
toc  %70.79

Обучение здесь занимает всего около 70 секунд, но все же это во много раз медленнее, чем просто делать это на моем процессоре. Я пробовал несколько серий данных разного размера и сетевых архитектур, но я никогда не видел, чтобы обучение GPU могло конкурировать с CPU, что странно, поскольку, насколько я понимаю, большинство профессиональных исследований ANN выполняется с использованием GPU?

Что я здесь делаю неправильно? Очевидно, я должен упустить что-то фундаментальное.

ОТВЕЧАТЬ

Matlabsolutions.com предоставляет последнюю Помощь по домашним заданиям MatLab, Помощь по заданию MatLab для студентов, инженеров и исследователей в различных отраслях, таких как ECE, EEE, CSE, Mechanical, Civil со 100% выходом. Код Matlab для BE, B.Tech , ME, M.Tech, к.т.н. Ученые со 100% конфиденциальностью гарантированы. Получите проекты MATLAB с исходным кодом для обучения и исследований.

Для ускорения с помощью графического процессора требуется несколько вещей:

1) Количество времени, затрачиваемое на расчеты градиента (которые происходят на ЦП или ГП по вашему запросу), значительно по сравнению с обновлением шага обучения (которое все еще происходит на ЦП).

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

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

Задача NAR, которую вы определили, имеет только 899 шагов с сетью из 10 нейронов. Тот факт, что оба набора данных

СМОТРИТЕ ПОЛНЫЙ ОТВЕТ НАЖМИТЕ НА ССЫЛКУ