Джулія, в цей момент (травень 2019 року, Julia v1.1 з v1.2, який повинен вийти) є досить зрілим для наукових обчислень. Випуск v1.0 означав кінець щорічного злому коду . Зважаючи на це, багато наукових обчислювальних бібліотек встигли просто розростатися без збоїв. Широкий огляд пакетів Julia можна знайти на сайті pkg.julialang.org .
Для основних наукових обчислень - бібліотека DifferentialEquations.jl для диференціальних рівнянь (ODE, SDE, DAE, DDE, моделювання Гіллеспі тощо), Flux.jl для нейронних мереж та бібліотека JuMP для математичного програмування (оптимізація: лінійне, квадратичне, змішане ціле число та ін. програмування) - три основи наукової обчислювальної екосистеми. Бібліотека диференціальних рівнянь, зокрема, набагато розвинена, ніж те, що ви бачили б іншими мовами, з великою командою розробників, що реалізує такі функції, як інтегратори EPIRK , диференціальне рівняння затримки Runge-Kutta-Nystrom , Stiff / Differential-Algebraic та ін.адаптаційні жорсткі стохастичні інтегратори рівняння диференціального рівняння , а також купу інших продуктів, таких як аналіз суміжної чутливості , хімічні реакції DSL , без матриць Ньютона-Крилова та повна сумісність GPU (без передачі даних), з навчанням нейронних диференціальних рівнянь , все з фантастичні результати порівняння (відмова: Я є головним розробником).
Те, що трохи не викликає думки щодо дозрілої екосистеми Юлії, - це її сумісність. По суті, коли хтось будує загальну функцію бібліотеки на зразок функцій DifferentialEquations.jl, ви можете використовувати будь-який тип AbstractArray / Number для створення нового коду на льоту. Так, наприклад, існує бібліотека для розповсюдження помилок ( Measurements.jl ), і коли ви вставляєте її в вирішувач ODE, вона автоматично збирає нову версію вирішувача ODE, яка робить поширення помилок без вибірки параметрів . Через це ви можете не знайти деяких функцій, задокументованих, оскільки код для цих функцій генерується сам, і тому вам потрібно більше подумати про склад бібліотеки.
Один із способів, коли композиція найбільш корисна, - це лінійна алгебра. Наприклад, ODE-розв'язувачі дозволяють вказати jac_prototype
тип, який дає вам тип для якобіан, який буде використовуватися всередині країни. Звичайно , є речі , в стандартній бібліотеці LineraAlgebra , як Symmetric
і Tridiagonal
ви можете використовувати тут, але , з огляду на корисність composibility в загальних алгоритмах типу, люди тепер пішли і побудували цілі бібліотеки типу масиву. BandedMatrices.jl і BlockBandedMatrices.jl - це бібліотеки, які визначають ( блоковані ) типи матричних ліній , що мають швидкі lu
перевантаження, що робить їх гарним способом прискорити рішення жорстких дискретностей MOL систем парціальних диференціальних рівнянь. PDMats.jlдозволяє конкретизувати позитивно-визначені матриці. Elemental.jl дозволяє визначити розподілений розріджений якобійський. CuArrays.jl визначає масиви на GPU. І т.д.
Тоді у вас є всі ваші типи номерів. Unitful.jl здійснює перевірку одиниць під час компіляції, так що це накладні бібліотеки одиниць. DoubleFloats.jl - це швидка бібліотека з високою точністю, а також Quadmath.jl та ArbFloats.jl . ForwardDiff.jl - це бібліотека для автоматичного розмежування в прямому режимі, яка використовує арифметику подвійного числа. І я можу продовжувати перераховувати це. І так, ви можете кинути їх у досить загальні бібліотеки Julia, як DifferentialEquations.jl, щоб скласти версію, спеціально оптимізовану для цих типів чисел. Навіть щось на зразок ApproxFun.jlяка функціонує як алгебраїчні об'єкти (як Chebfun) працює з цією загальною системою, що дозволяє специфікувати PDE як ODE для скалярів у просторі функцій.
З огляду на переваги комбінованості та те, як типи можна використовувати для створення нового та ефективного коду на загальних функціях Julia, було зроблено багато роботи над тим, щоб реалізувати реалізацію основних наукових обчислювальних функцій в чисту Julia. Optim.jl для нелінійної оптимізації, NLsolve.jl для вирішення нелінійних систем, IterativeSolvers.jl для ітеративних розв'язувачів лінійних систем та власних систем, BlackBoxOptim.jl для оптимізації чорних ящиків тощо. Навіть бібліотека нейронних мереж Flux.jl просто використовує CuArrays. автоматична компіляція коду до графічного процесора jl для його можливостей. Ця сумісність була основою того, що створювало такі речі, як нейронні диференціальні рівняння в DiffEqFlux.jl. Імовірнісні мови програмування, такі як Turing.jl , також зараз досить зрілі і використовують ті ж основні інструменти.
Оскільки бібліотеки Джулії настільки основані на інструментах генерації коду, не дивно, що навколо створення коду існує багато інструментів. Трансляційна система Джулії генерує зліплені ядра, які перевантажуються типами масивів, що дає безліч згаданих вище функцій. CUDAnative.jl дозволяє компілювати код Julia до ядер GPU. ModelingToolkit.jl автоматично знесилює AST в символічну систему для перетворення математичного коду. Cassette.jlдозволяє "перенастроїти" чужу існуючу функцію, використовуючи правила, щоб змінити їх функцію перед часом компіляції (наприклад: змінити всі їх масиви на масиви на статичні розподіли масиву та перемістити операції до GPU). Це більш вдосконалений інструментарій (я не сподіваюся, що всі, хто займається науковими обчисленнями, мають безпосередній контроль над компілятором), але саме так будується багато інструментів нового покоління (а точніше, як самі функції записують).
Щодо паралелізму, я згадав про графічні процесори, а Юлія вбудувала багатопотокові та розподілені обчислення . Багатопоточна редакція Юлії дуже скоро використає архітектуру виконання паралельних завдань (PARTR), яка дозволяє автоматизувати планування вкладених багатопотокових читань . Якщо ви хочете використовувати MPI, ви можете просто використовувати MPI.jl . І звичайно, найпростіший спосіб скористатись цим - просто скористатися настройкою типу AbstractArray, щоб використовувати паралелізм у своїх операціях.
У Юлії також є основна екосистема, яку ви могли б очікувати, мова загального призначення, що використовується для наукових застосувань. У нього Juno IDE із вбудованим налагоджувачем з точками прориву , у нього є Plots.jl для створення всіляких сюжетів. Дуже приємно також багато специфічних інструментів, наприклад Revise.jl автоматично оновлює ваші функції / бібліотеку, коли файл зберігається. У вас є ваші DataFrames.jl , бібліотеки статистики тощо. Однією з найприємніших бібліотек є насправді Distributions.jl, яка дозволяє писати алгоритми, загальні для розподілу (наприклад:rand(dist)
приймає випадкове число будь-якого переданого розподілу), і є ціле навантаження одноманітних і багатоваріантних розподілів (і, звичайно, відправка відбувається в час компіляції, що робить це все так само швидко, як жорстке кодування функцією, характерною для розподілу). Є купа інструментів для обробки даних , веб-серверів тощо. На даний момент це вже досить зріло, що якщо є основна наукова річ, і ви сподіваєтесь на її існування, ви просто за допомогою Google .lv або Julia, і вона з’явиться.
Тоді на горизонті слід пам’ятати кілька речей. PackageCompiler прагне створити бінарні файли з бібліотек Julia, і він вже має певні успіхи, але потребує більшого розвитку. Makie.jl - це ціла бібліотека для інтерактивності побудови графіків, прискорених графічним процесором, і їй ще потрібно ще трохи роботи, але вона справді шукає стати головною бібліотекою побудови графіків у Джулії. Zygote.jl - це бібліотека автоматичної диференціації від джерела до джерела, яка не має проблем з продуктивністю AD, що базується на трасування (Flux's Tracker, PyTorch, Jax), і прагне працювати над усіма чистими кодами Julia. І т.д.
На закінчення можна знайти багато руху в багатьох місцях, але в більшості областей вже є міцна дозріла бібліотека. Це вже не місце, де ви запитуєте "чи буде прийнято?": Джулію прийняли достатньо людей (мільйони завантажень), щоб вона мала імпульс назавжди назавжди. У ній дійсно приємна спільнота, тому якщо ви хочете просто захотіти на вітрі та поговорити про паралельні обчислення чи числові диференціальні рівняння, деякі з найкращих чатів для цього знаходяться в « Джуліаланг Слабі» . Чи це мова, яку ви повинні вивчити, це особисте запитання, а чи це правильна мова для вашого проекту - це технічне питання, і вони різні. Але це мова, яка визріла і має підтримку великої послідовної групи розробників? Це, мабуть, є позитивним так.