The load time improvements are amazing. Thanks to everyone that was involved. I've been using it locally for months now simply because of this feature and I had to update my "how to deal with compile-time" blog post (https://sciml.ai/news/2022/09/21/compile_time/) to basically say system images really aren't needed anymore with these improvements. With that and the improvements to parallel compilation I tend to not care about "first time to X" anymore. To me it's solved and I'm onto other things (though I personally need to decrease the precompilation time of DifferentialEquations.jl, but all of the tools exist in v1.10 and that's on me to do, ya'll have done your part!).
Additionally:
* Parser error messages are clearer
* Stack traces are no longer infinitely long! They are good and legible!
* VS Code auto-complete stuff is snappier and more predictive (might be unrelated, but is a recent improvement in some VS Code things)
Altogether, I'm pretty happy with how this one shaped up and am looking forward to static compilation and interfaces being the next big focus areas.
For historical reasons I'm typically skeptical of claims that "TTFX" have improved. However, I just tried out Julia 1.10 and it is noticeably quicker than the last version I was using (1.8).
It takes some time to precompile packages, but once that's done I'm seeing the first plot pop up in fractions of a second.
Compliments to the Julia team! I'm looking forward to trying out this new version.
I think v1.9 is where most of the magic happened there — packages gained the ability to list out their precompilation work during installation, which reduced compilation (and associated invalidations) at runtime.
Just wanted to say I appreciate all the Julia content and evangelism you put out. It's kept me excited for the language and is a big reason I still use it for most of my personal work.
I used Julia to build a macroeconomic model (DSGE-VAR) during my econ studies. I liked the conceptual decisions and the language per se (ie as a spec), but DX was quite bad: low discoverability of features and proper typings, clunky metaprogramming, long compilation times, impossibility of struct redefinitions in REPL. My interest died pretty fast because of it.
At the very least Tom Sargent and the New York Fed see it differently so you may by the odd man out. If you haven’t checked out the quant Econ project you are missing a great resource for exactly the problems you are working on.
My experience was exactly the same. This is probably unfair, but I got the impression that the people who made Julia never actually.. used it? But of course that can't be true so maybe my work flow was just significantly different than theirs?
Not a fan of Python at all but now I just stick with that for my quant analysis. Tons of issues with Python too but atleast they are all known / well documented problems (also chatgpt knows pandas / matplotlib / python very well).
It does take some asking around to discover the optimal Julia workflow with Revise.jl, PkgTemplates.jl, VSCode settings/debugger, Pluto.jl, but now it's probably my best development experience. Julia 1.10 improves much of this as well.
Just realized that these release notes are missing added support for public use of atomic pointer ops. Julia has had support for atomic operations for a while in various forms but now users can use `unsafe_load`, `unsafe_store!`, `unsafe_swap!`, `unsafe_replace!`, and `unsafe_modify!` with an `order` argument.
btw, there has been a pretty nice effort of reimplementing the tidyverse in julia with https://github.com/TidierOrg/Tidier.jl and it seems to be quite nice to work with, if you were missing that from R at least
As much as it pains me to say it, I don't think Julia will.
It looks to me like the practical problems with Julia, while addressable, are being addressed too slowly.
There is simply too many rough edges and usability problems as it is now, and at the current pace it will take maybe 10 or 15 years to address them.
On the other hand, the major use case for Julia is to have a fast, dynamic language. And it seems to me the time horizon for Python to become fast, or Rust or C++ to become dynamic is indefinite, so Julia is still the best bet in that space.
Although I mostly agree with this sentiment and have deep concerns about Julia's flaws, I will say that Julia has a very high ceiling. If the right concerns were addressed in a timely manner, I wouldn't be surprised to see its adoption rate accelerate.
Ahhh, interesting. That looks to me like it's more appropriate for "multiple threads working on independent problems" than "multiple threads working on the same problem" due to the potential serialization overhead and limitations.
Each thread has its own lua_State. However, we provide a serialization scheme which allows automatic sharing for several Torch objects (storages, tensors and tds types). Sharing of vanilla lua objects is not possible, but instances of classes that support serialization (eg. classic objects with using require 'classic.torch' or those created with torch.class) can be shared, but remember that only the memory in tensor storages and tds objects will be shared by the instances, other fields will be copies. Also if synchronization is required that must be implemented by the user (ie. with mutex).
That's not general-purpose multi-processor threading, that's solving it for a very specific sub-problem.
I don't think so, not the core language at least. In my tests I think I saw a 20-30% improvement at best compared to versions from 5 years ago. Not saying that that's still not a great job from the core maintainers, but I don't think Julia has to fear python getting fast. The issue is more that python is getting to the point where the ML ecosystem has already accepted using a slow language as long as everything around it is fast.
Though as I said before, sometimes no amount of c++/c escape hatches can improve performance since you have to use python objects at some point or another and that will be the bottleneck. But by then, you won't needing some of the stuff Julia offers like the REPL and notebooks etc.
I haven't used Julia a lot but to me it's in a weird spot where it would be ideal to start projects with in theory since you won't need to outgrow the language you are starting with, since it's fast enough and has a pretty good/maintainable/sane design. But then you are sacrificing so much and will need much more time to get started that you might not ever get to that point anyways.
Just as an example, debugging obscure problems or deploying pytorch models that are more custom in prod is already pretty daunting at times, and it's the "best" and most popular ML framework in the world. I can't imagine how much more time consuming it would be when using a much smaller/less used library/framework.
So yeah all of that to say that being way faster isn't how Julia will win. Maybe a push from an influent player/big tech might give it the momentum it needs.
Cython is pretty nice, especially for wrappers around C. Julia’s ccall is honestly even better.
Numba is also really nice, and for just compiling against arrays I like it better than Cython. Neither help if you need data structures or abstractions, though.
It has already taken off and found its not so small niche. I don't think it will ever be one of the "big 10" languages (by users), but it has already a _big_ user base.
Any page like that which is industry relevant is going to have to be associated with a company because you need the marketing team to go through the effort to get the case studies approved by each and every company. It's not an easy process since for example something like the Instron case study (https://juliahub.com/case-studies/auto-crash-simulation/) has details of upcoming projects like the Catapult Light which are major cost improvements passed on to customers, but you then have to go through the whole process of "well should we share this and let our competitors know what we used to get this advantage?" and contracts have to be signed before such a page can ever be built. The JuliaHub website has a whole list of case studies which have undergone this process and I couldn't see how you would get such detailed industrial accounts otherwise.
For open source accounts, there's the SciML showcase page https://sciml.ai/showcase/. Thats very focused in just one domain though, and I tend to just update it with what I remember to put in there so it probably only has about 1/4 of the blogs and news articles that it should, and the "External Applications Libraries and Large Projects using SciML" part is woefully incomplete, but at least it gives a picture of what's going on. It's hard to keep those kinds of pages up to date because exponential growth means that page requires exponential work.
Julia was ahead of the game with automatic differentiation which took a few years for Python to get support. And it's still ahead of the game with integrating machine learning with scientific modeling. Macros and multiple dispatch are a game changer, and it allows people to hack and iterate on Julia far easier than on Python.
And don't get me started on how nice JuMP.jl is for mathematical optimization.
Theano existed, but it didn't use autodiff at the time, most loss functions had preprogrammed derivative functions. Python first had native autodiff in June of 2013 with the ad package, but previously had bindings to Fortran and C++ libraries that supported autodiff in different use cases. Julia first had native autodiff in April of 2013 with ForwardDiff.jl.
It seems overly nitpicky to differentiate (no pun intended) so much between forward mode AD with DiffRules and theano's specific flavor of symbolic differentiation, but I'm no expert there.
JuMP is cool, but honestly...I find the native Python APIs from CPLEX & GUROBI to be best. The additional abstraction of JuMP or the Python equivalent frameworks always is a pain to me as I don't need to switch solvers often.
scientific models and simulations can be and are made very successfully in julia. In particular the diffeq landscape is probably the languages largest comparative advantage
That’s a broad area. I work in astrodynamic simulations, and don’t know anyone doing much work in Julia. Maybe a couple of grad students playing with it, but that’s it. 99% of the work is Python, Fortran, and C/C++.
Are there subdomains that use it a lot? I am not sure what the diffeq landscape is exactly although it sounds related to dynamical simulations?
I'm sure there are other subdomains that make use of Julia, but in particular I think if your problem involves writing an evolution-like or agent-based-model-like simulation you may find the strengths of Julia particularly compelling
One of the things I don't like about the Julia ecosystem is the monolithic libraries that have tons of dependencies. DiffEq is one of those. I think its fine to write a script but if you want to develop something more sophisticated, you want to keep your dependencies lean.
You can always (slightly) reduce the DiffEq dependencies by adding OrdinaryDiffEq.jl instead of the meta DifferentialEquations.jl package. But lots of those dependencies arise from supporting modular functionality (changing BLAS, linear solvers, Jacobian calculation methods, in vs. out of place workflows, etc.). That said, the newer extension functionality may let more and more of the dependencies get factored out into optional extensions as time goes on.
A large part of why I started using Julia is because calling into other languages through the C FFI is pretty easy and efficient. Most of the wrappers are a single line. If there is not existing driver support, I would pass the C headers through Clang.jl, which automatically wraps the C API in a C header.
After looking at Mojo, I appreciated all the paradigms that Julia was pushing forward even more than I did before. Mojo's greatest asset and curse is focusing on being a better Python. Julia's greatest asset and curse is trying to do a lot more.
What other private company languages are there? Swift is the best example I can think of, which matches Mojo's situation down to the head of the project.
aren't most languages invented and initially developed within a private company? Go, Dart, Java, JavaScript, C#, F#, VBA, Kotlin, Erlang, C(at AT&T), Rust (at Mozilla). The list is probably very long
Most of those are open source, and while initially developed at a private company, most are run by non-profits (such as the Rust Foundation for Rust). Also, the language itself is not usually the main product at those companies.
The person in charge of Mojo was previously in charge of a massive effort to give tensorflow a new backend, for which he conveniently picked Swift (a language he was also involved in), despite there being better options, only to abandon it halfway through because it was intractable and Swift wasn’t ready/willing to support the compiler changes needed, so he just abandoned it, and now works on Mojo.
It gives real “Jony Ive leaving Apple to go work somewhere where nobody can tell him ‘no’ “ vibes.
Not quite. There's a bunch of knobs you can use to get small binaries (I use this for industrial deployments often), but Jeff Bezanson gave a really nice talk at JuliaCon Local Eindhoven 2023 that described the reasons for the large binaries, what the memory is actually attributed to, and what to do about it (https://youtu.be/kNslvU3WD4M?si=hwo9AgXthNpiQ3-P). With the "normal options" you get to about 15MB now, still bad but not half as bad. The vast majority of that is the base system image. Jeff's talk then goes into the next steps with reducing the size of that base system image.
Nothing is the correct answer there because there are no properties. `x.y` for any y is an error, so that is correct.
If what you're trying to do is instead discover functions which are compatible with a given signature, you can use what is described in the other post:
which shows all of the dispatches that match an argument set and thus the functions that can be called on it. Generally the IDE completions do a bit nicer display of that then the REPL though.
Lux is similar to Flax (Jax) where the parameters are kept in a separate variable from the model definition, and they are passed in on the forward pass. Notably, this design choice allows Lux to accept parameters built with ComponentArrays.jl which can be especially helpful when working with libraries that expect flat vectors of parameters.
Flux lies somewhere between Jax and PyTorch. Like PyTorch, the parameters are stored as part of the model. Unlike traditional PyTorch, Flux has “functional” conventions, e.g. `g = gradient(loss, model)` vs. `loss.backward()`. Similar to Flax, the model is a tree of parameters.
Additionally:
* Parser error messages are clearer
* Stack traces are no longer infinitely long! They are good and legible!
* VS Code auto-complete stuff is snappier and more predictive (might be unrelated, but is a recent improvement in some VS Code things)
Altogether, I'm pretty happy with how this one shaped up and am looking forward to static compilation and interfaces being the next big focus areas.