This is awesome! Can you describe how you implemented the WebGL ops a bit more? Did you have to write your own convolution kernel with GLSL for example?
Thanks! For WebGL, credit goes to https://github.com/waylonflinn/weblas. I only really use GEMM, but it works quite well. In keras.js, convolution is implemented with the oft-used im2col transformation to turn it into a matrix multiply followed by reshape. Convolution kernels directly GLSL could potentially provide speed gains I'm sure, but I can't even imagine writing it for tensors of arbitrary shape.
What sort of performance can be expected compared to running in the terminal? How large NNs will this scale to in practice? I see a 50-layer resnet is mentioned; but not 1000-layers?
You mean with tensorflow or theano as the backend? They have all kinds of optimizations that isn't possible to replicate here yet. There is certainly room for optimization! Also, 1000-layer resnets should theoretically be possible, but probably isn't that practical. Lots of exciting work happening in searching for more efficient architectures.
On these demos, I'm getting several seconds on the imagenet inception v3 recognition on an i7 macbook pro (nvidia gpu), on both gpu and cpu modes.
I've built tensorflow for android, running inceptionv3 trained on imagenet and it's much faster, running just on mobile CPU pretty much realtime, around 5fps. On a desktop CPU/GPU it's obviously even faster
Thanks. Nothing fancy with the network architecture diagrams. The layers are just div elements with the layer name as the id. There's a definition of inbound/outbound connections by layer names, extracted from the keras json config, which is used to draw SVG paths.
Very cool. Didn't work on Android (Chrome) either in GPU or CPU mode.
Usual tricks like pruning the model and quantising to 8bit should get the model sizes down significantly from 100mb. Or using an architecture like squeezenet
Wonderful! And because all praise comes with work in OSS: I wish the network diagram would show intermediate states where possible. I've seen some examples where – with the right presentations – they gave fantastic insights into the network's "thinking".
27 comments
[ 3.2 ms ] story [ 74.4 ms ] threadSee code for example https://github.com/transcranial/keras-js/blob/master/src/Ten... or code on weblas github repo.
https://www.nervanasys.com/winograd-2/
I doubt training performance would be very fun.
I've built tensorflow for android, running inceptionv3 trained on imagenet and it's much faster, running just on mobile CPU pretty much realtime, around 5fps. On a desktop CPU/GPU it's obviously even faster
i'm not sure that's a big benefit really
https://github.com/heuritech/convnets-keras
I don't think they expect people to train them in the browser, just run the pretrained ones for image recognition or something
This might have the most value as a Node transport though.
Usual tricks like pruning the model and quantising to 8bit should get the model sizes down significantly from 100mb. Or using an architecture like squeezenet
https://github.com/dguest/lwtnn
The idea is to have something lightweight that we can easily copy into our analysis framework (which is written in C++).
If anyone reading this knows of a library that already does this it could save us some time.