Sut y gwnaethom gyflymu rhaglen we 20 gwaith gan ddefnyddio WebAssembly

Sut y gwnaethom gyflymu rhaglen we 20 gwaith gan ddefnyddio WebAssembly

Mae'r erthygl hon yn trafod achos dros gyflymu cymhwysiad porwr trwy ddisodli cyfrifiadau JavaScript gyda WebAssembly.

WebCynulliad - beth ydyw?

Yn fyr, mae hwn yn fformat cyfarwyddyd deuaidd ar gyfer peiriant rhithwir sy'n seiliedig ar bentwr. Gelwir Wasm (enw byr) yn aml yn iaith raglennu, ond nid yw. Gweithredir y fformat cyfarwyddyd yn y porwr ynghyd â JavaScript.

Mae'n bwysig bod modd cael WebAssembly trwy gasglu ffynonellau mewn ieithoedd fel C/C++, Rust, Go. Yma defnyddir teipio ystadegol a'r model cof gwastad fel y'i gelwir. Mae'r cod, fel y crybwyllwyd uchod, yn cael ei storio mewn fformat deuaidd cryno, gan ei gwneud bron mor gyflym â rhedeg y cais gan ddefnyddio'r llinell orchymyn. Mae'r galluoedd hyn wedi arwain at dwf poblogrwydd WebAssembly.

Rydym yn atgoffa: i holl ddarllenwyr "Habr" - gostyngiad o 10 rubles wrth gofrestru ar unrhyw gwrs Skillbox gan ddefnyddio'r cod hyrwyddo "Habr".

Mae Skillsbox yn argymell: Cwrs ymarferol "Datblygwr Symudol PRO".

Ar hyn o bryd, defnyddir Wasm mewn llawer o gymwysiadau, o gemau fel Doom 3 i gymwysiadau gwe-borth fel Autocad a Figma. Defnyddir Wasm hefyd mewn meysydd fel cyfrifiadura di-weinydd.

Mae'r erthygl hon yn rhoi enghraifft o ddefnyddio Wasm i gyflymu gwasanaeth gwe dadansoddeg. Er eglurder, fe wnaethom gymryd cais gweithredol a ysgrifennwyd yn C, sy'n cael ei grynhoi i WebAssembly. Bydd y canlyniad yn cael ei ddefnyddio i ddisodli adrannau o JS sy'n tanberfformio.

Trawsnewid Cais

Bydd yr enghraifft yn defnyddio gwasanaeth porwr fastq.bio, sydd wedi'i fwriadu ar gyfer genetegwyr. Mae'r offeryn yn eich galluogi i werthuso ansawdd dilyniannu DNA (dadgasglu).

Dyma enghraifft o'r cais ar waith:

Sut y gwnaethom gyflymu rhaglen we 20 gwaith gan ddefnyddio WebAssembly

Nid yw'n werth mynd i mewn i fanylion y broses gan eu bod yn eithaf cymhleth i'r rhai nad ydynt yn arbenigwyr, ond yn fyr, gall gwyddonwyr ddefnyddio'r ffeithlun uchod i ddeall a aeth y broses dilyniannu DNA yn llyfn a pha broblemau a gododd.

Mae gan y gwasanaeth hwn ddewisiadau amgen, rhaglenni bwrdd gwaith. Ond mae fastq.bio yn caniatáu ichi gyflymu'ch gwaith trwy ddelweddu'r data. Yn y rhan fwyaf o achosion eraill, mae angen i chi allu gweithio gyda'r llinell orchymyn, ond nid oes gan bob genetegydd y profiad angenrheidiol.

Mae popeth yn gweithio'n syml. Mae'r mewnbwn yn ddata a gyflwynir ar ffurf ffeil testun. Cynhyrchir y ffeil hon gan offer dilyniannu arbenigol. Mae'r ffeil yn cynnwys rhestr o ddilyniannau DNA a sgôr ansawdd ar gyfer pob niwcleotid. Fformat y ffeil yw .fastq, a dyna pam y cafodd y gwasanaeth ei enw.

