Swift for TensorFlow Design Overview
github.com
github.com
You can use numpy from swift..As well as load pickle files !
https://github.com/tensorflow/swift/blob/master/docs/DesignO...
I also just really like Chris' work and trust him to make the right calls until proven otherwise.
Swift is a good choice because there are some reasonably good mobile targets, which Julia does not have. If you're deploying a ML model, you should use swift. If you're developing one, you should use julia.
At the moment, Swift is really only viable for Apple devices. Any other mobile targets are a distant dream.
Lattner et al. outright says that "[We] picked Swift over Julia because Swift has a much larger community, is syntactically closer to Python, and because we were more familiar with its internal implementation details - which allowed us to implement a prototype much faster." and I only buy the last point – which, mind you, is an argument I would have made as well if I was sitting on a whole team specialised in a language. They acknowledge that “Julia is another great language with an open and active community”, so I would hardly say that your “unreliable” statement is shared by them.
Apart from the very strong practical argument made above, I think “Deployment” is really what it boiled down to. When Google launched TensorFlow, the general sentiment among many in the research community was “why”? As in, why this big move on the part of a major corporation? Back then I stated that the reason I saw was that for better or for worse, Google – and many others – see a future where Machine Learning (or Artificial Intelligence, if you prefer) would be embedded into almost any product. For this to be feasible, you need: know-how throughout the company, see the excellent TensorFlow tutorials/training, and the ability to deploy models across their entire spectrum of devices/environments. This is what it would mean to be an “AI first company”. One of the reason why TensorFlow at its core is a static graph, I would bet is because they saw deployment as key back then, as they do now.
However, TensorFlow is the very embodiment of the “two language problem” [1]; as anyone that tries to wrap TensorFlow in language X quickly realises, pretty much everything you care about on a high level of abstraction is written in Python and the underlying C++ API is about as bare bone as it gets. Fun fact, this is why TensorFlow.jl [2] goes through both the Python and C++ API. Now, add to this that PyTorch recently arrived on the scene and quickly became a very real “threat” to TensorFlow since dynamic graphs (eager execution) is far more intuitive to work with and enables you to express a richer set of models. However, it suffers from deployment issues since it is intrinsically tied to the Python interpreter. TensorFlow Eager was most likely a stop-gap measure and it was perceived to be clunkier than PyTorch, also after TensorFlow Fold being left to rot I sincerely doubt that many are willing to buy into yet another code branch to interoperate with TensorFlow “proper”. This all sets the stage for the TensorFlow Swift announcement.
[1]: https://julialang.org/blog/2012/02/why-we-created-julia
[2]: https://github.com/malmaud/TensorFlow.jl
From my academic perspective, this is a great time to be a Machine Learning researcher; we have plenty of options and the attention we are receiving from other software and hardware communities is amazing. As for Swift “vs” Julia, they both have their own issues.
Swift has a non-existing scientific computing community (this is why I find the “much larger community” argument disingenuous, as mobile application developers do not count in this particular case), they will have to build it entirely from scratch and community building is difficult. But they have the power of Google and its minions to work on the software itself (Hello DeepMind employees, have you gotten over the sour taste in your mouth from being forced to switch from Torch (Lua) to TensorFlow (Python) yet? I suspect Mountain View has ordered another meal for you!), perhaps this is sufficient to overcome the current lack of a community? Time will tell. There is also the problem of external collaboration that we have seen with TensorFlow, while it is open source the direction of the development is partially hidden which makes bringing in open source contributors trickier than necessary – think, no unified public forum where things are discussed.
Julia, while it has a (strong?) scientific computing community, it lacks static compilation from the perspective of “deployment” and is ultimately a team of ragtag researchers and open source contributors spread across the globe. Can they keep up? Again, time will tell. There is also the classic “issues” with Julia not being statically compiled, but I can see this swing either way depending on the overall direction in preference for static vs dynamic over the next decade.
Ultimately, they are both on top of LLVM and I suspect that much will be learnt from the other; there is room for more than one approach. My decision to side with Julia is partially to stay my own course, partially a preference for “the bazaar” development model, and partially because I have a hunch that Julia has a better chance to capture the scientific computing community as a whole which is likely to yield benefits down the line. As I said before, time will tell.
And then once Julia can reliably compile to web assembly (already being worked on), your entire app (front, back and ML ) will work in the browser.
What's the story of Swift for Android nowadays? Last time at looked it didn't seem a practical idea... I mean, even Google chose Dart of all languages for their Flutter cross-platform mobile toolkit. And on the native side Kotlin is gaining all the ground.
To be honest I'd love to see Swift instead of Kotlin and other things for cross platform mobile...
1. Someone would write a 100% source compatible swift version for the JVM or at least a large enough subset leaving out the parts which handles memory directly.
2. Someone develops an easy to use framework to bridge Swift through the NDK (There would be a layer of C needed to talk from Swift to the JVM code and vice versa).
Option 2 is the more realistic approach i guess, but this would heavily effect the architecture of the apps built with this. Everyone who has tried to do the same with C++ (which is supported from the NDK directly) and wanted to have as much code platform independent as possible knows that.
I see the use of Kotlin Native more promising here in the future. As far as i know they have already interoperability with Obj-C / Swift implemented. You could write your Android App completely in Kotlin leaving out the horrible NDK part, because everything is running on the JVM and use Kotlin Native + Swift in the iOS version.
I know nothing more about it, but it looks worth checking out.
Super cool to see this implemented at the language level like this.
That being said, you can use Swift through WSL, but not directly on Windows.
I thought so too, but i've checked the instructions to build on windows, and now there's a way to build it natively using Visual Studio cl(or clang-cl).
Following the instructions here, it worked for me.
https://github.com/apple/swift/blob/master/docs/WindowsBuild...
There's upstream (in-tree) support for Darwin, Linux, Windows, Cygwin, FreeBSD, Android, PS4, and Haiku. But most of those don't have CI support yet.
Same is true for architectures. There's support for ARM, i386, x86_64, PPC64 (BE + LE), and s390x.
IIRC there's been some talk about how to extend the CI infrastructure to support more executor environments, but so far I don't think it's been a high enough priority.
Using the prebuilt binary for ubuntu with the WSL is WAY more userfriendly.
Another problem problem is proper tooling. So far my experience with the LSP implementation is a bit dissapointing..
The API's not stable, the framework is in very active development.
I imagine things will settle down in a year or two - until then, there are so many great alternatives (other languages), that I don't see Swift gaining much ground.
[1]: https://vapor.codes
In terms of "level of abstraction" vs "Speed", Swift is definitely at a Pareto-Optimum (if that's the term for "can't get better in one dimension without losing something in the other).
Microbenchmarks aren't the be-all yada yada yada... And it's somewhat ironic that the server framework is named Vapor. But for web apps that are computation-heavy, I think it would be a valuable option to have.
I drop in on the Vapor Slack group occasionally. I heard someone mention that version 3.0 was passing Go in benchmarks. Apparently they had some performance regressions integrating nio (it was just released last month) - not sure what the status is now.
And if your making a backend, why not use kotlin which is fairly similar, but you get the entire java ecosystem?
Some benefits vs Python are static types (catching more errors at compile-time vs hours into a training run), no GIL, don't have to drop to C++ for higher performance.
Some benefits vs some other (non-Python) languages are a shallow learning curve, small boilerplate, safety-by-default, and a growing community.
Obviously there are places where Python and others have advantages over Swift too, and several of those are called out in the paper.
I think I actually stopped caring so much because the recovery is so fast.
Big help for me was coding a little script that means I can just send a notification to my android from from cli and/or python, so I know when these things need attention.
But, static typing could help provide much more useful error messages than what you get from the Python code.
But no GIL is the most important part. Multithreaded preprocessing data input to the network is almost a must these days, but that is hard to achieve in Python. Multiprocessing or that PyTorch magic alleviates the problem, but they are not as high performant as multithreading.