Ich denke darüber nach, eine neue Sprache zu lernen, um sie für numerische / Simulationsmodellierungsprojekte zu verwenden, als (teilweisen) Ersatz für das C ++ und Python, das ich derzeit verwende. Ich bin auf Julia gestoßen , was irgendwie perfekt klingt. Wenn es alles tut, was es behauptet, könnte ich es verwenden, um sowohl C ++ als auch Python in all meinen Projekten zu ersetzen , da es auf hochrangigen wissenschaftlichen Computing-Bibliothekscode (einschließlich PyPlot) zugreifen und Schleifen mit einer ähnlichen Geschwindigkeit wie C ausführen kann. Ich würde auch von Dingen wie richtigen Koroutinen profitieren, die es in keiner der anderen Sprachen gibt.
Es ist jedoch ein relativ neues Projekt, derzeit in Version 0.x, und ich habe verschiedene Warnungen (die zu verschiedenen Zeitpunkten in der Vergangenheit veröffentlicht wurden) erhalten, dass es nicht ganz für den täglichen Gebrauch geeignet ist. Aus diesem Grund hätte ich gerne Informationen zum aktuellen Projektstatus (Februar 2014 oder wann immer eine Antwort veröffentlicht wird), damit ich beurteilen kann, ob ich persönlich in Betracht ziehen sollte, die Zeit zum Erlernen dieser Sprache zu diesem Zeitpunkt zu investieren.
Ich würde mich über Antworten freuen, die sich auf spezifische relevante Fakten über das Julia-Projekt konzentrieren . Meinungen, die auf Erfahrungen mit anderen Projekten beruhen, interessieren mich weniger.
Insbesondere deutet ein Kommentar von Geoff Oxberry darauf hin, dass sich die Julia-API noch im Fluss befindet und dass der Code aktualisiert werden muss, wenn er geändert wird. Ich möchte eine Vorstellung davon bekommen, inwieweit dies der Fall ist: Welche Bereiche der API sind stabil und welche werden sich voraussichtlich ändern?
Typischerweise würde ich meistens lineare Algebra (zB Lösen von Eigenproblemen), numerische Integration von ODEs mit vielen Variablen und Zeichnen mit PyPlot und / oder OpenGL sowie Zahlenverarbeitung im C-Stil (zB für Monte-Carlo-Simulationen) durchführen ). Ist Julias Bibliothekssystem in diesen Bereichen vollständig entwickelt? Ist die API insbesondere für diese Art von Aktivitäten mehr oder weniger stabil, oder stelle ich fest, dass mein alter Code nach dem Upgrade auf eine neue Version von Julia zum Absturz neigt?
Gibt es noch andere Punkte, die es wert wären, in Betracht gezogen zu werden, um zu entscheiden, ob Julia zum gegenwärtigen Zeitpunkt für ernsthafte Arbeit eingesetzt werden soll?
quelle
Antworten:
Julia, zu diesem Zeitpunkt (Mai 2019, Julia v1.1 mit v1.2 kurz vor dem Erscheinen) ist für das wissenschaftliche Rechnen ziemlich ausgereift. Die Version 1.0 bedeutete ein Ende des jährlichen Codefehlers . Damit hatten viele wissenschaftliche Computer-Bibliotheken die Zeit, einfach ohne Unterbrechung zu wachsen. Eine breite Übersicht über Julia-Pakete finden Sie unter pkg.julialang.org .
Für das wissenschaftliche Kernrechnen die Bibliothek DifferentialEquations.jl für Differentialgleichungen (ODEs, SDEs, DAEs, DDEs, Gillespie-Simulationen usw.), Flux.jl für neuronale Netze und die JuMP- Bibliothek für mathematische Programmierung (Optimierung: linear, quadratisch, Mixed Integer, etc. Programming) sind drei der Eckpfeiler des Scientific Computing-Ökosystems. Insbesondere die Differentialgleichungsbibliothek ist weitaus weiter entwickelt als in anderen Sprachen. Ein großes Entwicklerteam implementiert Funktionen wie EPIRK-Integratoren , Runge-Kutta-Nystrom , Differentialgleichung für steife / Differential-Algebraische Verzögerung undadaptive Zeit steife stochastische Differentialgleichung Integratoren, zusammen mit einer Reihe von anderen Leckereien , wie adjungierten Sensitivitätsanalyse , chemische Reaktion DSLs , matrixfreien Newton-Krylov und voll (Datenübertragung frei) GPU - Kompatibilität, mit der Ausbildung von neuronalen Differentialgleichungen , die alle mit Fantastische Benchmark-Ergebnisse (Haftungsausschluss: Ich bin der Hauptentwickler).
Was das gereifte Julia-Ökosystem ein wenig irritiert, ist seine Komposition. Wenn jemand eine generische Bibliotheksfunktion wie die in DifferentialEquations.jl erstellt, können Sie im Wesentlichen einen beliebigen AbstractArray / Number-Typ verwenden, um neuen Code im laufenden Betrieb zu generieren. So gibt es beispielsweise eine Bibliothek für die Fehlerweitergabe ( Measurements.jl ). Wenn Sie diese in den ODE-Solver einfügen, wird automatisch eine neue Version des ODE-Solvers kompiliert, die die Fehlerweitergabe ohne Parameterabtastung ausführt . Aus diesem Grund werden einige Funktionen möglicherweise nicht dokumentiert, da sich der Code für die Funktionen von selbst generiert, und Sie müssen daher mehr über die Bibliothekszusammensetzung nachdenken.
Eine der Möglichkeiten, wie Komposition am nützlichsten ist, ist die lineare Algebra. Mit den ODE-Solvern können Sie beispielsweise
jac_prototype
den Typ für den Jacobian angeben , der intern verwendet wird. Natürlich gibt es Dinge in der LineraAlgebra Standardbibliothek wieSymmetric
undTridiagonal
Sie können hier verwenden, aber die Nützlichkeit von composibility in Art generischen Algorithmen gegeben haben mittlerweile Menschen gegangen und gesamte Array - Typ - Bibliotheken gebaut. BandedMatrices.jl und BlockBandedMatrices.jl sind Bibliotheken, die (Block-) Banded-Matrix-Typen mit schnellenlu
Überladungen definieren und so die Lösung von steifen MOL-Diskretisierungen von Systemen partieller Differentialgleichungen beschleunigen. PDMats.jlErmöglicht die Angabe von positiv-definitiven Matrizen. Mit Elemental.jl können Sie einen verteilten, spärlichen Jacobian definieren. CuArrays.jl definiert Arrays auf der GPU. Usw.Dann haben Sie alle Ihre Nummerntypen. Unitful.jl prüft die Units zur Kompilierungszeit, sodass es sich um eine überlastungsfreie Units-Bibliothek handelt. DoubleFloats.jl ist eine schnelle Bibliothek mit höherer Genauigkeit, zusammen mit Quadmath.jl und ArbFloats.jl . ForwardDiff.jl ist eine Bibliothek für die automatische Differenzierung im Vorwärtsmodus, die die Arithmetik mit zwei Zahlen verwendet. Und ich kann diese weiterhin auflisten. Und ja, Sie können sie in ausreichend generische Julia-Bibliotheken wie DifferentialEquations.jl werfen, um eine speziell für diese Zahlentypen optimierte Version zu kompilieren. Sogar so etwas wie ApproxFun.jlDas heißt, Funktionen als algebraische Objekte (wie Chebfun) funktionieren mit diesem generischen System und ermöglichen die Angabe von PDEs als ODEs auf Skalaren in einem Funktionsraum.
Angesichts der Vorteile der Kompatibilität und der Art und Weise, wie Typen verwendet werden können, um neuen und effizienten Code für generische Julia-Funktionen zu generieren, wurde viel Arbeit geleistet, um die Implementierung der grundlegenden Funktionen für wissenschaftliches Rechnen in pure Julia zu ermöglichen. Optim.jl für die nichtlineare Optimierung, NLsolve.jl für die Lösung nichtlinearer Systeme, IterativeSolvers.jl für die iterative Lösung linearer Systeme und Eigensysteme, BlackBoxOptim.jl für die Black-Box-Optimierung usw. Selbst die neuronale Netzwerkbibliothek Flux.jl verwendet nur CuArrays. jls automatische Kompilierung von Code zur GPU für deren GPU-Fähigkeiten. Diese Kompatibilität war der Kern dessen, was Dinge wie neuronale Differentialgleichungen in DiffEqFlux.jl erzeugt hat. Probabilistische Programmiersprachen wie Turing.jl sind inzwischen ebenfalls ausgereift und verwenden die gleichen zugrunde liegenden Tools.
Da Julias Bibliotheken so grundlegend auf Code-Generierungs-Tools basieren, sollte es nicht verwundern, dass die Code-Generierung eine Menge Tools enthält. Julias Broadcast-System generiert im laufenden Betrieb fusionierte Kernel, die von Array-Typen überlastet werden , um viele der oben genannten Funktionen bereitzustellen. CUDAnative.jl ermöglicht das Kompilieren von Julia-Code in GPU-Kernel. ModelingToolkit.jl entzieht ASTs automatisch einem symbolischen System zur Transformation von mathematischem Code. Cassette.jlMit dieser Option können Sie die vorhandene Funktion eines anderen Benutzers "überspielen" und deren Funktion vor dem Kompilieren mithilfe von Regeln ändern (z. B. alle Arrayzuordnungen in statische Arrayzuordnungen ändern und Vorgänge in die GPU verschieben). Dies ist ein fortgeschritteneres Tool (ich erwarte nicht, dass jeder, der wissenschaftliches Rechnen durchführt, die direkte Kontrolle über den Compiler übernimmt), aber so wird ein Großteil der Tools der nächsten Generation erstellt (oder vielmehr, wie die Features selbst geschrieben werden).
Als Parallelität habe ich GPUs erwähnt und Julia hat Multithreading und verteiltes Computing eingebaut . Das Multithreading von Julia wird in Kürze eine PARTR-Architektur (Parallel-Tasks Runtime) verwenden, mit der verschachteltes Multithreading automatisch geplant werden kann . Wenn Sie MPI verwenden möchten, können Sie einfach MPI.jl verwenden . Und dann ist die einfachste Möglichkeit, alles zu nutzen, die Verwendung eines AbstractArray-Typ-Setups, um die Parallelität in seinen Operationen zu verwenden.
Julia hat auch das grundlegende zugrunde liegende Ökosystem, das Sie von einer Allzwecksprache erwarten würden, die für wissenschaftliche Anwendungen verwendet wird. Es hat die Juno IDE mit einem eingebauten Debugger mit Haltepunkten , es hat Plots.jl für alle Arten von Plots. Eine Reihe spezifischer Tools sind ebenfalls hilfreich , beispielsweise aktualisiert Revise.jl Ihre Funktionen / Bibliothek automatisch, wenn eine Datei gespeichert wird. Sie haben Ihre DataFrames.jl , Statistikbibliotheken usw. Eine der schönsten Bibliotheken ist Distributions.jl, mit der Sie generische Algorithmen für die Distribution schreiben können (zum Beispiel:
rand(dist)
nimmt eine zufällige Anzahl der Distributionen, die übergeben wurden, und es gibt eine ganze Menge univariater und multivariater Distributionen (und natürlich erfolgt der Versand zur Kompilierungszeit, was alles so schnell wie das Hardcodieren einer für die Distribution spezifischen Funktion macht). Es gibt eine Reihe von Tools für die Datenverarbeitung , Webserver usw., die Sie benennen. An diesem Punkt ist es ausgereift genug, dass wenn es eine grundlegende wissenschaftliche Sache gibt und Sie erwarten würden, dass sie existiert, Sie sie einfach mit .jl oder Julia googeln und sie wird auftauchen.Dann sind ein paar Dinge am Horizont zu beachten. PackageCompiler möchte Binärdateien aus Julia-Bibliotheken erstellen und hat bereits einige Erfolge erzielt, muss jedoch weiterentwickelt werden. Makie.jl ist eine komplette Bibliothek für GPU-beschleunigtes Plotten mit Interaktivität. Sie muss noch weiterentwickelt werden, möchte jedoch die wichtigste Plotbibliothek in Julia werden. Zygote.jl ist eine automatische Differenzierungsbibliothek von Quelle zu Quelle, die nicht die Leistungsprobleme eines Tracing-basierten AD (Flux's Tracker, PyTorch, Jax) aufweist und auf alle reinen Julia-Codes angewendet werden soll. Usw.
Zusammenfassend lässt sich sagen, dass es an vielen Orten viel Bewegung gibt, aber in den meisten Gebieten gibt es bereits eine solide, ausgereifte Bibliothek. Es ist nicht mehr an einem Ort, an dem Sie fragen: "Wird es adoptiert?": Julia wurde von genug Leuten adoptiert (Millionen von Downloads), dass es den Schwung hat, für immer da zu bleiben. Es hat eine wirklich nette Community. Wenn Sie also einmal in aller Ruhe über paralleles Rechnen oder numerische Differentialgleichungen sprechen möchten, sind einige der besten Chaträume dafür in Julialang Slack zu finden . Ob es sich um eine Sprache handelt, die Sie lernen sollten, ist eine persönliche Frage, und ob es sich um die richtige Sprache für Ihr Projekt handelt, ist eine technische Frage, die sich unterscheidet. Aber ist es eine Sprache, die ausgereift ist und die von einer großen, konsistenten Gruppe von Entwicklern unterstützt wird? Das scheint ja zu bejahen.
quelle
Meine grobe Schätzung in der Größenordnung, wie lange es dauert, Computer-Wissenschaftssprachen zu entwickeln, liegt bei etwa einem Jahrzehnt.
Beispiel 1: SciPy wurde im Jahr 2001 oder so gestartet. Im Jahr 2009 wurde Scipy 0.7.0 veröffentlicht, und der ODE-Integrator verfügte über eine Schnittstelle zu VODE (was
ode15s
ungefähr gleichwertigode15s
ist mit NDF-basiert, VODE ist abhängig von BDF / Adams-Bashforth). Mit SciPy 0.10.0, einer Schnittstelle zudopri5
MATLABode45
, einer Runge-Kutta-Methode 4. Ordnung, wird sie in der Regel als erste praktische numerische Integrationsmethode für Studenten eingeführt. SciPy 0.10.0 wurde im Dezember 2011 veröffentlicht, und es dauerte ungefähr 10 Jahre, bis sie eine Funktion von MATLAB enthielten, die jedem mir bekannten Ingenieurstudenten vorgestellt wurde.Beispiel 2: Mathworks wurde 1984 gegründet. In ihrer ersten Version verwendeten sie einen LAPACK-Port für C namens JACKPAC (nach Jack Little, einem MathWorks-Ingenieur, der es geschrieben hat). Sie haben es erst 2000 durch LAPACK ersetzt.
Julia braucht vielleicht weniger Zeit, aber ich würde davon ausgehen, dass sie sich in etwa 10 Jahren zum Mainstream entwickelt. (Es ist schon ein Jahr oder so gewesen; vielleicht 9-10 Jahre dann?)
Ich benutze Julia nicht, also nimm was ich sage mit einem Körnchen Salz, da ich nur Jeff Bezanson gesehen habe, der Präsentationen über Julia hält. Sie haben sich nach hinten gebeugt, um das Verknüpfen und Verwenden von Bibliotheken aus C, Python und Fortran zu vereinfachen. Wenn Sie keine Julia-Bibliothek finden, die das tut, was Sie wollen, schreiben Sie eine Julia-Beilage für eine Bibliothek in einer etablierteren Sprache. Daher denke ich nicht, dass ein Mangel an Bibliotheken ein Problem sein wird. Ich denke, ein Anliegen wird es sein, sicherzustellen, dass Änderungen an den wichtigsten Sprachfunktionen Sie nicht in den Arsch beißen. Wenn Sie sich die Meilensteine im Julia Git-Repo ansehen, werden Sie feststellen, dass das Tag "breaking" häufig verwendet wird (12-mal in der Version 0.2, 5-mal in der Version 0.3). Für mich deutet das darauf hin, dass sich die Kernsprache noch weiterentwickelt, weshalb ich zögere, die Sprache jetzt zu verwenden.
EDIT: Aurelius bringt einen guten Punkt:
In der ursprünglichen Antwort habe ich beschlossen, die Frage zu vermeiden: "Wird es Julia gelingen, Mainstream zu werden?" so viel wie möglich. Scheitern ist einfach; Erfolg ist schwierig. Ich denke, der beste Vergleich von Julia ist mit technischen Computersprachen wie MATLAB, R und Octave. HPC-Sprachen (Chapel, Fortress, UPC usw.) haben eine engere Zielgruppe als technische Computersprachen, und Mehrzwecksprachen (C, Python, C ++ usw.) haben eine breitere Zielgruppe als technische Computersprachen.
Etwas, von dem ich denke, dass es Julia hilft, Design für Leistung zu entwickeln, ohne die Ausdruckskraft zu beeinträchtigen. Julia ist mit kompilierten Sprachen wie C viel konkurrenzfähiger als MATLAB, R oder sogar Python. Dieses Entwurfsziel ist auch eine Funktion, die Personen aus vorhandenen Sprachen ansprechen kann, z.
Julia versucht auch, Parallelität zu erleichtern; Ich fühle mich nicht besonders qualifiziert, auf diesen Punkt einzugehen, und ich denke nicht, dass dies die Hauptattraktion der Sprache ist, aber ich denke, es ist ein Verkaufsargument, an dem sie arbeiten, und ich hoffe, andere können Licht ins Dunkel bringen.
Doch auch mit technischen Verdiensten müssen die Sprachschöpfer die nötigen Anstrengungen unternehmen, um die Sprache zu fördern und zu evangelisieren. Jeff Bezanson, Alan Edelman, Stephen Karpinski und Viral Shah arbeiten sehr hart daran, die Sprache zum Erfolg zu führen. Alan Edelman ist eng mit der Computerwissenschaft verbunden und hat bereits an Projekten auf Sprachniveau gearbeitet (insbesondere an der Star-P-Erweiterung für MATLAB). Jeff Bezanson hat die Konferenzschaltung durchgeführt, um Julia für eine Weile zu Computerwissenschaftlern und Ingenieuren zu befördern. Am MIT haben sie gute Arbeit geleistet, um Studenten und Mitarbeiter (insbesondere Steven G. Johnson) zu rekrutieren und Julia Bibliotheken hinzuzufügen. Sie haben einen Artikel in Wired und es ist ihnen gelungen, nach nur einem Jahr einen Wikipedia-Artikel für sich zu bekommen. Ihr Git-Repo hat Tausende von Sternen, Hunderte von Gabeln, und Hunderte von Uhren, so dass ihr Projekt für Open-Source-Standards ein Erfolg war. Ich denke, sie haben bis jetzt alles richtig gemacht, es geht also darum, diese Anstrengungen aufrechtzuerhalten und eine Gemeinschaft aufzubauen. Sie könnten immer noch scheitern, aber so weit zu kommen lässt mich vermuten, dass sie eine vernünftige Chance auf Erfolg haben.
quelle
Ich glaube, Julia ist es wert, gelernt zu werden. Ich habe es benutzt, um ein paar Forschungs-Finite-Elemente-Codes zu erstellen und sie sehr schnell zu erstellen. Ich war insgesamt sehr zufrieden mit meiner Erfahrung.
Julia hat mir einen Workflow ermöglicht, den ich mit anderen Sprachen nur schwer erreichen kann. Sie können es als Prototyping-Sprache wie MATLAB verwenden, aber im Gegensatz zu MATLAB, wenn Sie über einen funktionierenden Code verfügen und zur Beschleunigung Profil-Iterationen durchführen, ist das Ersetzen von Hotspots durch C-Code schmerzlos. Sie haben die Schnittstelle zu C (und Python) zu einer Priorität im Design gemacht.
So hat es mir die Sprache ermöglicht, sehr schnell von meinen mathematischen Formulierungen zu funktionalem Code und dann von funktionalem Code zu hochleistungsfähigem Code überzugehen. Ich denke, dieses Feature von Julia ist unterverkauft, aber es bietet einen enormen Mehrwert.
In vielen Fällen habe ich innerhalb weniger Stunden nach der Erstellung eines funktionalen Finite-Elemente-Codes eine C-Leistung erzielt (verglichen mit meinem eigenen C-Code). Wenn ich bisher nur Julia-Features verwende, komme ich normalerweise auf ~ 3X langsamer als C. Danach ersetze ich Hotspots durch C-Funktionen (Julia wird mit einem Stack-Sampling-Profiler geliefert, um diese zu identifizieren). Dies erfordert oft nur das Ersetzen der anstößigen Hotspot-Codezeilen durch ein "ccall", wobei Julia das Marshalling übernimmt.
Ich denke, die wichtigsten Dinge, die Julia im Moment fehlt, was mich zögern lässt, es für größere Projekte in Betracht zu ziehen, ist das Fehlen eines vollständig unterstützten Debuggers und die schlechte Unterstützung für das Plotten (im Moment ist Ihre beste Wahl beim Plotten eigentlich nur eine Schnittstelle zu matplotlib dass ich öfter Pause hatte als nicht). Sofortiges Feedback zu Code ist sehr wichtig. Ich weiß auch nicht, wie ich ohne interaktives Debuggen überleben soll, und in dieser Hinsicht bin ich von MATLAB und GDB sehr verwöhnt.
quelle
Aus meiner Erfahrung ist Julia noch nicht alltagstauglich (ich spreche von der stabilisierten Version 0.4 vom März 2016). Die Sprache selbst ist nett, reich an Funktionen und konsistent. Ein erfrischender Schritt vorwärts von Matlab und Python. Es gibt sicherlich Fälle, in denen Julia bereits in diesem frühen Stadium eine gute Wahl ist. Aber wenn Sie zuverlässige und ausgereifte wissenschaftliche Bibliotheken benötigen, kann ich den Umzug jetzt nicht empfehlen. Die Hauptprobleme, auf die ich gestoßen bin, sind:
@parallel
vor die for-Schleife zu schreiben , wo es theoretisch sein sollte.Das wird alles besser. Ich bin zuversichtlich, dass Julia eines Tages Matlab und Python in fast jeder Hinsicht überlegen sein wird. Die Chancen stehen gut, dass dafür innovative Pakete entwickelt werden. Es scheint, dass es bereits eine große Community gibt. Sogar jetzt gibt es eine Fülle von Paketen mit Anwendungsfällen, die von OpenCl bis zu Webservern reichen. Die Verwendung von Python- oder C-Bibliotheken ist sehr einfach, sodass Sie in Bezug auf die Bibliotheksverfügbarkeit wahrscheinlich nicht an eine Wand stoßen werden. Eine große Stärke von Julia wird die Leichtigkeit sein, mit der man leistungsstarke Funktionen aus verschiedenen Quellen in einer modernen und konsistenten Hochsprache zusammenfügen kann (siehe Antworten oben). Aber insgesamt fand ich es weder ausgereift noch stabil genug, um produktiv eingesetzt zu werden.
quelle