Hvernig við notuðum WebAssembly til að flýta fyrir vefforriti 20 sinnum

Hvernig við notuðum WebAssembly til að flýta fyrir vefforriti 20 sinnum

Þessi grein fjallar um mál til að flýta fyrir vafraforriti með því að skipta út JavaScript útreikningum fyrir WebAssembly.

WebAssembly - hvað er það?

Í stuttu máli er þetta tvöfalt leiðbeiningarsnið fyrir sýndarvél sem byggir á stafla. Wasm (stutt nafn) er oft kallað forritunarmál en er það ekki. Leiðbeiningarsniðið er keyrt í vafranum ásamt JavaScript.

Það er mikilvægt að hægt sé að nálgast WebAssembly með því að setja saman heimildir á tungumálum eins og C/C++, Rust, Go. Hér er notast við tölfræðilega vélritun og svokallað flatt minnislíkan. Kóðinn, eins og getið er hér að ofan, er geymdur á þéttu tvíundarsniði, sem gerir það næstum jafn hratt og að keyra forritið með skipanalínunni. Þessir eiginleikar hafa leitt til vaxandi vinsælda WebAssembly.

Við minnum á: fyrir alla Habr lesendur - 10 rúblur afsláttur þegar þú skráir þig á hvaða Skillbox námskeið sem er með því að nota Habr kynningarkóðann.

Skillbox mælir með: Verklegt námskeið "Mobile Developer PRO".

Eins og er, er Wasm notað í mörgum forritum, allt frá leikjum eins og Doom 3 til nettengdra forrita eins og Autocad og Figma. Wasm er einnig notað á svæðum eins og netþjónalausri tölvu.

Þessi grein gefur dæmi um notkun Wasm til að flýta fyrir greiningarvefþjónustu. Til glöggvunar tókum við starfandi forrit skrifað í C, sem er safnað saman í WebAssembly. Niðurstaðan verður notuð til að skipta út lélegum hlutum JS.

Umbreyting umsóknar

Dæmið mun nota fastq.bio vafraþjónustuna sem er ætluð erfðafræðingum. Tólið gerir þér kleift að meta gæði DNA raðgreiningar (afkóðun).

Hér er dæmi um forritið í aðgerð:

Hvernig við notuðum WebAssembly til að flýta fyrir vefforriti 20 sinnum

Ekki er þess virði að fara út í smáatriðin í ferlinu þar sem þau eru frekar flókin fyrir þá sem ekki eru sérfræðingar, en í stuttu máli geta vísindamenn notað ofangreinda upplýsingamynd til að skilja hvort DNA raðgreiningarferlið hafi gengið snurðulaust fyrir sig og hvaða vandamál hafi komið upp.

Þessi þjónusta hefur val, skrifborðsforrit. En fastq.bio gerir þér kleift að flýta fyrir vinnu þinni með því að sjá gögnin fyrir þér. Í flestum öðrum tilfellum þarftu að geta unnið með skipanalínuna, en ekki eru allir erfðafræðingar með nauðsynlega reynslu.

Allt virkar einfaldlega. Inntakið er gögn sett fram í formi textaskráar. Þessi skrá er búin til með sérhæfðum raðgreiningarverkfærum. Skráin inniheldur lista yfir DNA raðir og gæðastig fyrir hvert kirni. Skráarsniðið er .fastq og þess vegna fékk þjónustan nafnið sitt.

Innleiðing í JavaScript

Fyrsta skref notandans þegar hann vinnur með fastq.bio er að velja viðeigandi skrá. Með því að nota File hlutinn les forritið slembiúrtak af gögnum úr skrá og vinnur úr þeirri lotu. Starf JavaScript hér er að framkvæma einfaldar strengjaaðgerðir og reikna út mælikvarða. Einn þeirra er fjöldi kirna A, C, G og T á mismunandi DNA bútum.

Eftir útreikning á nauðsynlegum vísbendingum eru þeir sýndir með Plotly.js og þjónustan byrjar að vinna með nýtt gagnasýni. Klumpurinn er gerður til að bæta gæði UX. Ef þú vinnur með öll gögnin í einu mun ferlið frysta í nokkurn tíma, þar sem skrárnar með raðgreiningarniðurstöðunum taka hundruð gígabæta af skráarrými. Þjónustan tekur við gögnum á bilinu 0,5 til 1 MB og vinnur með þau skref fyrir skref og byggir upp myndræn gögn.

Þetta virkar þannig:

Hvernig við notuðum WebAssembly til að flýta fyrir vefforriti 20 sinnum

Rauði rétthyrningurinn inniheldur strengumbreytingaralgrímið til að fá sjónmynd. Þetta er reikningsfrekasti hluti þjónustunnar. Það er þess virði að reyna að skipta honum út fyrir Wasm.

Að prófa WebAssembly

