Introducing TensorFlow.js: Machine Learning in JavaScript
medium.com
medium.com
[tensorflow.js](https://github.com/tensorflow/tfjs)
[mxnet.js](https://github.com/dmlc/mxnet.js/)
[propel.js](https://github.com/propelml/propel) - this uses tensorflow.js under the hood
[ml5](https://github.com/ml5js/ml5-library) - also uses tensorflow.js
[webdnn](https://github.com/mil-tokyo/webdnn)
[brain.js](https://github.com/BrainJS/brain.js)
[mljs](https://github.com/mljs/ml)
[synaptic](https://github.com/cazala/synaptic)
edit: added the ml5 lib mentioned in a subsequent comment.
...I'm the maintainer
convnetjs https://cs.stanford.edu/people/karpathy/convnetjs/
I think the author of these also had one for reinforcement learning.
It has always seemed like data science and machine learning tasks have always been most popular in dynamic languages like Python, Julia, and R. I really hope this can be a bridge over to typed machine learning APIs!
(Of course, I’m also interested to hear about your favorite typed machine learning library if you have some that you already use)
Flux is essentially nothing but some clever use of Julia's type system:
https://github.com/FluxML/Flux.jl
There's some ability to generate javascript too, which you can try here: http://fluxml.ai/experiments/mnist/ . Edit: I see it's actually using deeplearn.js == TensorFlow.js for this, details at https://github.com/FluxML/FluxJS.jl
I'm really looking forward to a superior dev experience with writing ML code once great autocompletion kicks in
Actually, it already ships with typescript definitions - it's written in TypeScript![1]
[1] https://github.com/tensorflow/tfjs/blob/master/src/index.ts
https://beta.observablehq.com/@jashkenas/sentiment-analysis-...
... or just have fun watching it analyze random Metacritic reviews of ”The Last Jedi”.
"This is very good as in a very good cancer. It is as good as a dirt burger."
Positivity 0.9992088079452515
It'd be cool to see more demos like the ones on the https://tenso.rs/ website. Seems like they were using their own hand rolled library though.
[0]: https://deeplearnjs.org/ [1]: https://github.com/propelml/propel
There are already some cools demos built with tensorflow.js(https://deeplearnjs.org/demos/performance_rnn or https://teachablemachine.withgoogle.com)
There's also a high-level library built on top of tensorflow.js that makes it even easier to use some common ML methods: https://github.com/ml5js/ml5-library (disclosure: I'm part of the team developing it)
I don't know what the issue is it tells me to download chrome.
The Graphistry team and ccri have been investing on zero-copy nodejs bindings to the full ecosystem, eg, leverage full TenserFlow, AWS GPUs, CuDNN, SciPy, pandas, dask, multigpu, MapD, etc. If you're a node hacker, this is an open effort -- contributors welcome! You can reach me at leo@[ graphistry], and I'll be publishing some JS roadmaps summarizing recent meetings and release directions.
"TensorFlow.js automatically supports WebGL, and will accelerate your code behind the scenes when a GPU is available."
imply that you can get all the benefits of GPU-accelerated machine learning on any old GPU---not just CUDA-compatible Nvidia GPUs?
For example, if you've got one of those 15 inch Macbook pros with a GPU, can you use TensorFlow.js to train a model at comparable (even if not identical) speed to a custom deep learning box?
Does the WebGL integration mean it doesn't require installation of CUDA or cuDNN on the machine it's running on? That's currently the most difficult part by far of getting GPU-enabled TensorFlow up and running in Python.
Additionally, can it work with non-NVIDIA GPUs? That is another fairly stringent current limitation for those that don't want to cough up the dough for an NVIDIA card or pay for cloud service.
Right now, just to consume ML models - whether as a application developer or an end user - requires some combination of special skills that fall in a spectrum of complexities - from something relatively simple like installing a system package or an environment like Anaconda or a pip package, to something much more complex and time consuming like building TF or Caffe.
ML in browser bypasses all of that.
You seem to be conflating producing ML models -- i.e. doing machine learning -- with "consuming" ML models -- i.e. asking the learned models to make a prediction. You don't need any ML in the browser to do the latter. And I can't see why you'd do ML in the browser to do the former...
Not conflating - the benefits apply equally to both learning and inference, but since there are magnitudes more potential consumers of inference than learning, I emphasized it.
It's true that one doesn't need any of this, but my point is not having them in browser means there are barriers put up - of complexity, of costs, of privacy, of effort - to developers and end users.
I'll use face recognition as a walkthrough example, but this applies to absolutely any ML use case if you think about all the steps involved in taking it from idea to development to deployment to end use.
Take a problem I've worked on a bit - intelligently searching through personal photos and videos. Most people have atleast a few hundreds of GBs of photos and videos - family photos, pets, travels - in aggregate across all their devices. Some may feel the need for search software that can answer questions like "find me that photo with Alice (user's daughter) playing with Scooby(user's dog) from 10 years ago".
In a world without browser ML, how would a developer design, develop and deploy this with maximum convenience for both development and end use? Maybe like this...
- dev starts off by deciding they don't want to mess with any of that ML stuff. Their skills lie in front-end design and usability. They decide to go with Amazon's or Google's face recognition service (IDK if AMZ/GOO actually have such a service, but if they did, it's reasonable a dev would look at them as the first option).
- But they soon find out it's just shifting the complexity elsewhere. Now, they have to provide a way for users to upload their hundreds of GBs of media to S3 or GCS. Which means more APIs to learn and integrate. More costs for storage. Usability barriers and privacy suspicions for users. Security aspects have to be looked into. Looks like it'll have to become a paid service now.
- The service by itself is not enough. Dev still has to provide the front-end (which they are skilled at) for users to select photos, crop faces, apply labels, and send it all to the service's transfer learning API.
- After all that, some users complain that accuracy is not good enough because it couldn't find many photos. Dev has no way to tweak the models because those are behind another company's opaque service. It's increasingly looking like a custom backend is necessary.
- So version 2. Dev learns some ML. Then downloads a pre-trained model that can do face detection and recognition - say FaceNet or OpenFace.
- They have to deploy it server-side for training and indexing. They learn a bit of Nginx and WSGI, and deploy it. They don't know how many users will use and how much data will be uploaded - have to plan automated scaling for that. EC2 or GCE? More stuff and more APIs to learn, and more costs.
- Dev still has to provide the front-end for users to select photos, crop faces, apply labels, and upload to their learning service. Dev has to implement per-user transfer learning and store per-user transfer data and models.
- Dev has to implement all the required provisioning for inference and transfer learning - be it raw GPU servers or docker or K8s or whatever. More costs.
- For an end user, the need to upload hundreds of GBs of personal media to a 3rd party is also a barrier - takes time, loses privacy and likely incurs bandwidth costs.
- So version 3. Dev says forget the server-side. User already has GBs of photos in their hard disks. Instead of bringing their photos to us and managing it, let's take the software to them. Let's just package up everything and allow user to download and use the entire thing on their local machines. Maybe as platform-specific installables. Or as platform-neutral docker image. Reduces costs and complexity for developer. Can even be free since there are no costs incurred by developer. Android's still a problem since it can't do docker, and dev doesn't know Android app development.
- The end user too benefits with far better privacy and usability. However, they still have to install a package - sounds easy, but in a world of "user does not have administrative privileges" and "sudo", there are still potential barriers to cross. And Android is still a no-go because the dev doesn't know it.
Now in a world with browser ML, you can see how those remaining problems too can be solved. Javascript ML is write once, run on any browser - even Android's. User does not have to install anything. Dev does not have to write anything specifically for a different platform. All the transfer learning and inference can happen in user's browser.
The browser environment still presents some barriers - such as not being able to access local photos directly without user selecting them, and limited local storage for models. But both can be solved with some creative batching and using solutions like emscripten's virtual file system in memory (I'm not sure if TF.js uses the latter, but other frameworks like OpenCV.js do). User pays some cost of reduced usability, which they may be ok with since they may see the alternative options as being worse. And the privacy is matchless.
All this is applicable to any ML use case. Anything involving user's private data such as speech recognition or document scanning/OCR too get the exact same benefits for both developers and users.
So can you think of use cases for using ML in an app (native or desktop?) Many of those would be good to have in the browser as part of a web app too.
I was digging around to find it, it's called deeplearn.js, and upon checking it looks like that project has officially moved to the one referenced in this very post.
- [0] https://www.robinwieruch.de/machine-learning-javascript-web-...