Интервью с Крисом Ракауцкасом

Как мы часто упоминали в учебнике Not a Monad Tutorial, мир сложен, и мы все больше понимаем, в чем наши инструменты не справляются, пытаясь смоделировать эту сложность.

Ранее мы брали интервью у Криса Ракауцкаса о SciML; на этот раз он присоединяется к нам, чтобы ответить на вопросы, касающиеся новых разработок в области символьных вычислений с Джулией, их отношения к числовым вычислениям, причинно-следственных и акаузальных подходов, как эти вопросы представлены в Symbolics.jl и ModelingToolkit.jl, и как эти пакеты связаны к существующему ландшафту инструментов моделирования.

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

Присоединяйтесь к группе или каналу Telegram Not a Monad Tutorial, чтобы поговорить о программировании, информатике и статьях. Увидимся там!

Если вы ищете хороших инженеров, отправьте мне письмо по адресу [email protected] или вы также можете связаться со мной через твиттер по адресу @federicocarrone.

Что такое Symbolics.jl? Каковы мотивы создания системы?

Symbolics.jl - это система компьютерной алгебры (CAS) на языке программирования Julia, разработанная JuliaSymbolics Organization. Подумайте о символических вычислениях: запишите уравнения и попросите компьютер придумать символические решения. Это современный CAS, то есть он построен на широко используемом современном языке программирования (Julia) с использованием современных инструментов, таких как всеобъемлющий параллелизм, новые алгоритмы, такие как E-Graphs, интеграция с машинным обучением и многое другое.

Что такое ModelingToolkit.jl? Какие потребности он решает?

ModelingToolkit.jl - это система акаузального моделирования на основе уравнений. Это похоже на такие системы, как Modelica, которые позволяют составлять модели для быстрого создания реалистичных симуляций. Это позволяет вам использовать готовые модели, созданные другими учеными, и создавать полные системы. Например, вы можете взять высокоточную модель кондиционера, затем сделать модель здания, вставить кондиционер в здание и спросить, какой уровень энергоэффективности вы получите. Затем измените здание, чтобы приступить к проектированию наиболее эффективного.

Как акаузальное моделирование связано с такими инструментами, как Simulink?

Simulink - это инструмент причинного моделирования. Вы должны знать, что вызывает что, чтобы разработать симуляцию. Это может быть сложно в нашем сложном мире: тепло здания считывается термостатом, который включает кондиционер, который затем изменяет тепло в здании. Обратные связи и алгебраические циклы вызывают проблемы в системах причинного моделирования: пользователи должны разорвать циклы или изменить модель. По этой причине эксперты считают причинно-следственное моделирование непригодным для сложных симуляций, поскольку они плохо сочетаются. Это причина того, что акаузальные инструменты, такие как Modelica, получили широкое распространение. Даже у MATLAB теперь есть акаузальный инструмент SimScape. Учитывая достижения в этих методах, я вижу следующее поколение инженеров, использующих акаузальные инструменты, при этом ModelingToolkit.jl является одной из немногих полнофункциональных акаузальных систем с открытым исходным кодом.

Зачем вообще нужны символьные вычисления? Какие преимущества по сравнению с численным расчетом? Когда одно предпочтительнее другого?

Вы уверены, что знаете достаточно математики, чтобы написать математическую модель в наиболее численно стабильной форме? Даже если вы знаете все трюки, которые должны делать, хотите ли вы делать все вручную? Я вижу основное использование символьных вычислений в символьно-числовых, то есть использование символьных методов для улучшения моделей, которые затем используются в численных методах. Например, в недавнем сообщении блога, озаглавленном Обобщение автоматической дифференциации до автоматической разреженности, неопределенности, устойчивости и параллельности, я описываю, как двумерное моделирование маятника без приближения малого угла требует дифференциально-алгебраического уравнения. Интуитивно понятная модель позиция движется за счет скорости, скорость движется за счет ускорения, а длина постоянна на самом деле является нестабильным описанием полного маятника. Вы должны дважды дифференцировать уравнение длина постоянна, затем подставить другие отношения, и тогда вы получите DAE индекс-1, которую легче решить численно. Даже если вы знаете достаточно этих деталей, чтобы сделать это, вы не захотите с этим справляться! Символьно-числовые вычисления - это то, как мы доберемся до будущего, в котором все это будет автоматизировано.

Wolfram Mathematica и SymPy в Python - одни из самых популярных в настоящее время вариантов при работе с символами. Какие преимущества предлагает Symbolics.jl по сравнению с ними?

Symbolics.jl создается с нуля для обеспечения скорости, создается с нуля с использованием параллелизма и, наконец, что не менее важно, он создается на основе сообщества инструментов. Существует так много хороших вещей, что я думаю, что было бы неразумно изолировать свою организацию и делать все с нуля. У Джулии есть много замечательных инициатив, таких как OSCAR.jl, которые создают быстрые реализации математической интуиции. Мы используем тот факт, что Julia является высокопроизводительным языком, как для разработки интерфейсов высокого уровня, так и для обеспечения того, чтобы все эти инструменты можно было использовать с минимальными накладными расходами, умственными и вычислительными. Таким образом, хотя вы можете ничего не знать о полях Галуа, под капотом может быть причудливый алгоритм, когда вы вызываете factorize (x² + 2x + 1), который делает это эффективно и масштабируется до больших систем.

