Google have awesome service called Google Colab. It is a free (with some limitations, so you can't use it for production) cloud service, based on Jupyter Notebook. It provides a service for machine learning and free-of-charge access to a blazingly fast GPU and TPU.
With this service, you can easily train your model within seconds. It dose supports Python2 and Python3 out of the box, so everything should be good right?
No! I want JavaScript
But there is one problem. There is no native support in Google Colab for javascript. Thankfully I was able to hack it. Thanks to the research done in this thread (https://github.com/googlecolab/colabtools/issues/13) and some mad javascript science we can actually use Google Colab, TensorflowJs and JavaScript together
QuickStart
I have created a template that will help you to start, just open this link
https://tinyurl.com/tf-js-colab
And clone it to you Google Drive with "Save a copy in Drive..." command
Now you have your own copy of this Jupyter Notebook on your Google Drive. Execute first cell and hit F5. And thats it! 🎉🎉🎉
Troubleshooting
You will probably see this message "Unrecognized runtime javascript; defaulting to python". Don't panic! This is happening because our template uses "javascript" kernel for Jupyter notebook, but since you just created this notebook your instance (your computer/server) that is assigned to you simple doesn't have it installed.
Let's fix this by running the first cell
!npm install -g npm@latest
!npm cache verify
!npm install -g --unsafe-perm ijavascript
!ijsinstall --install=global
!jupyter-kernelspec list
You should see this at the bottom of cell output
...
added 64 packages from 62 contributors in 3.604s
Available kernels:
ir /usr/local/share/jupyter/kernels/ir
javascript /usr/local/share/jupyter/kernels/javascript
python2 /usr/local/share/jupyter/kernels/python2
python3 /usr/local/share/jupyter/kernels/python3
swift /usr/local/share/jupyter/kernels/swift
Now just hit F5. And thats it! 🎉🎉🎉
Your runtime will be reloaded and your Google Colab instance will now be running under ijavascript kernel (you can read more about it here https://github.com/n-riesco/ijavascript). Now you can write javascript for Node.js version 8 and use power of Google Colab.
If you don't see
javascript /usr/local/share/jupyter/kernels/javascript
Check formatting of the code. For some reason Google Colab tends to add/remove spaces and this brakes everything.
And if you have problems with NPM request limit "npm ERR! 429 Too Many Requests", just add Chinese NPM server to every npm install command
!npm install -g --unsafe-perm ijavascript --registry=https://registry.npm.taobao.org
Known problems
But before you go and experiment. There is two more things I need to warn you about:
1) ijavascript kernel doesn't have clean and simple way to execute shell commands, so I made a helper function for you (you can find it in template)
var { spawn } = require('child_process');
var sh = (cmd) => {
$$.async();
var sp = spawn(cmd, { cwd: process.cwd(), stdio: 'pipe', shell: true, encoding: 'utf-8' });
sp.stdout.on('data', data => console.log(data.toString()));
sp.stderr.on('data', data => console.error(data.toString()));
sp.on('close', () => $$.done());
};
With it you can init package.json, install dependencies and run some commands.
sh('npm init -y');
sh('node -v; npm -v');
sh('npm install @tensorflow/tfjs-node-gpu');
2) Do not use let, const
. Use oldschool var
instead. This is really important because of Jupyter Notebook workflow suggest that you can run code in any order you want, and run multiple times. You won't be able to do that with let or const
3) To run asynchronous code you should use $$.async()
, $$.done()
helpers. Otherwise you will lose cell output. To make this process easy I made another helper function
var run_async = async (pf) => {
$$.async();
await pf();
$$.done();
};
You can use it to run async code
var data;
// may take a lot of time to download files for the first time
run_async(async function () {
data = new MnistDataset();
await data.loadData(); // async code that fetches MNINST dataset
console.log(data.getTrainData());
})
4) After some time your instance (computer/server) will be destroyed and when you attempt to execute any javascript you will see parse error messages. To fix them just execute first cell ones more and hit F5.
Why javascript
Well there is a some of reasons why I prefer JavaScript (TensorflowJS) for Machine Learning:
- Javascript is most used language in the world. According to Github and StackOverflow
-
TensorflowJS is on par and some times even faster then Tensorflow (python) version
-
With JavaScript I can get clean 20-30 fps for Face detection and share it with everyone in the world without buying $$$ hardware
-
We have awesome Russian and English speaking TensroflowJS communities here in Telegram chat-app with 400 people and growing
Javascript is awesome!
So what's the benefit?
Why should we suffer, use all this helpers. Why not use your MacBook? The reason is that even for small dataset like MNIST and simple CNN model you can get 3-7x performance improvements. Nice! :)
And with this, finally, you can achieve Silence of the FANS...
PS: On the next article I will tell you how to download and upload data to Google Colab
Top comments (2)
thank you Alexey, for your writeup. What type of macbook did you use for testing?
MacBook Pro (15-inch, 2018) - 2,2 GHz Intel Core i7 (there is no Nvidia GPU on this MacBook :/)