Улучшение эффективности оптимизации Используя параллельные вычисления

В этом примере показано, как улучшать производительность оптимизации с помощью Parallel Computing Toolbox™. Пример обсуждает ускорение, которое, как замечают при использовании параллельных вычислений, оптимизировало комплексную модель Simulink®. Пример также показывает эффект количества параметров и время симуляции модели при использовании параллельных вычислений.

Требует Parallel Computing Toolbox™

Пример, иллюстрирующий ускорение оптимизации

Основная вычислительная загрузка при использовании Simulink Design Optimization™ является симуляцией модели. Методы оптимизации обычно требуют многочисленных симуляций на итерацию оптимизации. Когда многие симуляции независимы, это выгодно, чтобы использовать параллельные вычисления, чтобы распределить эти независимые симуляции на различных процессорах.

Рассмотрите модель Simulink самолета HL20, который поставляется с Aerospace Blockset™. Модель HL20 является сложной моделью и включает механическое устройство, электрическое, авиационная радиоэлектроника и экологические компоненты. Типичная симуляция модели HL20 занимает приблизительно 60 секунд.

Во время приземления самолет подвергается двум порывам ветра от различных направлений, которые заставляют самолет отклоняться от номинальной траектории на взлетно-посадочной полосе. Simulink Design Optimization используется, чтобы настроить 3 параметра контроллера так, чтобы боковое отклонение самолета от номинальной траектории в присутствии порывов ветра осталось в рамках пяти метров.

Оптимизация выполняется и с и не используя параллельные вычисления на двухъядерном AMD® на 64 бита, 2.4 ГГц, Linux® на 3.4 ГБ и четырехъядерном AMD на 64 бита, 2.5 ГГц, машинах Linux на 7.4 ГБ. Скорость, наблюдаемую для этой проблемы, показывают ниже.

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

Когда оптимизация извлечет выгоду из параллельных вычислений?

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

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

  • Существует большое количество оптимизируемых параметров

  • Метод поиска шаблона используется

  • Комплексная модель Simulink, которая занимает много времени, чтобы симулировать

  • В модели существует много неопределенных параметров

Каждый из них исследован в следующих разделах.

Количество параметров и их эффекта на параллельных вычислениях

Количество симуляций, выполняемых методом оптимизации, тесно вместе с количеством параметров.

Метод градиентного спуска и параллельные вычисления

Считайте симуляции требуемыми основанным на градиенте методом оптимизации в каждой итерации:

  • Симуляция для текущей точки решения

  • Симуляции, чтобы вычислить градиент цели относительно оптимизированных параметров

  • Если градиент вычисляется, симуляции, чтобы оценить цель вдоль направления градиента (так называемые оценки поиска линии)

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

Np  = 1:16;   %Number of parameters (16 = 4 filtered PID controllers)
Nls = 1;      %Number of line search simulations, assume 1 for now
Nss = 1;      %Total number of serial simulations, start with nominal only

Градиенты вычисляются с помощью центральных различий. Существует 2 симуляции на параметр и включают симуляции поиска линии, чтобы дать общее количество симуляций на итерацию:

Nss = 1+Np*2+Nls;

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

Nw  = 4;      %Number of parallel processors
Nps = 1 + ceil(Np/Nw)*2+Nls;

Nss/Nps отношения дает нам ускорение, которое мы строим ниже

Nls = 0:5;      %Vary the number of line search simulations
figure;
hAx  = gca;
xlim([min(Np) max(Np)]);
for ct = 1:numel(Nls)
  Rf = (1+Nls(ct)+Np*2)./(1+Nls(ct)+ceil(Np/Nw)*2);
  hLine = line('parent',hAx,'xdata',Np,'ydata',Rf);
  if ct == 1
     hLine.LineStyle = '-';
     hLine.Color = [0 0 1];
     hLine.LineWidth = 1;
  else
     hLine.LineStyle = '-.';
     hLine.Color = [0.6 0.6 1];
     hLine.LineWidth = 1;
  end
end
grid on
title('Gradient descent based relative speedup')
xlabel('Number of parameters')
ylabel('Serial time/parallel time')
annotation('arrow',[0.55 .55],[5/6 2/6])
text(8.5,1.75,'Increasing number of line searches')

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

График также показывает локальные максимумы в 4,8,12,16 параметрах, который соответствует случаям, где вычисления градиента параметра могут быть распределены равномерно между параллельными процессорами. Вспомните, что для проблемы самолета HL20, которая имеет 3 параметра, четырехъядерное наблюдаемое ускорение процессора было 2.14, который соответствует хорошо с этим графиком.

Метод поиска шаблона и параллельные вычисления

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

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

Nsearch = 15*Np;     %Default number of elements in the solution set
Npoll   = 2*Np;      %Number of elements in the poll set with a 2N poll method

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

Nps = ceil(Nsearch/Nw)+ceil(Npoll/Nw);

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

Nss = 0.5*(Nsearch+Npoll);

Также обратите внимание, что поисковый набор используется только в первых двух итерациях оптимизации, после которых только используется набор опроса. В обоих случаях Nss/Nps отношения дает нам ускорение, которое мы строим ниже.

figure;
hAx  = gca;
xlim([min(Np) max(Np)]);
Rp1 = (Nss)./( Nps );
Rp2 = (Npoll)./( ceil(Npoll/Nw) );
line('parent',hAx,'xdata',Np,'ydata',Rp1,'color',[0 0 1]);
line('parent',hAx,'xdata',Np,'ydata',Rp2,'color',[0.6 0.6 1]);
grid on
title('Pattern search based relative speedup')
xlabel('Number of parameters')
ylabel('Serial time/ parallel time')
legend('Search and poll sets','Poll set only')