Gweithredu yn JavaScript

Cam cyntaf y defnyddiwr wrth weithio gyda fastq.bio yw dewis y ffeil briodol. Gan ddefnyddio'r gwrthrych Ffeil, mae'r rhaglen yn darllen sampl ar hap o ddata o ffeil ac yn prosesu'r swp hwnnw. Gwaith JavaScript yma yw perfformio gweithrediadau llinynnol syml a chyfrifo metrigau. Un ohonynt yw nifer y niwcleotidau A, C, G a T ar ddarnau DNA gwahanol.

Ar ôl cyfrifo'r dangosyddion angenrheidiol, cânt eu delweddu gan ddefnyddio Plotly.js, ac mae'r gwasanaeth yn dechrau gweithio gyda sampl data newydd. Gwneir y talpio i wella ansawdd yr UX. Os ydych chi'n gweithio gyda'r holl ddata ar unwaith, bydd y broses yn rhewi am beth amser, gan fod y ffeiliau gyda'r canlyniadau dilyniannu yn cymryd cannoedd o gigabeit o ofod ffeil. Mae'r gwasanaeth yn cymryd darnau o ddata sy'n amrywio mewn maint o 0,5 i 1 MB ac yn gweithio gyda nhw gam wrth gam, gan adeiladu data graffigol.

Dyma sut mae'n gweithio:

Sut y gwnaethom gyflymu rhaglen we 20 gwaith gan ddefnyddio WebAssembly

Mae'r petryal coch yn cynnwys yr algorithm trawsnewid llinyn ar gyfer cael delweddu. Dyma'r rhan fwyaf dwys o'r gwasanaeth yn gyfrifiadurol. Mae'n werth ceisio Wasm yn ei le.

Profi WebCynulliad

Er mwyn asesu'r posibilrwydd o ddefnyddio Wasm, dechreuodd tîm y prosiect chwilio am atebion parod ar gyfer creu metrigau QC (QC - rheoli ansawdd) yn seiliedig ar ffeiliau fastq. Cynhaliwyd y chwiliad ymhlith offer a ysgrifennwyd yn C, C++ neu Rust, fel bod modd trosglwyddo'r cod i WebAssembly. Yn ogystal, ni ddylai'r offeryn fod yn “amrwd”; roedd angen gwasanaeth a oedd eisoes wedi'i brofi gan wyddonwyr.

O ganlyniad, gwnaed y dewisiad o blaid seqtk. Mae'r cymhwysiad yn eithaf poblogaidd, mae'n ffynhonnell agored, yr iaith ffynhonnell yw C.

Cyn trosi i Wasm, mae'n werth edrych ar yr egwyddor llunio seqtk ar gyfer y bwrdd gwaith. Yn ôl y Makefile, dyma beth sydd ei angen arnoch chi:

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

Mewn egwyddor, gallwch chi lunio seqtk gan ddefnyddio Emscripten. Os nad yw yno, rydym yn gwneud ei wneud. Delwedd docwr.

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

Os dymunir Gallwch chi ei gydosod eich hun, ond mae'n cymryd amser.

Y tu mewn i gynhwysydd, gallwch chi ddefnyddio emcc yn hawdd fel dewis arall yn lle gcc:

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

Isafswm newidiadau:

Yn lle allbynnu i ffeil ddeuaidd, mae Emscripten yn defnyddio .wasm a .js i gynhyrchu'r ffeiliau, a ddefnyddir i redeg modiwl WebAssemby.

Defnyddir y faner USE_ZLIB i gefnogi'r llyfrgell zlib. Mae'r llyfrgell wedi'i dosbarthu a'i chludo i WebAssembly, ac mae Emscripten yn ei chynnwys yn y prosiect.

Mae system ffeiliau rhithwir Emscriptten wedi'i actifadu. hwn FS tebyg i POSIX, yn rhedeg mewn RAM y tu mewn i'r porwr. Pan fydd y dudalen yn cael ei hadnewyddu, mae'r cof yn cael ei glirio.

