Kuidas kasutasime WebAssemblyt veebirakenduse 20-kordseks kiirendamiseks

Kuidas kasutasime WebAssemblyt veebirakenduse 20-kordseks kiirendamiseks

Selles artiklis käsitletakse brauserirakenduse kiirendamise juhtumit, asendades JavaScripti arvutused WebAssemblyga.

WebAssembly - mis see on?

Lühidalt öeldes on see pinupõhise virtuaalmasina binaarne käsuvorming. Wasmi (lühike nimi) nimetatakse sageli programmeerimiskeeleks, kuid see pole nii. Käskude vorming käivitatakse brauseris koos JavaScriptiga.

On oluline, et WebAssemblyt saaks hankida, kompileerides allikaid sellistes keeltes nagu C/C++, Rust, Go. Siin kasutatakse statistilist tippimist ja nn lamemälu mudelit. Kood, nagu eespool mainitud, salvestatakse kompaktses binaarvormingus, mis muudab selle peaaegu sama kiireks kui rakenduse käivitamine käsurealt kasutades. Need võimalused on toonud kaasa WebAssembly populaarsuse kasvu.

Tuletame meelde: kõigile "Habr" lugejatele - allahindlus 10 000 rubla, kui registreerute mis tahes Skillboxi kursusele, kasutades sooduskoodi "Habr".

Skillbox soovitab: Praktiline kursus "Mobile Developer PRO".

Praegu kasutatakse Wasmi paljudes rakendustes, alates mängudest nagu Doom 3 kuni veebiportitud rakendusteni, nagu Autocad ja Figma. Wasmi kasutatakse ka sellistes valdkondades nagu serverita andmetöötlus.

Selles artiklis on näide Wasmi kasutamisest analüütika veebiteenuse kiirendamiseks. Selguse huvides võtsime C-keeles kirjutatud töötava rakenduse, mis on kompileeritud WebAssemblysse. Tulemust kasutatakse JS-i kehvasti toimivate osade asendamiseks.

Rakenduse ümberkujundamine

Näidis kasutab brauseriteenust fastq.bio, mis on mõeldud geneetikutele. Tööriist võimaldab teil hinnata DNA sekveneerimise (dešifreerimise) kvaliteeti.

Siin on näide rakendusest töös:

Kuidas kasutasime WebAssemblyt veebirakenduse 20-kordseks kiirendamiseks

Protsessi üksikasjadesse ei tasu laskuda, kuna need on mittespetsialistide jaoks üsna keerulised, kuid kokkuvõttes saavad teadlased ülaltoodud infograafiku abil aru saada, kas DNA sekveneerimisprotsess läks tõrgeteta ja millised probleemid tekkisid.

Sellel teenusel on alternatiivid, töölauaprogrammid. Kuid fastq.bio võimaldab teil oma tööd kiirendada, visualiseerides andmeid. Enamikul muudel juhtudel peate suutma töötada käsureaga, kuid kõigil geneetikutel pole vajalikku kogemust.

Kõik toimib lihtsalt. Sisend on tekstifailina esitatud andmed. See fail on loodud spetsiaalsete järjestustööriistade abil. Fail sisaldab DNA järjestuste loendit ja iga nukleotiidi kvaliteediskoori. Failivorming on .fastq, mistõttu sai teenus oma nime.

Rakendamine JavaScriptis

Kasutaja esimene samm fastq.bioga töötamisel on valida sobiv fail. Objekti Fail abil loeb rakendus failist juhusliku valimi andmetest ja töötleb selle partii. JavaScripti ülesanne on siin teha lihtsaid stringoperatsioone ja arvutada mõõdikuid. Üks neist on nukleotiidide A, C, G ja T arv erinevatel DNA fragmentidel.

Pärast vajalike näitajate arvutamist visualiseeritakse need Plotly.js abil ja teenus hakkab töötama uue andmenäidisega. Tükeldamine toimub UX-i kvaliteedi parandamiseks. Kui töötate kõigi andmetega korraga, siis protsess hangub mõneks ajaks, kuna järjestustulemustega failid võtavad sadu gigabaite failiruumi. Teenus võtab 0,5–1 MB suurusi andmetükke ja töötab nendega samm-sammult, luues graafilisi andmeid.

See töötab nii:

Kuidas kasutasime WebAssemblyt veebirakenduse 20-kordseks kiirendamiseks

Punane ristkülik sisaldab stringi teisendusalgoritmi visualiseerimise saamiseks. See on teenuse kõige arvutusmahukam osa. Tasub proovida asendada see Wasmiga.

WebAssembly testimine

Wasmi kasutamise võimaluse hindamiseks asus projektimeeskond otsima valmislahendusi QC mõõdikute (QC – kvaliteedikontroll) loomiseks fastq-failide põhjal. Otsing viidi läbi C, C++ või Rust keeles kirjutatud tööriistade hulgast, et oleks võimalik kood WebAssemblysse portida. Lisaks ei tohiks tööriist olla "toores"; selleks oli vaja teenust, mida teadlased olid juba testinud.