Til að meta möguleikann á að nota Wasm hóf verkefnishópurinn að leita að tilbúnum lausnum til að búa til QC mælikvarða (QC - gæðaeftirlit) byggða á fastq skrám. Leitin var gerð meðal verkfæra skrifað í C, C++ eða Rust, þannig að hægt var að flytja kóðann yfir á WebAssembly. Að auki ætti tólið ekki að vera „hrátt“; krafist var þjónustu sem þegar hafði verið prófuð af vísindamönnum.

Þar af leiðandi var valið í hag seqtk. Forritið er nokkuð vinsælt, það er opinn uppspretta, frummálið er C.

Áður en þú umbreytir í Wasm er þess virði að skoða samantektarregluna um seqtk fyrir skjáborðið. Samkvæmt Makefile, hér er það sem þú þarft:

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

Í grundvallaratriðum geturðu sett saman seqtk með Emscripten. Ef það er ekki til staðar þá látum við það nægja. Docker mynd.

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

Ef óskað er Þú getur sett það saman sjálfur, en það tekur tíma.

Inni í íláti geturðu auðveldlega notað emcc sem valkost við gcc:

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

Lágmarksbreytingar:

Í stað þess að gefa út í tvíundarskrá notar Emscripten .wasm og .js til að búa til skrárnar, sem eru notaðar til að keyra WebAssemby eininguna.

USE_ZLIB fáninn er notaður til að styðja zlib bókasafnið. Bókasafninu hefur verið dreift og flutt til WebAssembly og Emscripten tekur það með í verkefnið.

Emscrippten sýndarskráakerfið er virkjað. Þetta POSIX-líkt FS, keyrir í vinnsluminni inni í vafranum. Þegar síðan er endurnýjuð er minnið hreinsað.

Til að skilja hvers vegna þörf er á sýndarskráakerfi er þess virði að bera saman hvernig þú keyrir seqtk frá skipanalínunni við hvernig þú keyrir samansetta WebAssembly einingu.

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

Nauðsynlegt er að fá aðgang að sýndarskráakerfinu til að endurskrifa ekki seqtk fyrir streng frekar en skráarinntak. Í þessu tilviki er gagnabrotið sýnt sem data.fastq skrá í sýndar-FS með kalli á main() seqtk á henni.

Hér er nýi arkitektúrinn:

Hvernig við notuðum WebAssembly til að flýta fyrir vefforriti 20 sinnum

Myndin sýnir að í stað útreikninga í aðalvafraþræðinum, WebWorkers. Þessi aðferð gerir þér kleift að framkvæma útreikninga í bakgrunnsþræði án þess að hafa áhrif á svörun vafra. Jæja, WebWorker stjórnandi ræsir starfsmanninn og stjórnar samskiptum hans við aðalþráðinn.

Seqtk skipunin er keyrð með Worker á uppsettu skránni. Eftir að framkvæmdinni er lokið framleiðir verkamaðurinn niðurstöðu í formi loforðs. Þegar skilaboð berast á aðalþráðinn er niðurstaðan notuð til að uppfæra línuritin. Og svo framvegis í nokkrum endurtekningum.

Hvað með frammistöðu WebAssembly?

Til að meta breytinguna á frammistöðu notaði verkefnishópurinn færibreytuna lesaðgerðir á sekúndu. Tíminn sem það tekur að búa til gagnvirk myndrit er ekki tekin með í reikninginn þar sem báðar útfærslurnar nota JavaScript.

Þegar lausnin var notuð var afkastaaukningin níu sinnum.

Hvernig við notuðum WebAssembly til að flýta fyrir vefforriti 20 sinnum

Þetta er frábær árangur, en eins og það kemur í ljós er tækifæri til að hagræða honum líka. Staðreyndin er sú að mikill fjöldi QC greiningarniðurstaðna er ekki notaður af seqtk, svo hægt er að eyða þeim. Ef þú gerir þetta batnar útkoman um 13 sinnum miðað við JS.

Hvernig við notuðum WebAssembly til að flýta fyrir vefforriti 20 sinnum

Það var náð með því einfaldlega að skrifa athugasemdir við printf() skipanirnar.

En það er ekki allt. Staðreyndin er sú að á þessu stigi fær fastq.bio greiningarniðurstöðurnar með því að kalla á mismunandi C-föll. Hver þeirra reiknar út sitt eigin eiginleika, þannig að hvert brot af skránni er lesið tvisvar.

Til þess að komast framhjá þessu vandamáli var ákveðið að sameina tvær aðgerðir í eina. Fyrir vikið jókst framleiðni um 20 sinnum.

Hvernig við notuðum WebAssembly til að flýta fyrir vefforriti 20 sinnum

Það er athyglisvert að slíkur árangur er ekki alltaf hægt að ná. Í sumum tilfellum mun frammistaðan lækka, svo það er þess virði að meta hvert tilvik.

Sem niðurstaða getum við sagt að Wasm veitir tækifæri til að bæta árangur forrita, en þú þarft að nota það skynsamlega.

Skillbox mælir með:

Heimild: www.habr.com

Bæta við athugasemd