Anatoly Levenchuk (ailev) wrote,
Anatoly Levenchuk
ailev

Инженерное моделирование в Julia

В 2014 году автор Modelica (и Dymola) Hilding Elmqvist написал статью "Modelica Evolution -- From My Perspective" (https://www.modelica.org/events/modelica2014/proceedings/html/submissions/ECP1409617_Elmqvist.pdf), а уже в январе 2016 года начал изучать, можно ли сделать на базе Julia предметно-ориентированный язык (DSL) для моделирования с мощностью по меньшей мере Modelica. Ибо Modelica современные задачи инженерного моделирования уже не тянет, нужны новые идеи, новые алгоритмы. Ответ был "да" и Elmqvist делает стартап, где сurrent activities include designing and implementing an experimental modeling language which we call Modia. Modia is based on the Julia language (http://julialang.org/) and is similar to Modelica. Ну, я ошибся с именем: когда я обсуждал архитектурные альтернативы SysMoLan в 2015, я дал такому языку имя Mojulica (Julia в сторону Modelica) -- http://ailev.livejournal.com/1168256.html

После этого Elmqvist делает доклад "Systems Modeling and Programming in a Unified Environment Based on Julia" (https://link.springer.com/chapter/10.1007/978-3-319-47169-3_15), где он сотоварищи описывает Modia (MODelica+julIA) как DSL в Julia на базе макроса @model.



Дальше всё как у Modelica, только речь идёт уже не о десятках тысяч, а о сотнях тысяч уравнений, новых видах моделей: Modia is designed to model and simulate physical systems (electrical, mechanical, thermo-dynamical, etc.) described by differential and algebraic equations. A user defines a model on a high level with model components (like a mechanical body, an electrical resistance, or a pipe) that are physically connected together. By this approach it's possible and convenient to build models with hundred thousands of equations describing the dynamics of a car, an airplane, a power plant, etc. and simulate them. Новые виды моделей описаны в майском 2017 года тексте "Innovations for Future Modelica" с ключевыми словами Modelica, Modia, Julia, modeling, simulation -- http://www.ep.liu.se/ecp/132/076/ecp17132693.pdf, This paper discusses language innovations for future Modelica versions, on the one hand for generally applicable language elements, and on the other hand to improve modeling of multibody systems with contacts, and media modeling. In a companion paper new algorithms are proposed to handle much larger models than can be treated today (вот этот алгоритм: "Transformation of Differential Algebraic Array Equations to Index One Form", http://www.ep.liu.se/ecp/132/064/ecp17132565.pdf -- там тоже в ключевых словах Modelica, Modia, Julia). В этих статьях указано, что летом 2017 года Modia появится в виде пакета Julia тут: https://github.com/ModiaSim/Modia.jl (я думаю, задержка выкладывания связана с тем, что все срочно чистят свои программы под версию Julia 0.6, а это требует времени).

Инициативу авторов Modelica не стоит недооценивать: они более чем разбираются и в языковом дизайне, и в собственно моделировании, и даже в общественной работе по продвижению своих идей. Результаты начинают сказываться: в презентации Argonn National Laboratory "Computational Science for Grid Management" (моделирование энергосетей) в ноябре 2016 года рассказывается, что для работы был выбран Julia DSL StructJuMP (https://github.com/StructJuMP/StructJuMP.jl), который сам является расширением DSL JuMP -- предметно-ориентированного языка для решения задач по оптимизации, https://github.com/JuliaOpt/JuMP.jl. Но поскольку речь идёт об электроэнергетике, то для моделирования рассматривалась и Modelica. В презентации сравнению Julia и Modelica посвящён аж целый слайд 22 -- http://gridoptics.org/fpgws16/files/mihai_slides_part_1_and_2.pdf, где говорится: "How about Modelica? Modelica is a popular open-source algebraic framework mostly for dynamical simulations (sort of like simulink); car industry and power plant simulation. Factor of 10 in development time reduction reporter for Building apps (Wetter and Haugstetter). However, in 2016 Hilding Elmqvist (Modelica lead designer), advocated move to julia (the Modia project)... “The function part of Modelica is, however, not rich enough. There are no advanced data structures such as union types, no matching construct, no type inference, etc.” .. Need to move to a LANGUAGE. He gives example of Julia compactness v. modelica (due to type and size inference).

Подход к созданию DSL при помощи макроса @model в Modia в Julia оказался настолько интересен и важен, что David Sanders (один из создателей Julia) написал в блог Julia инструкцию "Creating domain-specific languages in Julia using macros" -- https://julialang.org/blog/2017/08/dsl. Этот текст существенно опирается на особенности версии 0.6 Julia и рассказывает о том, как расширить синтаксис Julia для интерфейса к объектам Julia со сложным поведением. Этот пост David Sanders показывает, что курс на DSL -- это мейнстрим в Julia.

Modia это не единственная инициатива акаузального моделирования на Julia, ибо есть ещё Sims.jl -- https://github.com/tshort/Sims.jl.

Ещё один DSL в Julia, о котором тут стоит упомянуть -- это язык для работы с глубоким обучением Knet, https://github.com/denizyuret/Knet.jl Unlike gradient generating compilers like Theano and TensorFlow which restrict users into a modeling mini-language, Knet allows models to be defined by just describing their forward computation in plain Julia, allowing the use of loops, conditionals, recursion, closures, tuples, dictionaries, array indexing, concatenation and other high level language features. High performance is achieved by combining automatic differentiation of most of Julia with efficient GPU kernels and memory management. Это работа Koç University, Istanbul. Есть чем хвастаться? Есть: число строк в моделях глубоких сетей Knet занимает десятую часть от тех же моделей в TensorFlow или Caffe (https://www.youtube.com/watch?v=ijI0BLf-AH0), плюс речь идёт о dynamic, а не static computation graph (то есть как в Chainer: структуру нейронной сети можно подхакивать по ходу вычислений).

Месяц назад вышла альфа следующего поколения менеджера пакетов, который сможет поддерживать всё это обилие пакетов (DSL, библиотек, фреймворков и т.д.) -- речь идёт о Pkg3, созданном по мотивам virtualenv (Python), Cargo (Rust), Nix (NixOS): https://github.com/StefanKarpinski/Pkg3.jl (рассказ об этом тут: https://www.youtube.com/watch?v=-yUiLCGegJs).

Безусловно, Julia тут выступает как скрипка Энгельбарта (http://ailev.livejournal.com/1158826.html): язык, который сделан нердами для нердов, чтобы как-то увеличить их нердовость, а не что-то там автоматизировать. Прежде всего это язык, создаваемый математиками для математиков. Например, вот обсуждение дизайна работы с линейной алгеброй в Julia: https://www.slideshare.net/acidflask/designing-linear-algebra-into-julia (видео рассказа -- https://www.youtube.com/watch?v=C2RO34b_oPM). Очень поучительная презентация, там три тезиса (на примере работы с векторами и матрицами -- и не только в Julia): Claim 1. Julia's generic function system (multimethods/ multiple dispatch) is ergonomically designed to capture mathematical abstraction. Claim 2. We're only just learning how to explain abstractions clearly to a computer. Claim 3. The future of high performance lies in composable abstraction.

Это всё очень жадные к вычислительной мощности приложения. И Julia тут не подводит. Это пятый язык в мире, который поучаствовал в петафлопсных вычислениях (после ассемблера, C, C++, and Fortran -- других языков на суперкомпьютерах не было): https://arxiv.org/abs/1611.03404. И в обратную сторону тоже есть работа: он портирован для ARM, в частности, он вошёл в поставку софта для Raspberry Pi -- https://www.raspberrypi.org/blog/julia-language-raspberry-pi/. Теперь для математиков там не только Wolfram Language! Julia это язык, который даёт нердам-вычислительным-математикам интерфейс доступа к вычислительной мощности современных компьютеров в таких абстракциях, которые им понятны и удобны.

SysMoLan мы задумывали три года назад (лето 2014 -- зима 2015) как системный язык моделирования, который поддерживает инженерное моделирование со множеством разных viewpoints (то есть множеством DSL). Каждый стейкхолдер должен получить свой viewpoint -- свои объекты, свой язык для описания операций с ними. Особенность в том, что многие из этих языков описывают физический мир и связаны с вычислениями. Это, безусловно, тоже скрипка Энгельбарта -- нерды пытаются придумать что-то такое, чтобы им (нердам, а не широкой публике) стало хорошо. Хотя была идея, что язык должен позволять простые вещи для инженеров выражать просто, а сложные вещи делать возможными. DSL-в-Julia, похоже, как раз такое решение. Может быть, нужно ещё раз вернуться к теме SysMoLan. Вот некоторые посты из той серии: июль 2014 "SysMoLan (system modeling language): почему мы это делаем и почему у нас это получится" http://ailev.livejournal.com/1127145.html, "SysMoLan: альтернативы" http://ailev.livejournal.com/1168256.html, "формализм для SysMoLan: что он должен поддержать" http://ailev.livejournal.com/1169972.html и даже текст 2010 года "Стратегия создания платформы языкоориентированного онтологического программирования .15926" http://dot15926.livejournal.com/2570.html.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 18 comments