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