Er mwyn deall pam mae angen system ffeiliau rithwir, mae'n werth cymharu'r ffordd rydych chi'n rhedeg seqtk o'r llinell orchymyn â'r ffordd rydych chi'n rhedeg modiwl WebAssembly wedi'i lunio.

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

Mae angen mynediad i'r system ffeiliau rhithwir er mwyn peidio ag ailysgrifennu seqtk ar gyfer llinyn yn hytrach na mewnbwn ffeil. Yn yr achos hwn, mae'r darn data yn cael ei arddangos fel ffeil data.fastq yn y rhith FS gyda galwad i brif() seqtk arno.

Dyma'r bensaernïaeth newydd:

Sut y gwnaethom gyflymu rhaglen we 20 gwaith gan ddefnyddio WebAssembly

Mae'r ffigur yn dangos, yn lle cyfrifiadau ym mhrif edefyn y porwr, Gweithwyr Gwe. Mae'r dull hwn yn caniatáu ichi wneud cyfrifiadau mewn llinyn cefndir heb effeithio ar ymatebolrwydd porwr. Wel, mae rheolwr WebWorker yn cychwyn y Gweithiwr, gan reoli ei ryngweithio â'r prif edefyn.

Mae'r gorchymyn seqtk yn cael ei redeg gan ddefnyddio Worker ar y ffeil wedi'i osod. Ar ôl cwblhau'r cyflawni, mae'r Gweithiwr yn cynhyrchu canlyniad ar ffurf Addewid. Pan fydd neges yn cael ei derbyn gan y brif edefyn, mae'r canlyniad yn cael ei ddefnyddio i ddiweddaru'r graffiau. Ac yn y blaen mewn sawl fersiwn.

Beth am berfformiad WebCynulliad?

Er mwyn gwerthuso'r newid mewn perfformiad, defnyddiodd tîm y prosiect y gweithrediadau darllen fesul eiliad paramedr. Nid yw'r amser y mae'n ei gymryd i adeiladu graffiau rhyngweithiol yn cael ei ystyried gan fod y ddau weithrediad yn defnyddio JavaScript.

Wrth ddefnyddio'r datrysiad y tu allan i'r bocs, roedd y cynnydd mewn perfformiad naw gwaith.

Sut y gwnaethom gyflymu rhaglen we 20 gwaith gan ddefnyddio WebAssembly

Mae hwn yn ganlyniad rhagorol, ond, fel y mae'n digwydd, mae cyfle i'w optimeiddio hefyd. Y ffaith yw nad yw nifer fawr o ganlyniadau dadansoddiad QC yn cael eu defnyddio gan seqtk, felly gellir eu dileu. Os gwnewch hyn, mae'r canlyniad yn gwella 13 gwaith o'i gymharu â JS.

Sut y gwnaethom gyflymu rhaglen we 20 gwaith gan ddefnyddio WebAssembly

Cyflawnwyd hyn trwy wneud sylwadau ar y gorchmynion printf().

Ond nid dyna'r cyfan. Y ffaith yw bod fastq.bio ar hyn o bryd yn derbyn canlyniadau'r dadansoddiad trwy alw gwahanol swyddogaethau C. Mae pob un ohonynt yn cyfrifo ei set ei hun o nodweddion, fel bod pob darn o'r ffeil yn cael ei ddarllen ddwywaith.

Er mwyn mynd o gwmpas y broblem hon, penderfynwyd cyfuno dwy swyddogaeth yn un. O ganlyniad, cynyddodd cynhyrchiant 20 gwaith.

Sut y gwnaethom gyflymu rhaglen we 20 gwaith gan ddefnyddio WebAssembly

Mae'n werth nodi na ellir cyflawni canlyniad mor rhagorol bob amser. Mewn rhai achosion, bydd perfformiad yn gostwng, felly mae'n werth gwerthuso pob achos.

I gloi, gallwn ddweud bod Wasm yn rhoi cyfle i wella perfformiad cais, ond mae angen i chi ei ddefnyddio'n ddoeth.

Mae Skillsbox yn argymell:

Ffynhonnell: hab.com

Ychwanegu sylw