Hacks

Negli ultimi 10 anni, c’è stata un’esplosione di interesse nel “calcolo scientifico” e nella “scienza dei dati”: cioè l’applicazione del calcolo per rispondere a domande e analizzare dati nelle scienze naturali e sociali. Per rispondere a queste esigenze, abbiamo visto una rinascita dei linguaggi di programmazione, degli strumenti e delle tecniche che aiutano gli scienziati e i ricercatori a esplorare e comprendere i dati e i concetti scientifici, e a comunicare i loro risultati. Ma fino ad oggi, pochissimi strumenti si sono concentrati sull’aiutare gli scienziati a ottenere un accesso non filtrato al pieno potenziale di comunicazione dei moderni browser web. Così oggi siamo entusiasti di presentare Iodide, uno strumento sperimentale destinato ad aiutare gli scienziati a scrivere bei documenti interattivi utilizzando le tecnologie web, il tutto all’interno di un flusso di lavoro iterativo che si sente simile ad altri ambienti di calcolo scientifico.

Iodide in azione.

Oltre ad essere solo un ambiente di programmazione per creare documenti viventi nel browser, Iodide tenta di rimuovere l’attrito dai flussi di lavoro comunicativi mettendo sempre insieme lo strumento di editing con il documento leggibile pulito. Questo si discosta dagli ambienti in stile IDE che producono documenti di presentazione come i file .pdf (che sono poi separati dal codice originale) e dai notebook basati su celle che mescolano codice ed elementi di presentazione. In Iodide, puoi ottenere sia un documento che ha l’aspetto che vuoi, sia un facile accesso al codice sottostante e all’ambiente di editing.

Iodide è ancora in uno stato alpha, ma seguendo l’aforisma di internet “Se non sei imbarazzato dalla prima versione del tuo prodotto, l’hai lanciato troppo tardi”, abbiamo deciso di fare un lancio morbido molto presto nella speranza di ottenere un feedback da una comunità più ampia. Abbiamo una demo che potete provare subito, ma aspettatevi un sacco di bordi grezzi (e per favore non usate questa alpha release per lavori critici!). Speriamo che, nonostante i bordi grezzi, se strizzate gli occhi sarete in grado di vedere il valore del concetto, e che il feedback che ci darete ci aiuterà a capire dove andare dopo.

Come siamo arrivati a Iodide

La scienza dei dati in Mozilla

In Mozilla, la maggior parte del nostro lavoro di scienza dei dati è focalizzato sulla comunicazione. Anche se a volte implementiamo modelli destinati a migliorare direttamente l’esperienza dell’utente, come il motore di raccomandazione che aiuta gli utenti a scoprire le estensioni del browser, la maggior parte del tempo i nostri scienziati dei dati analizzano i nostri dati al fine di trovare e condividere intuizioni che informeranno le decisioni dei product manager, degli ingegneri e dei dirigenti.

Il lavoro della scienza dei dati comporta la scrittura di molto codice, ma a differenza dello sviluppo del software tradizionale, il nostro obiettivo è quello di rispondere alle domande, non di produrre software. Questo tipicamente si traduce in un qualche tipo di rapporto – un documento, alcuni grafici o forse una visualizzazione interattiva dei dati. Come molte organizzazioni di scienza dei dati, in Mozilla esploriamo i nostri dati usando strumenti fantastici come Jupyter e R-Studio. Tuttavia, quando è il momento di condividere i nostri risultati, di solito non possiamo consegnare un taccuino Jupyter o uno script R a un decisore, quindi spesso finiamo per fare cose come copiare le cifre chiave e le statistiche riassuntive in un Google Doc.

Abbiamo scoperto che fare il giro dall’esplorazione dei dati in codice alla creazione di una spiegazione digeribile e viceversa non è sempre facile. La ricerca mostra che molte persone condividono questa esperienza. Quando uno scienziato di dati sta leggendo il rapporto finale di un altro e vuole guardare il codice dietro di esso, ci può essere un sacco di attrito; a volte rintracciare il codice è facile, a volte no. Se vogliono tentare di sperimentare ed estendere il codice, le cose ovviamente diventano ancora più difficili. Un altro scienziato dei dati potrebbe avere il tuo codice, ma potrebbe non avere una configurazione identica sulla propria macchina, e impostare ciò richiede tempo.