Как ModelingToolkit.jl связан с Symbolics.jl? Какую роль играет возможность комбинирования Джулии во взаимоотношениях между двумя пакетами?

Акаузальное моделирование требует символических преобразований уравнений. В этом примере с маятником «дважды дифференцируйте уравнение и замените», какой инструмент предоставляет такие функции, как дифференцирование и высокопроизводительное переписывание уравнения (т. Е. Замена)? КАС! Итак, ModelingToolkit.jl пусть кто-нибудь скажет «это ODE», где его уравнения описываются выражениями Symbolics.jl. Затем есть функции, которые делают такие вещи, как «преобразование этого в форму индекса-1» и «аналитическое обнаружение избыточных уравнений и их удаление», и эти преобразования записываются с использованием инструментов Symbolics.jl. Это означает, что по мере того, как CAS становится более мощным, будет расти и ModelingToolkit.jl и его среда.

Как ModelingToolkit.jl сравнивается с другими средами моделирования, такими как Modelica и Simulink? Насколько легко человек, имеющий некоторый опыт работы с этими фреймворками, сможет адаптироваться к ModelingToolkit.jl?

ModelingToolkit.jl на этом этапе в основном уделял внимание гибкости и скорости. Что касается гибкости, ModelingToolkit.jl - единственный, у которого есть взломанный компилятор, позволяющий создавать преобразования. Все символьные улучшения, которые разрешены в компиляторах Modelica и Simulink, являются встроенными. Хотя кажется, что это все, что нужно большинству пользователей, на самом деле это сдерживает инновации. Есть люди, работающие в этих областях, которым нужна общая структура, на которой можно строить. Многие из этих исследователей сейчас находятся в Юлии. Так, например, можем ли мы добавить проход анализа, который автоматически сообщит вам, можете ли вы отличить параметры от имеющихся у вас данных? Да, любой может расширить систему ModelingToolkit.jl с помощью прохода, который делает это, и мы уже говорим с авторами библиотек Julia об этом. В этом пространстве происходит так много всего, что это трудно выразить, но ожидайте, что на ваших моделях будет разрешено множество уникальных преобразований. Сделать модель, которая не решает в других системах, решать здесь - это не просто мечта.

А еще есть скорость. Мы еще не провели полного и всестороннего тестирования всех систем, но мы увидели неплохую производительность по сравнению с некоторыми компиляторами Modelica, что говорит о том, что у нас все хорошо. Один пользователь NASA ModelingToolkit.jl сказал, что 15-минутное моделирование Simulink заняло 50 мсек в ModelingToolkit.jl. Пользователь упомянул на встрече Механики космических полетов AAS / AIAA, что каждый случай против пакета Fortran с интерфейсом MATLAB, они видели, по крайней мере, ускорение на порядок при переходе на ModelingToolkit.jl. В очень ранней версии ModelingToolkit.jl мы сделали демонстрацию с Pfizer, где продемонстрировали 175-кратное ускорение по сравнению с их исходными симуляциями на основе языка C. Частично все это связано только с решателями, которые действительно хорошо тестируют кросс-языковые тесты. Еще один хороший фрагмент связан с набором функций решателей и ModelingToolkit.jl, автоматически позволяющим выбрать один из лучших вариантов комбинаций. Это немного рассматривается в выступлении на JuliaCon 2020 под названием Автоматическая оптимизация и параллелизм в DifferentialEquations.jl, в котором было объявлено о выпуске ModelingToolkit.jl в качестве нового интерфейса для решателей для дальнейшего повышения скорости.

Тем не менее, мы пока сосредоточились на деталях. Нам нужны самые большие и сложные модели для пользователей, у которых больше всего требований. Эти другие инструменты уделили гораздо больше времени пользовательскому интерфейсу, особенно графическим пользовательским интерфейсам (GUI). В Modelica и Simulink есть много инструментов для построения моделей с перетаскиванием. Также у них есть библиотеки готовых библиотек. Но это скоро изменится. Следите за некоторыми объявлениями.

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

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

Как код Julia генерируется из символьных выражений?

В символических выражениях используются одни и те же точные фигуры с разной симантикой. Например, квадратные корни в модели - это sqrt в Symbolics.jl и sqrt в Julia. Это означает, что все, что нам нужно сделать, это взять символическое выражение, записать его в функцию Julia и вызвать компилятор. Вызов компиляции на лету как части символьного языка - интересная задача, которую пропускает такой инструмент, как SymPy, но который снижает скорость на порядки. Конкретные детали этого довольно эзотерические, поэтому я пощажу вас, но для того, чтобы все это работало, мы создали новую ловушку в компиляторе Julia под названием RuntimeGeneratedFunctions, которая позволяет выполнять поэтапную компиляцию, которая объединяется со сборкой мусора, что делает сгенерированный код безопасным.