Темная кривая является ускорением, когда решение и наборы опроса оценены, и более легкие ниже изгибают ускорение, когда только набор опроса оценен. Ожидаемое ускорение по оптимизации должно находиться между двумя кривыми. Заметьте, что даже только одним параметром, метод поиска шаблона извлекает выгоду из распределения. Также вспомните, что для проблемы самолета HL20, которая имеет 3 параметра, четырехъядерное наблюдаемое ускорение было 2.81, который соответствует хорошо с этим графиком.

Наверху распределения оптимизации

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

Издержки, сопоставленные с выполнением оптимизации параллельно, в основном, следуют из двух источников:

  • открытие параллельного пула

  • загрузка модели Simulink и выполнение обновления схематически изображают на модели

Существуют также немного служебные сопоставлены с передачей данных к и от удаленных процессоров. Simulink Design Optimization использует разделяемые пути, чтобы обеспечить удаленный доступ к процессорам к моделям, и возвращенные данные ограничиваются значениями нарушения ограничений и целью. Поэтому эти издержки обычно намного меньше, чем открытие пула MATLAB® и загрузка модели. Это было верно для оптимизации самолета HL20, но не может быть верно во всех случаях. Однако анализ, показанный ниже, может быть расширен, чтобы покрыть дополнительные издержки.

findOverhead = false; % Set true to compute overhead for your system.
if findOverhead
  % Compute overhead.
  wState = warning('off','MATLAB:dispatcher:pathWarning');
  t0 = datetime('now');           %Current time
  parpool                         %Open the parallel pool
  load_system('airframe_demo')    %Open a model
  set_param('airframe_demo','SimulationCommand','update')  %Run an update diagram for the model
  Toverhead = datetime('now')-t0; %Time elapsed
  Toverhead = seconds(Toverhead)  %Convert to seconds
  close_system('airframe_demo')
  delete(gcp)                     %Close the parallel pool
  warning(wState);
else
  % Use overhead observed from experiments.
  Toverhead = 28.6418;
end

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

Nw  = 4;                      %Four parallel processors
Np  = 4;                      %Four parameters optimized
Nls = 2;                      %Assume 2 line search simulations
Nss = 1+Np*2+Nls;             %Serial simulations without parallel computing
Nps = 1+ceil(Np/Nw)*2+Nls;    %Serial simulations with parallel computing

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

Niter = 1;
Ts    = 10:10:60;                %Time to simulate model once
Tst   = Niter*Nss*Ts;            %Total serial optimization time
Tpt   = Niter*Nps*Ts+Toverhead;  %Total parallel optimization time
figure;
hAx  = gca;
xlim([min(Ts) max(Ts)]);
Rp = (Tst)./( Tpt );
line('parent',hAx,'xdata',Ts,'ydata',Rp,'color',[0 0 1]);
Niter = 2^1:4;
for ct = 1:numel(Niter)
   Rp = ( Niter(ct)*Nss*Ts )./(Niter(ct)*Nps*Ts+Toverhead);
   line('parent',hAx,'xdata',Ts,'ydata',Rp,'color',[0.6 0.6 1]);
end
grid on
title('Effect of parallel overhead on optimization speedup')
xlabel('Time to simulate model once')
ylabel('Serial time/ parallel time')
annotation('arrow',[0.55 0.55],[0.45 0.85]);
text(38,2.05,'Increasing number of iterations')

Темная более низкая кривая показывает ускорение, принимающее одну итерацию, в то время как более легкие верхние кривые указывают на ускорение максимум с 16 итерациями.

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

Неопределенные параметры и их эффект на параллельной оптимизации

При использовании Simulink Design Optimization можно варьироваться некоторые параметры (скажите пружинную жесткость), и оптимизируйте параметры перед лицом этих изменений. Неопределенные параметры задают дополнительные симуляции, которые должны быть оценены в каждой итерации. Однако концептуально можно думать об этих дополнительных симуляциях как о расширении симуляции без неопределенных параметров. Это подразумевает, что везде, где одна симуляция была выполнена, теперь несколько симуляций выполняются. В результате неопределенные параметры не влияют на служебное свободное ускорение оптимизации, и вычисления в более ранних разделах допустимы.

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

Nu = [0 10];                        %Number of uncertain scenarios
Nss = (1+Nu)*(1+Np*2+Nls);          %Serial simulations without parallel computing
Nps = (1+Nu)*(1+ceil(Np/Nw)*2+Nls); %Serial simulations with parallel computing
figure;
hAx  = gca;
xlim([min(Ts) max(Ts)]);
for ct = 1:numel(Nu)
   Rp = (Ts*Nss(ct))./(Ts*Nps(ct)+Toverhead);
   line('parent',hAx,'xdata',Ts,'ydata',Rp,'color',[0 0 1]);
end
grid on
title('Effect of uncertain parameters on optimization speedup')
xlabel('Time to simulate model once')
ylabel('Serial time/ parallel time')
annotation('arrow',[0.45 0.45],[0.4 0.9])
text(31,2.05,'Increasing number of uncertain variables')

Нижняя кривая имеет место без неопределенных параметров, в то время как главная кривая имеет место неопределенным параметром, который может взять 10 отличных значений.