Il circolo virtuoso del lavoro della scienza dei dati.

Perché c’è così poco web nella scienza?

Sullo sfondo di questi flussi di lavoro della scienza dei dati in Mozilla, alla fine del 2017 ho intrapreso un progetto che richiedeva la visualizzazione interattiva dei dati. Oggi è possibile creare visualizzazioni interattive utilizzando grandi librerie per Python, R e Julia, ma per quello che volevo realizzare, avevo bisogno di scendere a Javascript. Questo significava allontanarsi dai miei ambienti preferiti per la scienza dei dati. I moderni strumenti di sviluppo web sono incredibilmente potenti, ma estremamente complicati. Non volevo davvero capire come ottenere una completa toolchain di compilazione Javascript con ricaricamento a caldo dei moduli, ma a parte questo non riuscivo a trovare molto che mirasse a creare documenti web puliti e leggibili all’interno del flusso di lavoro iterativo che mi è familiare.

Ho iniziato a chiedermi perché questo strumento non esistesse – perché non esiste un Jupyter per costruire documenti web interattivi – e presto mi sono spinto a pensare al perché quasi nessuno usa Javascript per il calcolo scientifico. Tre grandi ragioni sono saltate fuori:

  1. Javascript stesso ha una reputazione mista tra gli scienziati per essere lento e goffo;
  2. non ci sono molte librerie di calcolo scientifico che funzionano nel browser o che lavorano con Javascript; e,
  3. come ho scoperto, ci sono pochissimi strumenti di codifica scientifica che permettono cicli di iterazione veloci e garantiscono anche un accesso senza filtri alle capacità di presentazione nel browser.

Sono sfide molto grandi. Ma mentre ci pensavo di più, ho iniziato a pensare che lavorare in un browser potrebbe avere alcuni vantaggi reali per il tipo di scienza dei dati comunicativa che facciamo in Mozilla. Il più grande vantaggio, naturalmente, è che il browser ha probabilmente l’insieme più avanzato e ben supportato di tecnologie di presentazione sul pianeta, dal DOM a WebGL a Canvas a WebVR.

Pensando all’attrito del flusso di lavoro di cui sopra, mi è venuto in mente un altro potenziale vantaggio: nel browser, il documento finale non deve essere separato dallo strumento che lo ha creato. Volevo uno strumento progettato per aiutare gli scienziati a iterare su documenti web (fondamentalmente web app monouso per spiegare un’idea)… e molti strumenti che stavamo usando erano essi stessi fondamentalmente web app. Per il caso d’uso di scrivere questi piccoli documenti web-app, perché non unire il documento con lo strumento usato per scriverlo?

Facendo questo, i lettori non tecnici potrebbero vedere il mio bel documento, ma altri scienziati di dati potrebbero immediatamente tornare al codice originale. Inoltre, poiché il kernel di calcolo sarebbe il motore JS del browser, sarebbero in grado di iniziare ad estendere e sperimentare il codice di analisi immediatamente. E sarebbero stati in grado di fare tutto questo senza connettersi a risorse di calcolo remote o installare alcun software.

Towards Iodide

Ho iniziato a discutere i potenziali pro e contro del calcolo scientifico nel browser con i miei colleghi, e nel corso delle nostre conversazioni, abbiamo notato alcune altre tendenze interessanti.

In Mozilla abbiamo visto un sacco di demo interessanti che mostravano WebAssembly, un nuovo modo per i browser di eseguire codice scritto in lingue diverse da Javascript. WebAssembly permette ai programmi di essere eseguiti a velocità incredibile, in alcuni casi vicino ai binari nativi. Stavamo vedendo esempi di processi computazionalmente costosi come interi motori di gioco 3D in esecuzione all’interno del browser senza difficoltà. Andando avanti, sarebbe stato possibile compilare le migliori librerie di calcolo numerico C e C++ in WebAssembly e avvolgerle in ergonomiche API JS, proprio come il progetto SciPy fa per Python. In effetti, i progetti hanno già iniziato a farlo.