Какие механизмы позволяют легко создавать модели с помощью ModelingToolkit.jl?

Это случайное моделирование. Вы можете разрабатывать части изолированно и просто объявлять отношения между компонентами. Например, построить модель электрогенератора и модель компьютерного чипа. Теперь вы хотите соединить эти две совершенно разные модели? Физически их соединял бы провод, и тогда должны были бы выполняться законы Кирхгофа, т.е.в точках соединения напряжения должны были быть равны, а токи в сумме равнялись бы нулю. Итак, в ModelingToolkit.jl вы бы поступили именно так: вы сказали бы «ток от генератора + ток к микросхеме = 0» и «напряжение на генераторе = напряжение на кристалле», и вы получили результат. Теперь это может привести к появлению некоторых избыточных переменных и уравнений, но это нормально: символьная система предварительной обработки устраняет все это и упрощает до наиболее эффективной проблемы для моделирования. Затем, в конце, вы можете спросить: «Дайте мне временные ряды напряжения на микросхеме», и он даст вам его, независимо от того, было ли оно на самом деле в моделировании или нет, потому что у него есть информация для восстановления этих значений.

ModelingToolkit.jl идет еще дальше. Есть операторы `connect`, которые позволяют вам определять общее поведение. Например, «штырь» в электрической цепи всегда имеет напряжение и ток, и эти законы сверху определяют то, как «соединения» работают физически. Итак, на этом более высоком уровне вы можете сказать: «Подключите вывод генератора к выводу схемы», и он генерирует все физические отношения, связанные с этим утверждением. Есть много готовых систем, которые появятся очень скоро (вероятно, будут завершены до того, как эти ответы станут общедоступными!), Поэтому тепловой поток, энтальпийные отношения и т. Д. - все это простые операторы соединения. Механизм соединения также является расширяемым, поэтому, если у вас есть общее значение, скажем, в фармакологических моделях, которое отличается, вы можете создать новый тип переменной и устанавливать соединения, автоматически применяя законы, которые вы хотите. Соединение сердца с почкой означает, что кровоток сохраняется, а кислород - нет. Это упрощает специализацию систем для каждой конкретной научной области.

В чем преимущества символической предварительной обработки моделей?

Из предыдущего утверждения обратите внимание, что простое моделирование требует способности строить объекты изолированно, а затем просто скажите «a = b». Однако численное моделирование с «a = b» довольно сложно, численные методы действительно хотят не решать уравнения точно. Но если ток на одной стороне на 10 ^ (- 8) выше, чем на другой, вы теряете сохранение тока, и вы можете постоянно увеличивать мощность системы, пока она не выйдет из-под контроля и симуляция не выйдет из строя. На самом деле это очень распространенное поведение в системах причинного моделирования. Но если вы удалите переменную «b» и замените ее на «a» в каждом месте, где она появляется, а затем, если пользователь попросит «b», вы дадите ему «a», то теперь вы символически обеспечили равенство, и вы никогда не будет числовой проблемы из-за этого эффекта. Таким образом, это не только сокращает набор уравнений, которые необходимо решить (ускоряя процесс решения), но также делает численное решение более стабильным и более успешным.

На кого нацелены ModelingToolkit.jl и Symbolics.jl? Считаете ли вы, что помимо академических кругов люди могут найти их полезными?

Symbolics.jl более академически ориентирован. Люди, занимающиеся символической компьютерной алгеброй, есть повсюду, но я склонен видеть больше в академических кругах. Физики, вычислительные биологи и т. Д. Поскольку Symbolics.jl позволяет автоматически выполнять перевод между кодом Julia и символьным кодом, мы видим, что компьютерные ученые даже применяют его как удобный и простой способ анализа кода.

ModelingToolkit.jl, с другой стороны, больше ориентирован на инженеров и разработчиков моделей. Инженеры-механики, специалисты по робототехнике, конструкторы, синтетические биологи. Эти люди обычно встречаются как в академических кругах, так и в промышленности. Мы уже получаем много похвал от пользователей ModelingToolkit.jl в отрасли, так что, вероятно, мы найдем там хорошую точку опоры.

Сколько человек задействовано в проектах? Каковы их биографии?

Слишком много вовлечено, поэтому я просто хотел бы поблагодарить лучших. Инбо Ма - суперзвезда, еще студентка, но важный участник как SciML (решателей дифференциальных уравнений и ModelingToolkit.jl), так и JuliaSymbolics. Шаши Гауда - аспирант Массачусетского технологического института, который руководил многими внутренними компонентами JuliaSymbolics. Затем было много вкладов со стороны сотрудников НАСА, старшеклассников, профессоров математических и биологических факультетов, исследователей пандемий и т. Д. Проект все еще находится на ранней стадии, но сообщество вокруг него уже велико.

Каковы следующие шаги для каждого проекта?

Очень скоро у нас будет крупное объявление, так что следите за обновлениями.