В этом примере показано, как улучшить эффективность оптимизации с помощью Parallel Computing Toolbox™. В примере обсуждается ускорение, наблюдаемое при использовании параллельных вычислений для оптимизации сложной модели Simulink ®. Пример также показывает эффект количества параметров и времени симуляции модели при использовании параллельных вычислений.
Требует Parallel Computing Toolbox™
Основной вычислительной нагрузкой при использовании Simulink Design Optimization является симуляция модели. Методы оптимизации обычно требуют многочисленных симуляций на итерацию оптимизации. Поскольку многие симуляции являются независимыми, выгодно использовать параллельные вычисления для распределения этих независимых симуляций между различными процессорами.
Рассмотрим модель Simulink HL20 самолета, который поставляется с Aerospace Blockset™. Модель HL20 является сложной моделью и включает механические, электрические, авионики и компоненты окружающей среды. Типичная симуляция модели HL20 занимает около 60 секунд.
При посадке самолет подвергается двум порывам ветра с разных сторон, которые приводят к отклонению самолета от номинальной траектории на взлетно-посадочной полосе. Simulink Design Optimization используется, чтобы настроить 3 параметра контроллера так, чтобы боковое отклонение самолёта от номинальной траектории при наличии порывов ветра держалось в пределах пяти метров.
Оптимизация выполняется как с помощью, так и без использования параллельных вычислений на двухъядерных 64-разрядных AMD ®, 2 4 ГГц, 3 4 ГБ Linux ® и четырёхъядерных 64-разрядных AMD, 2 5 ГГц 7 4 ГБ Linux. Скорость, наблюдаемая для этой проблемы, показана ниже.
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 = clock; 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 = etime(clock,t0) 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 различных значений.