WebAssembly rende possibile eseguire codice a velocità quasi nativa nel browser.

Abbiamo anche notato la volontà della comunità Javascript di introdurre una nuova sintassi quando ciò aiuta le persone a risolvere il loro problema in modo più efficace. Forse sarebbe possibile emulare alcuni degli elementi sintattici chiave che rendono la programmazione numerica più comprensibile e fluida in MATLAB, Julia e Python – la moltiplicazione delle matrici, lo slicing multidimensionale, le operazioni di broadcast array, e così via. Di nuovo, trovammo altre persone che pensavano lungo linee simili.

Con questi fili che convergevano, cominciammo a chiederci se la piattaforma web potesse essere sul punto di diventare una casa produttiva per il calcolo scientifico. Come minimo, sembrava che potesse evolversi per servire alcuni dei flussi di lavoro comunicativi che incontriamo in Mozilla (e che molti altri incontrano nell’industria e nel mondo accademico). Con il nucleo di Javascript che migliora continuamente e la possibilità di aggiungere estensioni di sintassi per la programmazione numerica, forse JS stesso potrebbe essere reso più attraente per gli scienziati. WebAssembly sembrava offrire un percorso verso grandi librerie scientifiche. La terza gamba dello sgabello sarebbe un ambiente per creare documenti di scienza dei dati per il web. Quest’ultimo elemento è dove abbiamo deciso di concentrare la nostra sperimentazione iniziale, che ci ha portato a Iodide.

L’anatomia di Iodide

Iodide è uno strumento progettato per dare agli scienziati un flusso di lavoro familiare per creare documenti interattivi di grande aspetto utilizzando la piena potenza della piattaforma web. Per fare questo, ti diamo un “report” – fondamentalmente una pagina web che puoi riempire con i tuoi contenuti – e alcuni strumenti per esplorare iterativamente i dati e modificare il tuo report per creare qualcosa che sei pronto a condividere. Una volta che sei pronto, puoi inviare un link direttamente al tuo rapporto finito. Se i tuoi colleghi e collaboratori vogliono rivedere il tuo codice e imparare da esso, possono tornare alla modalità di esplorazione con un clic. Se vogliono sperimentare il codice e usarlo come base del loro lavoro, con un altro click possono fare un fork e iniziare a lavorare sulla loro versione.

Continua a leggere per saperne di più su alcune delle idee che stiamo sperimentando nel tentativo di rendere questo flusso di lavoro fluido.

Le viste Explore e Report

Iodide mira a stringere il cerchio tra esplorazione, spiegazione e collaborazione. Centrale per questo è la capacità di muoversi avanti e indietro tra una bella scrittura e un ambiente utile per l’esplorazione iterativa del calcolo.

Quando si crea per la prima volta un nuovo quaderno di Iodide, si inizia nella “vista explore”. Questa fornisce una serie di riquadri che includono un editor per scrivere codice, una console per visualizzare l’output del codice che valutate, un visualizzatore dello spazio di lavoro per esaminare le variabili che avete creato durante la vostra sessione, e un riquadro “anteprima del rapporto” in cui potete vedere un’anteprima del vostro rapporto.

Modifica di un pezzo di codice Markdown nella vista explore di Iodide.

Facendo clic sul pulsante “REPORT” nell’angolo in alto a destra, il contenuto dell’anteprima del report si espande fino a riempire l’intera finestra, permettendovi di mettere la storia che volete raccontare davanti e al centro. I lettori che non sanno come codificare o che non sono interessati ai dettagli tecnici sono in grado di concentrarsi su ciò che stai cercando di trasmettere senza dover guadare attraverso il codice. Quando un lettore visita il link alla visualizzazione del report, il tuo codice verrà eseguito automaticamente. se vogliono rivedere il tuo codice, semplicemente cliccando il pulsante “ESPLORA” in alto a destra li riporterà nella visualizzazione di esplorazione. Da lì, possono fare una copia del taccuino per le loro esplorazioni.

Spostamento da explore a report view.