Sellest tulenevalt tehti valik selle kasuks seqtk. Rakendus on üsna populaarne, see on avatud lähtekoodiga, lähtekeel on C.

Enne Wasmile teisendamist tasub vaadata seqtk kompileerimispõhimõtet töölaua jaoks. Makefile'i andmetel vajate järgmist:

# Compile to binary
$ gcc seqtk.c 
   -o seqtk 
   -O2 
   -lm 
   -lz

Põhimõtteliselt saab seqtk kompileerida Emscripteni abil. Kui seda pole, siis leiame. Dockeri pilt.

$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26

Soovi korral Saate selle ise kokku panna, aga see võtab aega.

Konteineris saate lihtsalt gcc-le alternatiivina kasutada emcc-d:

# Compile to WebAssembly
$ emcc seqtk.c 
    -o seqtk.js 
    -O2 
    -lm 
    -s USE_ZLIB=1 
    -s FORCE_FILESYSTEM=1

Minimaalsed muudatused:

Binaarfaili väljastamise asemel kasutab Emscripten failide genereerimiseks .wasm ja js, mida kasutatakse WebAssemby mooduli käitamiseks.

USE_ZLIB lippu kasutatakse zlib teegi toetamiseks. Teek on levitatud ja WebAssemblysse porditud ning Emscripten kaasab selle projekti.

Emsscriptpteni virtuaalne failisüsteem on aktiveeritud. See POSIX-i sarnane FS, töötab brauseris RAM-is. Lehekülje värskendamisel mälu tühjeneb.

Et mõista, miks on vaja virtuaalset failisüsteemi, tasub võrrelda seda, kuidas te käsurealt seqtk käite, sellega, kuidas käitate kompileeritud WebAssembly moodulit.

# On the command line
$ ./seqtk fqchk data.fastq
 
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])

Juurdepääs virtuaalsele failisüsteemile on vajalik, et mitte failisisendi asemel stringi seqtk ümber kirjutada. Sellisel juhul kuvatakse andmefragment virtuaalses FS-is failina data.fastq, millel on kutse main() seqtk.

Siin on uus arhitektuur:

Kuidas kasutasime WebAssemblyt veebirakenduse 20-kordseks kiirendamiseks

Joonis näitab, et brauseri peamise lõime arvutuste asemel Veebitöötajad. See meetod võimaldab teha arvutusi taustalõimes ilma brauseri reageerimisvõimet mõjutamata. WebWorkeri kontroller käivitab Workeri, haldades selle suhtlemist põhilõimega.

Käsk seqtk käivitatakse ühendatud failis Workeri abil. Pärast täitmise lõpetamist annab töötaja tulemuse lubaduse kujul. Kui põhilõime saab sõnumi, kasutatakse tulemust graafikute värskendamiseks. Ja nii edasi mitmes iteratsioonis.

Kuidas on lood WebAssembly jõudlusega?

Toimivuse muutuse hindamiseks kasutas projektimeeskond parameetrit lugemisoperatsioonid sekundis. Interaktiivsete graafikute koostamiseks kuluvat aega ei võeta arvesse, kuna mõlemad rakendused kasutavad JavaScripti.

Kastivalmis lahenduse kasutamisel oli jõudluse kasv üheksakordne.

Kuidas kasutasime WebAssemblyt veebirakenduse 20-kordseks kiirendamiseks

See on suurepärane tulemus, kuid nagu selgub, on ka võimalus seda optimeerida. Fakt on see, et seqtk ei kasuta suurt hulka QC analüüsi tulemusi, seega saab need kustutada. Kui seda teha, paraneb tulemus võrreldes JS-iga 13 korda.

Kuidas kasutasime WebAssemblyt veebirakenduse 20-kordseks kiirendamiseks

See saavutati lihtsalt printf () käskude kommenteerimisega.

Kuid see pole veel kõik. Fakt on see, et selles etapis saab fastq.bio analüüsitulemused vastu, kutsudes erinevaid C-funktsioone. Igaüks neist arvutab oma karakteristikute komplekti, nii et iga faili fragmenti loetakse kaks korda.

Selle probleemi lahendamiseks otsustati kaks funktsiooni ühendada üheks. Selle tulemusena kasvas tootlikkus 20 korda.

Kuidas kasutasime WebAssemblyt veebirakenduse 20-kordseks kiirendamiseks

Väärib märkimist, et sellist silmapaistvat tulemust ei ole alati võimalik saavutada. Mõnel juhul jõudlus langeb, seega tasub iga juhtumit hinnata.

Kokkuvõtteks võib öelda, et Wasm annab küll võimaluse rakenduse jõudlust parandada, kuid seda tuleb targalt kasutada.

Skillbox soovitab:

Allikas: www.habr.com

Lisa kommentaar