I’ve just discovered Bokeh, which I’m hoping to use to create an online application for manually labelling 3D data for my graduate students to use while they are isoloting from covid-19. The image data are large (the whole library is around 1TB), and contains sensitive (semi-anonymised) patient data, both of which limit my options for hosting it. This is currently a temporary fix to the covid-19 situation, but might be further developed if found to be useful and usable. I just need something that works well enough for the time being…
The main issue: The application runs very smoothly locally, but remote access seems to run considerably more slowly, even for what appear to be minor updates.
Currently it’s running on my Windows 10 Pro system, but I also have Ubuntu 18.04 running on another workstation that could be used.
The application currently:
- has three image widgets, each of which shows a slice from a 3D data set, sliced from a different orientation (e.g. x-y, z-y, etc; images are ~500x500 pixels);
- buttons to step through the image stack, in each orientation;
- two line plots on each image, showing the position of intersection planes with the other two images (i.e. just two simple line plots on each image);
- when images are double-clicked, points are added to a scatter plot, as part of the labelling process (this is more detailed, but beyond the scope of my question).
I think this is a fairly simple application, which I run with the ‘bokeh serve application.py’ command. When used on the local machine, it refreshes quickly and is very usable. However, I’ve tried a few approaches to deploying for remote users (in particular, using SSH tunneling, as described in the Bokeh documentation), but it runs painfully slowly… Currently it’s unusable, as each interaction taking around 6-10 seconds before seeing the relevent update in the application.
I’ve followed the Bokeh documentation for building the application: the document is generated once, when the page is first loaded, and updates to the plots and to the images (e.g. when the buttons are clicked) are coded within widget callbacks, and only the bare minimum is updated. I’m using a very basic directory structure, including an html template that simply embeds the application itself.
So - what would be my best option for hosting and running the server to get around the slow update time when used remotely? Is there an obvious approach or solution that I’m missing? Or is it simply that I’m limited by bandwidth?