Ogni volta che condividi un link a un taccuino Iodide, il tuo collaboratore può sempre accedere a entrambe queste viste. Il documento pulito e leggibile non è mai separato dal sottostante codice eseguibile e dall’ambiente di editing dal vivo.

Documenti vivi e interattivi con la potenza della piattaforma web

I documenti Iodide vivono nel browser, il che significa che il motore di calcolo è sempre disponibile. Ogni volta che si condivide il proprio lavoro, si condivide un rapporto interattivo dal vivo con codice in esecuzione. Inoltre, poiché il calcolo avviene nel browser insieme alla presentazione, non c’è bisogno di chiamare un backend linguistico in un altro processo. Questo significa che i documenti interattivi si aggiornano in tempo reale, aprendo la possibilità di visualizzazioni 3D senza soluzione di continuità, anche con la bassa latenza e l’alto frame-rate richiesti per la VR.

Il contributore Devin Bayly esplora i dati MRI del suo cervello

Condivisione, collaborazione e riproducibilità

Costruire Iodide nel web semplifica una serie di elementi di frizione del flusso di lavoro che abbiamo incontrato in altri strumenti. La condivisione è semplificata perché il testo e il codice sono disponibili allo stesso URL piuttosto che, per esempio, incollare un link a uno script nelle note di un documento di Google. La collaborazione è semplificata perché il kernel di calcolo è il browser e le librerie possono essere caricate tramite una richiesta HTTP come qualsiasi pagina web carica lo script – nessun linguaggio aggiuntivo, librerie o strumenti devono essere installati. E poiché i browser forniscono un livello di compatibilità, non ci si deve preoccupare che il comportamento dei notebook sia riproducibile attraverso i computer e i sistemi operativi.

Per supportare i flussi di lavoro collaborativi, abbiamo costruito un server abbastanza semplice per salvare e condividere i notebook. C’è un’istanza pubblica su iodide.io dove puoi sperimentare con Iodide e condividere il tuo lavoro pubblicamente. È anche possibile impostare la propria istanza dietro un firewall (e infatti questo è ciò che stiamo già facendo in Mozilla per alcuni lavori interni). Ma, cosa importante, i notebook stessi non sono profondamente legati ad una singola istanza del server Iodide. In caso di necessità, dovrebbe essere facile migrare il proprio lavoro su un altro server o esportare il proprio notebook come un bundle per condividerlo su altri servizi come Netlify o Github Pages (maggiori informazioni sull’esportazione dei bundle sotto “What’s next?”). Mantenere il calcolo nel client ci permette di concentrarci sulla costruzione di un ottimo ambiente per la condivisione e la collaborazione, senza bisogno di costruire risorse computazionali nel cloud.

Pyodide: Lo stack scientifico Python nel browser

Quando abbiamo iniziato a pensare di rendere il web migliore per gli scienziati, ci siamo concentrati sui modi in cui potevamo migliorare il lavoro con Javascript, come compilare le librerie scientifiche esistenti in WebAssembly e avvolgerle in API JS facili da usare. Quando abbiamo proposto questo ai maghi di WebAssembly di Mozilla, ci hanno offerto un’idea più ambiziosa: se molti scienziati preferiscono Python, venite loro incontro compilando lo stack scientifico Python per farlo girare in WebAssembly.

Pensavamo che questo sembrasse scoraggiante – che sarebbe stato un progetto enorme e che non avrebbe mai fornito prestazioni soddisfacenti… ma due settimane dopo Mike Droettboom aveva un’implementazione funzionante di Python in esecuzione in un notebook Iodide. Nei due mesi successivi, abbiamo aggiunto Numpy, Pandas e Matplotlib, che sono di gran lunga i moduli più usati nell’ecosistema scientifico di Python. Con l’aiuto dei collaboratori Kirill Smelkov e Roman Yurchak di Nexedi, abbiamo ottenuto il supporto per Scipy e scikit-learn. Da allora, abbiamo continuato ad aggiungere altre librerie poco a poco.

Eseguire l’interprete Python all’interno di una macchina virtuale Javascript aggiunge una penalità in termini di prestazioni, ma questa penalità risulta essere sorprendentemente piccola – nei nostri benchmark, circa 1x-12x più lento del nativo su Firefox e 1x-16x più lento su Chrome. L’esperienza mostra che questo è molto utilizzabile per l’esplorazione interattiva.

Eseguire Matplotlib nel browser permette le sue caratteristiche interattive, che non sono disponibili in ambienti statici

Portare Python nel browser crea alcuni flussi di lavoro magici. Per esempio, è possibile importare e pulire i dati in Python, e poi accedere agli oggetti Python risultanti da Javascript (nella maggior parte dei casi, la conversione avviene automaticamente) in modo da poterli visualizzare utilizzando librerie JS come d3. Ancora più magicamente, potete accedere alle API del browser dal codice Python, permettendovi di fare cose come manipolare il DOM senza toccare Javascript.

Ovviamente, c’è molto di più da dire su Pyodide, e merita un articolo tutto suo – andremo più in dettaglio in un post successivo il mese prossimo.

JSMD (JavaScript MarkDown)

Proprio come in Jupyter e nella modalità R-Markdown di R, in Iodide potete intrecciare codice e scrittura come volete, spezzando il vostro codice in “pezzi di codice” che potete modificare ed eseguire come unità separate. La nostra implementazione di questa idea è parallela alla “modalità cella” di R Markdown e MATLAB: piuttosto che usare un’interfaccia esplicitamente basata sulle celle, il contenuto di un notebook Iodide è solo un documento di testo che usa una sintassi speciale per delimitare specifici tipi di celle. Chiamiamo questo formato di testo “JSMD”.

Seguendo MATLAB, i chunks di codice sono definiti da linee che iniziano con %% seguite da una stringa che indica il linguaggio del chunk sottostante. Attualmente supportiamo chunks contenenti Javascript, CSS, Markdown (e HTML), Python, uno speciale chunk “fetch” che semplifica il caricamento delle risorse, e un chunk plugin che permette di estendere la funzionalità di Iodide aggiungendo nuovi tipi di celle.

Abbiamo trovato questo formato abbastanza conveniente. Rende facile l’uso di strumenti orientati al testo come i visualizzatori diff e il tuo editor di testo preferito, e puoi eseguire operazioni di testo standard come taglia/copia/incolla senza dover imparare scorciatoie per la gestione delle celle. Per maggiori dettagli puoi leggere su JSMD nei nostri documenti.

Che cosa c’è dopo?

Vale la pena ripetere che siamo ancora in alpha, quindi continueremo a migliorare la pulizia generale e a schiacciare i bug. Ma oltre a questo, abbiamo un certo numero di caratteristiche in mente per il nostro prossimo round di sperimentazione. Se qualcuna di queste idee vi sembra particolarmente utile, fatecelo sapere! Ancora meglio, facci sapere se ti piacerebbe aiutarci a costruirle!

Funzioni collaborative migliorate

Come menzionato sopra, finora abbiamo costruito un backend molto semplice che ti permette di salvare il tuo lavoro online, guardare il lavoro fatto da altre persone, e rapidamente biforcare ed estendere i notebook esistenti fatti da altri utenti, ma questi sono solo i passi iniziali di un utile flusso di lavoro collaborativo.

Le prossime tre grandi caratteristiche di collaborazione che stiamo cercando di aggiungere sono:

  1. Fili di commento in stile Google Docs
  2. La possibilità di suggerire modifiche al notebook di un altro utente tramite un flusso di lavoro di fork/merge simile alle richieste pull di Github
  3. Modifica simultanea del notebook come Google Docs.

A questo punto, stiamo dando loro la priorità più o meno in quest’ordine, ma se volete affrontarli in un ordine diverso o se avete altri suggerimenti, fatecelo sapere!

Più lingue!

Abbiamo parlato con persone delle comunità R e Julia sulla compilazione di questi linguaggi in WebAssembly, che permetterebbe il loro uso in Iodide e altri progetti basati su browser. La nostra indagine iniziale indica che questo dovrebbe essere fattibile, ma che implementare questi linguaggi potrebbe essere un po’ più impegnativo di Python. Come con Python, alcuni flussi di lavoro interessanti si aprono se si può, per esempio, adattare modelli statistici in R o risolvere equazioni differenziali in Julia, e poi visualizzare i risultati usando le API del browser. Se vi interessa portare questi linguaggi sul web, contattateci – in particolare, ci piacerebbe avere l’aiuto di esperti di FORTRAN e LLVM.

Esportazione archivio notebook

Le prime versioni di Iodide erano file HTML autocontenuti eseguibili, che includevano sia il codice JSMD usato nell’analisi, sia il codice JS usato per eseguire Iodide stesso, ma ci siamo allontanati da questa architettura. Esperimenti successivi ci hanno convinto che i benefici di collaborazione di avere un server Iodide superano i vantaggi di gestire i file sul proprio sistema locale. Tuttavia, questi esperimenti ci hanno mostrato che è possibile prendere un’istantanea eseguibile di un notebook Iodide inserendo il codice Iodide insieme a tutti i dati e le librerie usate da un notebook in un grande file HTML. Questo potrebbe finire per essere un file più grande di quello che vorreste servire agli utenti regolari, ma potrebbe rivelarsi utile come un’istantanea perfettamente riproducibile e archiviabile di un’analisi.

Estensione browser Iodide to text editor

Mentre molti scienziati sono abbastanza abituati a lavorare in ambienti di programmazione basati su browser, sappiamo che alcune persone non modificano mai il codice in niente di diverso dal loro editor di testo preferito. Vogliamo davvero che Iodide incontri le persone dove sono già, compresi quelli che preferiscono digitare il loro codice in un altro editor ma vogliono accedere alle caratteristiche interattive e iterative che Iodide fornisce. Per soddisfare questo bisogno, abbiamo iniziato a pensare di creare una leggera estensione per il browser e alcune semplici API per permettere a Iodide di parlare con gli editor lato client.

Feedback e collaborazione benvenuti!

Non stiamo cercando di risolvere tutti i problemi della scienza dei dati e del calcolo scientifico, e sappiamo che Iodide non sarà la tazza di tè di tutti. Se avete bisogno di elaborare terabyte di dati su cluster di GPU, Iodide probabilmente non ha molto da offrirvi. Se state pubblicando articoli di giornale e avete solo bisogno di scrivere un documento LaTeX, allora ci sono strumenti migliori per le vostre esigenze. Se l’intera tendenza a portare le cose nel browser vi fa rabbrividire un po’, nessun problema – ci sono una serie di strumenti davvero incredibili che potete usare per fare scienza, e siamo grati per questo! Non vogliamo cambiare il modo di lavorare di nessuno, e per molti scienziati la comunicazione incentrata sul web non è importante. Rad! Vivi la tua vita migliore!

Ma per quegli scienziati che producono contenuti per il web, e per quelli che potrebbero volerlo fare se avessero strumenti progettati per supportare il loro modo di lavorare: ci piacerebbe davvero sentire da te!

Per favore visita iodide.io, provalo, e dacci un feedback (ma di nuovo: tieni presente che questo progetto è in fase alfa – per favore non usarlo per qualsiasi lavoro critico, e tieni presente che mentre siamo in alfa tutto è soggetto a cambiamenti). Puoi partecipare al nostro rapido sondaggio, e i problemi e le segnalazioni di bug su Github sono molto graditi. Richieste di caratteristiche e pensieri sulla direzione generale possono essere condivisi tramite il nostro gruppo Google o Gitter.

Se volete essere coinvolti nell’aiutarci a costruire Iodide, siamo open source su Github. Iodide tocca un’ampia varietà di discipline software, dal moderno sviluppo di frontend al calcolo scientifico alla compilazione e alla transpilazione, quindi ci sono un sacco di cose interessanti da fare! Per favore contattateci se qualcosa di questo vi interessa!

Grazie mille a Hamilton Ulmer, William Lachance, e Mike Droettboom per il loro grande lavoro su Iodide e per la revisione di questo articolo.

Informazioni su Brendan Colloran

Altri articoli di Brendan Colloran…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.