Inwessgħu l-kapaċità ta’ Git f’OpenAI
Nibnu kontroll tal-kodiċi tas-sors li jlaħħaq mal-iskala tal-aġenti, filwaqt li ninvestu fl-ekosistema Git.
Matul l-aħħar sena, id-daqs tal-monorepo tagħna u t-talbiet fuqu żdiedu b’pass tal-għaġeb. Kien ċar li kellna bżonn inġeddu s-sistema tagħna tal-kontroll tal-kodiċi sors biex tlaħħaq mal-livell ta’ xogħol simultanju li jagħmel possibbli Codex.
Bnejna Pando, backend ġdid għar-repożitorji Git, mingħajr ma interrompejna x-xogħol tal-inġinerija jew biddilna kif it-tim tagħna juża Git. Pando issa jħaddem l-iżvilupp kollu fil-monorepo ta’ OpenAI. Pando huwa mfassal biex jilħaq żewġ għanijiet ambizzjużi: l-ewwel, kitba li tista’ tespandi orizzontalment, ottimizzata għal pushes simultanji lejn ħafna fergħat. U t-tieni, jimmassimizza t-throughput tal-qari, biex il-klijenti jkunu jistgħu jniżżlu d-data malajr biżżejjed biex jużaw il-bandwidth kollu disponibbli tan-network tagħhom.
Ilħaqna dawn l-għanijiet filwaqt li żammejna l-kompatibbiltà mal-protokoll u l-klijent ta' Git, biex kemm l-inġiniera kif ukoll l-aġenti tagħna setgħu jadottaw Pando bla xkiel fil-flussi tax-xogħol eżistenti tagħhom. Fl-ambjent tal-produzzjoni, Pando naqqas il-latenza medjana tal-push bi kważi ħames darbiet il-valur preċedenti. Issa jwassal kważi petabyte ta’ data Git kuljum.
Hawnhekk se nispjegaw għaliex bnejna sistema ġdida tal-kontroll tal-kodiċi sors, u għaliex għażilna li nżommu l-kompatibbiltà ma’ Git. Se nqabblu s-sistema tagħna ma’ approċċi komuni biex tiżdied il-kapaċità ta’ Git, u nispjegaw għaliex Pando għandu kapaċità unika li jissodisfa l-ħtiġijiet ta’ skalabbiltà ta’ OpenAI. Niddiskutu wkoll x’imiss, u kif se nkomplu nikkontribwixxu għal Git biex nappoġġjaw xogħol fuq l-iskala tal-aġenti.
Codex biddel l-iskala u l-pass tal-iżvilupp f’OpenAI, u ppermetta lill-inġiniera jagħmlu ferm aktar xogħol b’mod parallel. Dan ifisser aktar fergħat u pushes, aktar għaqdiet, u aktar fetches u clones minn ambjenti tal-iżvilupp, kompiti ta’ riċerka u CI.
Dawn it-talbiet jakkumulaw u jkabbru lil xulxin. Inġinier wieħed issa jkollu diversi bidliet lesti għal CI fl-istess ħin, u kull push jista’ jwassal biex diversi kompiti jġibu l-istess commit.
Minn madwar tmiem is-sena li għaddiet, is-sistemi li jappoġġjaw il-monorepo tagħna bdew isibuha diffiċli jlaħħqu. Kellna fetches u pushes bil-mod, kif ukoll għaqdiet li fallew, u l-affidabbiltà kultant niżlet taħt id-90%. Konna lħaqna limitu ta’ Git innifsu, jew tal-mod kif konna nipprovdu aċċess għall-monorepo tagħna? Git twieled minn komunità li kienet tiskambja patches għall-kernel bl-email. Għal aktar minn għoxrin sena, l-iżviluppaturi adattaw l-għodod tagħhom madwar Git hekk kif inbidel il-mod kif jibnu s-software. Meta bdejna niltaqgħu ma’ ostakli fil-monorepo tagħna stess, kien importanti għalina li nkomplu nibnu fuq dak ix-xogħol.
Rajna mod kif inżommu dak il-fluss tax-xogħol familjari filwaqt li nibnu mill-ġdid il-backend biex jipproċessa pushes lejn fergħat differenti b’mod parallel u jipprovdi l-istess storja lil ħafna qarrejja fl-istess ħin. Billi bnejna fuq Git bħala l-pedament tal-fluss tax-xogħol tagħna għall-kontroll tal-kodiċi sors, it-titjib fil-klijent seta’ jkun utli wkoll barra OpenAI. Ridna nikkontribwixxu dak it-titjib mill-kopja tagħna ta’ Git(jinfetaħ f’tieqa ġdida) għall-proġett oriġinali, biex naqsmuh mal-komunità usa’.
L-espansjoni ta’ sistema tal-kontroll tal-kodiċi sors għandha żewġ dimensjonijiet essenzjali: ħafna kittieba jagħmlu push lejn fergħat differenti, u ħafna qarrejja jġibu l-istess storja. Pando jottimizza għat-tnejn.
L-ewwel, Pando jikkoordina l-aġġornamenti ta’ kull fergħa b’mod indipendenti. L-aġġornamenti ta’ fergħat mhux relatati jistgħu jsiru b’mod parallel, u qarrej li jġib fergħa jirċievi l-istorja meħtieġa għal dik ir-reviżjoni. Il-kompromess huwa li qarrej li jħares lejn diversi fergħat jista’ jarahom kif kienu f’mumenti differenti.
It-tieni, Pando jerġa’ juża l-packfiles (il-format ta’ Git biex jikkompressa diversi oġġetti flimkien) f’fetches differenti, minflok jiġġenera packfile individwali għal kull klijent. Klijent jista’ jniżżel xi oġġetti li diġà għandu, iżda s-server jista’ jipprovdi l-istess bytes lil ħafna klijenti bi ftit komputazzjoni.
Dawn l-għażliet iħalluna nżidu l-kapaċità tal-kitba bejn il-fergħat u naqdu t-talbiet għall-qari mill-caches. Biex naraw kif jaħdmu flimkien, nibdew minn kif Git jaħżen u jittrasferixxi l-istorja.
Git irid ikun jista’ jżomm żewġ partijiet ta’ repożitorju sinkronizzati: l-oġġetti u r-referenzi.
Repożitorju Git jirreġistra stati tal-fajls u l-istorja li torbothom bħala graff ta’ oġġetti. Oġġett jista’ jkun blob, siġra, commit jew tikketta. Il-blobs iżommu l-kontenut ta’ fajl individwali, u s-siġar jassoċjaw ismijiet ma’ blobs jew siġar oħra biex jiffurmaw struttura ta’ direttorji. Il-commits jippuntaw lejn siġra għerq u żero jew aktar commits ġenituri, u jiffurmaw l-istorja tar-repożitorju tiegħek.
L-oġġetti jiġu identifikati permezz ta’ hash tat-tip u l-kontenut tagħhom. L-oġġetti huma wkoll immutabbli: ir-reġistrazzjoni ta’ fajl mibdul toħloq blob ġdid, filwaqt li fajls u direttorji mhux mibdula jistgħu jerġgħu jużaw oġġetti eżistenti.
Il-fergħat u t-tikketti huma referenzi, jew “refs”, li jippuntaw lejn commits. Meta jsir commit fuq fergħa, jinħoloq commit ġdid u r-referenza tal-fergħa tiġi aġġornata biex tipponta lejh.
L-oġġetti Git jirreferu għal xulxin permezz tal-ID tagħhom: il-commits għas-siġar, u s-siġar għal siġar u blobs. Il-fergħa refs/heads/main tipponta lejn il-commit C2, li l-ġenitur tiegħu huwa C1. C1 jipponta lejn is-siġra għerq T1, fejn parser.py jirreferi għall-blob B1. C2 jipponta lejn is-siġra għerq T2, fejn parser.py jirreferi għall-blob B2. Fiż-żewġ siġar għerq, docs/ jirreferi għall-istess siġra, T3. L-entrata README.md tagħha tipponta lejn il-blob B3, u usage.md jipponta lejn il-blob B4.
Git jaħżen l-oġġetti jew fi stat “separat” jew fi stat “ippakkjat”. Oġġetti separati jinħażnu f’fajls individwali identifikati mill-ID tal-oġġett tagħhom. Oġġetti ppakkjati jinħażnu flimkien f’packfile, biex oġġetti simili jkunu jistgħu jinħażnu bħala differenzi relattivi għal xulxin.
Git jista’ jaħżen il-blobs bħala fajls separati jew jippakkjahom flimkien, billi jikkodifika blob wieħed bħala differenza relattiva għal ieħor.
F’Git, oġġett jista’ jintlaħaq minn commit jekk Git jista’ jsibu billi jsegwi l-links minn dak il-commit permezz tal-ġenituri, is-siġar u l-blobs tiegħu. Waqt fetch, il-klijent jgħid lis-server liema commits irid u liema diġà għandu. Is-server isib l-oġġetti li jistgħu jintlaħqu mill-commits mitluba, jeskludi dawk li jaf li l-klijent diġà għandu, u jibgħat il-bqija bħala packfile fl-istess format li Git juża fuq id-diska. Clone sħiħ jibda mingħajr ebda oġġett, għalhekk jeħtieġ l-oġġetti kollha li jistgħu jintlaħqu mill-istorja li qed tiġi kklonata.
Push jittrasferixxi l-oġġetti fid-direzzjoni l-oħra billi jitlob lis-server jaġġorna referenza waħda jew aktar. Il-klijent juża s-sett ta’ referenzi mħabbra mis-server biex jevita li jibgħat oġġetti li s-server diġà għandu. Għalhekk il-pakkett li jintbagħat jista’ jiddependi fuq oġġetti eżistenti: li tirċievi l-pakkett waħdu mhuwiex biżżejjed biex tibni mill-ġdid l-istorja l-ġdida.
Ir-replikazzjoni ta’ repożitorju Git tfisser li kemm l-oġġetti kif ukoll ir-referenzi jinżammu disponibbli fuq diversi servers. Qabel ma replika tkun tista’ tipprovdi l-valur ġdid ta’ referenza, trid tkun kapaċi tipprovdi l-oġġetti li jistgħu jintlaħqu minn dak il-valur. Is-servizz jeħtieġ ukoll jikkoordina aġġornamenti tar-referenzi li jikkompetu ma’ xulxin, jiġifieri pushes li jippruvaw imexxu l-istess fergħa mill-istess ponta l-qadima lejn commits ġodda differenti. Sistemi li jimponu ordni waħda fuq il-kitba kollha f’repożitorju jistgħu jġiegħlu pushes lejn fergħat mhux relatati jistennew lil xulxin.
Waqt li fassalna Pando, evalwajna approċċi konvenzjonali biex inżidu l-kapaċità tal-kontroll tal-kodiċi sors b’Git: wieħed li jikkoordina l-aġġornamenti tar-referenzi bejn repliki tar-repożitorju b’commit bi tliet fażijiet (3PC, protokoll biex jikkoordina commit bejn diversi nodi), u ieħor li jordna l-aġġornamenti permezz ta’ reġistru kondiviż tal-kitba bil-quddiem (WAL, rekord ta’ bidliet miktuba qabel jiġu applikati) fil-ħażna tal-blobs.
Fid-disinn ta’ commit bi tliet fażijiet li mmudellajna, is-servizz Git iżomm kopja sħiħa tar-repożitorju fuq diversi repliki. Meta kwalunkwe server jirċievi push, il-packfile li jasal jiġi kkupjat u mibgħut lir-repliki kollha b’mod parallel. Biex il-push jiġi ppubblikat, il-maġġoranza tar-repliki jridu jaċċettaw l-aġġornament tar-referenza. Is-server li jmexxi dan huwa l-koordinatur, u l-proċess jeħtieġ diversi ċikli ta’ komunikazzjoni bejn il-koordinatur u kull replika oħra.
Biex taċċetta aġġornament ta’ referenza, kull replika ssakkar il-kopja tagħha tar-referenza u tiċċekkja li għadha tipponta lejn il-commit li jistenna l-klijent. Il-koordinatur imbagħad jibgħat messaġġ ta’ qabel il-commit lir-repliki li jaċċettaw. Ladarba maġġoranza tikkonferma li rċeviet il-messaġġ ta’ qabel il-commit, il-koordinatur jgħidilhom iwettqu l-aġġornament. Kwalunkwe replika aġġornata mbagħad tista’ tħabbar il-ponta l-ġdida tal-fergħa mill-kopja lokali tagħha tar-repożitorju.
Iż-żamma ta’ repliki sħaħ tagħmilha possibbli li t-talbiet għall-qari jiġu moqdija lokalment, u tiggarantixxi li l-klijenti jaraw stampa konsistenti tar-referenzi kollha, tkun liema tkun ir-replika li jagħżlu. Għaldaqstant, ir-referenzi jiġu aġġornati waħda waħda, u kull push jeħtieġ diversi ċikli ta’ komunikazzjoni biex l-aġġornament tar-referenza jiġi kkoordinat bejn ir-repliki.
L-istennija għal quorum tagħmel il-ħin tal-push dipendenti fuq il-prestazzjoni tad-diski tar-repliki u l-latenza tal-komunikazzjoni. Hekk kif jiżdied il-volum tal-kitba, ir-repliki jridu jlaħħqu kemm mal-pakketti li jaslu kif ukoll mat-traffiku tal-qari.
Fid-disinn ibbażat fuq WAL li mmudellajna, is-servizz Git juża manifest kondiviż fil-ħażna tal-blobs biex jordna l-aġġornamenti fir-repożitorju kollu. Meta server jirċievi push, itella’ l-packfile li jasal f’maħżen tal-blobs u jħejji l-aġġornament tar-referenza fil-kopja lokali tiegħu tar-repożitorju. Biex jippubblika l-push, iżid entrata f’manifest kondiviż maħżun fil-maħżen tal-blobs, li tirreġistra l-aġġornament tar-referenza u tipponta lejn il-packfile. Is-server Git imbagħad jaġġorna l-manifest b’operazzjoni compare-and-swap. Din tissostitwixxi l-manifest b’mod atomiku, jew inkella tirrifjuta l-bidla. Jekk kittieb ieħor ikun aġġornah sadanittant, is-server jaqra l-entrati li żdiedu, jiċċekkja li l-aġġornament tar-referenza tiegħu għadu validu, u jerġa’ jipprova bil-packfile li diġà tella’.
Il-kittieba jistgħu jtellgħu l-packfiles tagħhom b’mod parallel, iżda anki pushes lejn fergħat mhux relatati jeħtieġu l-aġġornament tal-istess manifest. Il-ħin taċ-ċiklu sħiħ għal operazzjoni compare-and-swap li tirnexxi jillimita kemm-il darba r-repożitorju jista’ jippubblika manifest ġdid. Maħżen tal-blobs b’latenza baxxa jgħaġġel dan il-pass. L-ipproċessar f’lottijiet jippermetti lil manifest wieħed jaġġorna diversi referenzi fl-istess ħin, iżda jġiegħel l-aġġornamenti jistennew fi kju u jżid il-latenza.
Il-maħżen tal-blobs jista’ jirċievi packfiles b’mod parallel, iżda l-aġġornamenti tal-manifest kondiviż xorta jikkompetu ma’ xulxin. Iż-żieda fil-kapaċità tal-maħżen tal-blobs waħedha ma ssolvix dak il-punt ta’ konġestjoni. Kull replika xorta trid taqra u tindiċja l-pakketti mill-maħżen tal-blobs qabel tkun tista’ tipprovdihom lokalment. Jekk il-kitbiet jaslu aktar malajr milli jsir dak ix-xogħol, ir-repliki jaqgħu lura u l-klijenti jistennew aktar biex iġibu commits li jkunu għadhom kemm intbagħtu b’push.
Dan iwassalna għal Pando. Pando huwa arkitettura ġdida biex tipprovdi aċċess għar-repożitorji Git, bl-għan li tlaħħaq ma’ ħafna klijenti li jagħmlu push fl-istess ħin. Dan huwa kif taħdem:
Qabel żviluppajna Pando, kellna l-ħsieb li stajna nissodisfaw ir-rekwiżiti tagħna mingħajr ma nagħmlu kompromessi fuq Git. Iżda kellna nagħmlu kompromessi fuq xi affarijiet li l-biċċa l-kbira tas-sistemi Git iqisu bħala rekwiżiti:
Konsistenza fir-repożitorju kollu: Biex tingħata stampa konsistenti tar-referenzi kollha f’mument partikolari, hemm bżonn koordinazzjoni fir-repożitorju kollu. F’sistema li tpoġġi l-aġġornamenti kollha tar-referenzi f’ordni waħda, il-pushes lejn fergħat mhux relatati jikkompetu għall-istess punt ta’ koordinazzjoni.
Packfiles uniċi għal kull klijent: Jekk żewġ klijenti bi storja lokali differenti jiksbu l-istess fergħa, is-server jaf ikollu jiġġenera pakkett differenti għal kull wieħed biex jevita li jibgħatilhom oġġetti li diġà għandhom. Il-ħolqien ta’ dawn it-tweġibiet jikkonsma riżorsi tas-CPU u I/O tad-diska, u dan jagħmilha diffiċli li jiġu appoġġjati għadd kbir ta’ qarrejja.
Minflok, Pando jipprovdi mudell ta’ konsistenza inqas strett (konsistenza kawżali) biex iżid il-kapaċità tal-kitba, u juża l-packfiles mill-ġdid biex iżid il-kapaċità tal-qari.
Meta klijent jagħmel push lejn fergħa, Pando jaħżen il-packfile li jirċievi bħala blob immutabbli f’maħżen tal-blobs. Kull darba li l-fergħa tavvanza, Pando jirreġistra verżjoni tar-referenza f’maħżen tal-metadata. Din tinkludi l-ponta l-ġdida, il-pakkett li pprovdiha, u kull verżjoni preċedenti tar-referenza li l-pakkett jiddependi fuqha. Kemm il-maħżen tal-blobs kif ukoll dak tal-metadata jistgħu jespandu orizzontalment.
Biex jinġieb commit jew referenza minn Pando, irid jintbagħat sett ta’ verżjonijiet tar-referenzi (packfiles) lill-klijent, biex jinbena mill-ġdid l-istat tal-klijent li ħoloq il-verżjoni tar-referenza li qed tinġieb. Dan jipprovdi forma aktar dgħajfa ta’ konsistenza fir-repożitorju kollu, filwaqt li jipprovdi serjalizzabbiltà għall-aġġornamenti ta’ referenzi individwali. Il-klijenti jidħlu f’kunflitt biss meta jagħmlu push lejn l-istess referenza fl-istess ħin. Klijent li jaqra diversi fergħat ma jistax jassumi li dak il-qari jirrappreżenta mument wieħed fir-repożitorju kollu.
Push lejn il-fergħa ewlenija jżid pakkett inkrementali li jkun fih commit wieħed jew aktar. Kull push lejn fergħa sekondarja jerġa’ jinkludi l-commits preċedenti tas-suġġett, biex klijent bil-verżjoni mħabbra tal-fergħa ewlenija jkun jista’ jikseb is-suġġett f’pakkett wieħed.
Din hija forma ta’ konsistenza kawżali. Biex iġib referenza, il-qarrej jara l-istorja tal-kittieb li pproduċieha. Waqt push, Pando jikkontrolla liema storja komuni jaqblu fuqha l-klijent u s-server, biex jiżgura li l-klijenti jipproduċu packfiles li jistgħu jinqasmu aktar faċilment.
Għaldaqstant, Pando ma jipprovdix stat tar-referenzi kollha għal mument wieħed waqt l-operazzjonijiet ta’ Git, u lanqas ordni tal-aġġornamenti tar-referenzi fi ħdan clone jew fetch. Bħala eżempju konkret, ejja nassumu li l-fergħat foo u bar it-tnejn jiġu aġġornati waqt in-negozjar ta’ clone sħiħ. Waqt in-negozjar, klijent wieħed jista’ jara foo fil-verżjoni 1 u bar fil-verżjoni 2, filwaqt li klijent ieħor jara foo fil-verżjoni 2 u bar fil-verżjoni 1. Fil-prattika, l-utenti u l-aġenti ma jiddependux fuq l-ordni globali tal-aġġornamenti tar-referenzi, iżda fuq l-ordni tal-aġġornamenti ta’ referenza waħda.
F’din is-simulazzjoni tat-tliet mudelli ta’ konsistenza, nikkonfiguraw 1,000 klijent biex kull wieħed jagħżel fergħa distinta u mbagħad jagħmel pushes ripetuti ta’ commits uniċi. Inkejlu l-ħin totali li jgħaddi u l-latenza minn push sa fetch. Din tal-aħħar hija metrika importanti għall-piżijiet tax-xogħol, għax tkejjel il-ħin taċ-ċiklu sħiħ biex l-utenti u l-aġenti jikkollaboraw jew jużaw sistemi oħra li jiddependu fuq il-kontroll tal-verżjonijiet. Is-simulazzjoni timmudella hardware li jvarja minn magni virtwali u sistemi tal-ħażna tal-blobs standard sa dawk ta’ livell għoli. F’din is-simulazzjoni, għamilna l-konsistenza fir-repożitorju kollu inqas stretta għall-commit bi tliet fażijiet.
Simulazzjoni ta’ implimentazzjonijiet ta’ servers Git
Segwi kull proċess tal-kitba tul trażmissjonijiet ripetuti, u kejjel separatament meta proċess tal-qari indipendenti jkun jista’ jagħmel checkout ta’ kull commit.
Ħaddem din is-simulazzjoni li tqabbel lil Pando ma’ żewġ approċċi oħra. Agħżel infrastruttura minn hardware standard sa dak ta’ livell għoli, l-għadd ta’ klijenti u settings oħra biex tara kif jitqabblu.
Is-sistema mmudellata ta’ commit bi tliet fażijiet turi latenza tal-kitba ferm akbar taħt tagħbija hekk kif id-diski tagħha jilħqu l-kapaċità massima. Min-naħa l-oħra, is-sistemi b’reġistru tal-kitba bil-quddiem juru latenza tal-qari ferm akbar għall-istess raġuni, għax is-servers isibuha diffiċli jlaħħqu mal-qari mir-reġistru. Kemm fit-testijiet reali fuq il-monorepo tagħna kif ukoll f’din is-simulazzjoni, Pando jappoġġja ħafna eluf ta’ klijenti li jistgħu jagħmlu push fl-istess ħin mingħajr ma jaffettwaw il-prestazzjoni taħt tagħbija.
Meta jipproċessa push, Pando jivvalida l-packfile li jirċievi waqt li jgħaddih bħala fluss lejn il-ħażna tal-blobs, mingħajr l-estrazzjoni tiegħu f’repożitorju lokali. Meta klijent jibda fetch, Pando jagħżel il-pakketti maħżuna li jeħtieġ il-qarrej, u l-qarrej iniżżilhom. Ebda server ma jeħtieġ japplika packfiles għal repożitorju lokali jew iwettaq operazzjonijiet ta’ estrazzjoni u żżippjar li jikkonsmaw ħafna riżorsi. Billi dawn is-servers prinċipalment iwettqu negozjar u għażla ta’ packfiles, is-servers ta’ Pando jistgħu jaħdmu fuq hardware standard.
Dan jippermetti lil Pando jespandi sal-limiti tal-klijenti, tan-network bejn il-klijenti u Pando, u tas-servizz tal-ħażna tal-blobs. B’kapaċità biżżejjed, kull klijent li jaħdem fuq fergħa indipendenti jista’ jittrasferixxi l-pakketti bl-ogħla veloċità li tippermetti l-konnessjoni tiegħu. Biex naqdu aktar klijenti b’dik ir-rata, nistgħu nżidu s-servers ta’ Pando u nespandu magħhom il-maħżen tal-metadata u dak tal-blobs.
It-trażmissjoni u l-ġbir ta’ fergħa f’Pando
Pando jaħżen il-fajl tal-pakkett tal-proċess tal-kitba fil-ħażna tal-blobs u jirreġistra l-verżjoni tar-referenza fis-servizz tal-metadata. Waqt il-ġbir, Pando jagħżel il-pakketti li jeħtieġ il-proċess tal-qari, u Express jgħaddihomlu.
Aġent jeditja l-fajls, joħloq commit lokalment u jħaddem git push, li joħloq packfile ta’ dawk il-bidliet biex jaġġorna fergħa. Pando jirċievi l-pakkett u jgħaddih bħala fluss lejn il-ħażna tal-blobs. Wara li jivvalida l-push li jirċievi billi jiddekodifikah f’pass wieħed, Pando juża tranżazzjoni b’diversi kjavijiet biex jirreġistra verżjoni tar-referenza fil-maħżen tal-metadata tagħna u jaġġorna l-pointer tar-referenza b’mod atomiku. Dan jippermetti lil Pando jipprovdi konsistenza tat-tip “aqra dak li ktibt int stess”. Din l-operazzjoni sħiħa tal-kitba teħtieġ operazzjonijiet ta’ qari u kitba tal-metadata.
Meta klijent ieħor iġib il-fergħa, Pando jagħżel sett ta’ pakketti maħżuna abbażi tal-istorja li l-klijent diġà għandu. Din l-operazzjoni teħtieġ operazzjonijiet ta’ qari tal-metadata, fejn hija l-iqsar distanza f’verżjonijiet tar-referenzi bejn dak li għandu l-klijent u dak li jrid. Is-server jirritorna URIs tal-packfiles, u l-klijent iniżżilhom permezz ta’ servizz, Express, li jaħżen il-packfiles f’caches reġjonali.
Dan id-disinn jiddependi fuq it-tliet servizzi ċentrali tal-arkitettura ta’ Pando: pushes, fetches u kompattazzjoni.
Meta klijent jagħmel push, server Git konvenzjonali jkun bħal plejer tal-poker li jikxef il-karti kollha tiegħu: juri lill-klijent kull fergħa li għandu. Il-klijent imbagħad jiġbor il-commits, is-siġar u l-blobs biex joħloq packfile li jeskludi l-oġġetti li jaf li s-server diġà għandu.
It-tħabbir ta’ aktar referenzi jista’ jnaqqas id-daqs tal-push. Jista’ wkoll jagħmilha aktar diffiċli li l-pakkett jerġa’ jintuża, għax klijent ieħor jaf ikun nieqes minn oġġetti li l-kittieb ħalla barra.
Pando jieħu approċċ differenti. Minflok jikxef il-karti kollha tiegħu, iħabbar biss sett magħżul ta’ fergħat lill-klijent. Dan isir għal żewġ raġunijiet:
Li tipprovdi stampa konsistenti ta’ kull referenza jiswa ħafna riżorsi. B’miljuni ta’ fergħat, it-tħabbir tar-referenzi waħdu jista’ jaqbeż il-100 MiB. Biex jipprovdi dan, kull server irid jew iżomm mappa aġġornata, li teħtieġ ħafna xogħol ta’ koordinazzjoni, jew jagħmel mistoqsija lid-database li tikber mal-għadd ta’ referenzi.
Meta l-klijent jingħata biss subsett tar-referenzi, jiġġenera pakkett li jiddependi biss fuq dak li s-server jippermettilu espliċitament jeskludi. It-traċċar tad-dipendenzi jippermetti lil Pando jerġa’ juża l-packfile li klijent jiġġenera f’push wieħed billi jipprovdih bħala tweġiba għal fetch sussegwenti.
Aktar ma server Git iħabbar referenzi, aktar il-klijenti li jagħmlu push ikollhom sorsi li minnhom jistgħu jeskludu oġġetti, u b’hekk jipproduċu pakketti iżgħar. Madankollu, biex jerġa’ juża dawn il-packfiles, is-server irid ikun jista’ jivverifika li l-klijenti li jagħmlu fetch għandhom kull waħda mid-dipendenzi. Inkella, il-packfile jista’ jħalli barra oġġetti li l-klijent jeħtieġ.
Min-naħa l-oħra, jekk server Git ma jħabbar ebda referenza, il-klijent jiġġenera packfile bl-istorja sħiħa tar-repożitorju. Dak il-packfile jista’ jintuża minn kwalunkwe klijent ieħor, iżda bi spiża sinifikanti: kull fetch ta’ fergħa effettivament isir clone sħiħ.
It-tħabbir ta’ aktar referenzi jwassal għal packfiles iżgħar. Il-biċċa l-kbira tat-tnaqqis fid-daqs tista’ tinkiseb billi titħabbar waħda biss.
B’mod awtomatiku, meta klijent jagħmel push ta’ fergħa ġdida għal funzjonalità, Pando jħabbar biss fergħa ewlenija magħżula bħala bażi. Dan iżomm it-tħabbir bl-istess daqs hekk kif jiżdiedu l-fergħat fir-repożitorju, iżda jinvolvi kompromessi. Meta inġinier jagħmel ħafna pushes lejn fergħa waħda, jew jibni fergħa għal funzjonalità fuq oħra, il-klijent irid jerġa’ jibgħat kulma jinsab barra l-fergħa ewlenija.
Dan iwassal biex il-pushes suċċessivi tal-fergħa jkunu akbar, b’oġġetti potenzjalment ripetuti, u jikkonsmaw aktar bandwidth tal-klijent. Fil-monorepo tagħna, id-daqs medjan tal-packfiles prodotti b’dan il-mod kien taħt l-20 KiB, u d-99 perċentil kien taħt it-3 MiB. Għalina, dan kien kompromess raġonevoli għax qarrej li diġà għandu l-istorja mħabbra tal-fergħa ewlenija jista’ jġib il-fergħa b’dak il-packfile wieħed.
Wara li jagħżel is-sett ta’ referenzi li se jħabbar lill-klijent, Pando jaċċetta l-push u jaġġorna l-maħżen tal-metadata tiegħu. Pando jaqsam l-aġġornament tal-metadata f’parti sinkronika u oħra asinkronika. L-aġġornament sinkroniku tal-metadata jiżgura li l-klijenti jkunu jistgħu jġibu l-commit li jkun għadu kemm ġie aġġornat minnufih. Dan jikteb verżjoni ġdida tar-referenza u jaġġorna l-mappa tal-pointer tar-referenza għal dik il-verżjoni, waqt li jaħżen il-ponta l-ġdida, id-dipendenzi użati biex jiġi nnegozjat il-packfile, u link għall-packfile li ntbagħat bil-push.
Fl-istess ħin, xogħol asinkroniku jiġi rreġistrat fl-istess tranżazzjoni, bħall-iskedar tal-kompattazzjoni. Għal pushes kbar ħafna, subsett biss tal-commits jinkiteb b’mod sinkroniku. B’hekk neħtieġu biss għadd kostanti ta’ operazzjonijiet ta’ qari u kitba fil-maħżen tal-metadata, ikun kemm ikun kbir il-push.
Huwa importanti li s-servers ta’ Pando jistgħu jaċċettaw pushes lejn referenzi mhux relatati b’mod indipendenti. L-unika kjavi li jkun hemm kompetizzjoni għaliha hija l-pointer tar-referenza, li nipproteġu b’operazzjoni atomika simili għal compare-and-swap. Nistgħu nżidu t-throughput tal-kitba billi nżidu servers ta’ Pando, unitajiet ta’ espansjoni tal-maħżen tal-metadata, jew imħażen tal-blobs.
Meta klijent jagħmel fetch, jipprovdi lis-server b’żewġ settijiet ta’ IDs tal-commits, magħrufa fil-protokoll bħala haves u wants. Server Git konvenzjonali jikkalkula d-differenza bejn is-sett ta’ oġġetti li jistgħu jintlaħqu mill-haves u dawk li jistgħu jintlaħqu mill-wants, jikkompressahom, u jibgħat ir-riżultat lill-klijent. Għalkemm is-server open-source ta’ Git għandu diversi indiċijiet lokali biex iħaffef din l-operazzjoni, il-ġenerazzjoni ta’ dawn il-packfiles tista’ tiswa ħafna riżorsi u ġeneralment ma jkunux adattati tajjeb għall-caching.
Minflok, Pando juża l-assoċjazzjonijiet tal-commits irreġistrati waqt il-pushes biex ifittex l-entrati have u want tal-klijent, u jassoċjahom ma’ sett ta’ verżjonijiet tar-referenzi li fihom dawk il-commits. Kull waħda minn dawk il-verżjonijiet tar-referenzi għandha link għal packfile li Pando jkun irċieva qabel. Is-server juża dan biex jiddetermina x’jeħtieġ il-klijent, u jagħżel il-packfiles li jkopru s-sett ta’ oġġetti meħtieġa.
Ippjanar tal-ġbir tad-data f’Pando
Pando jqabbel dak li għandu l-klijent ma’ dak li jrid, imbagħad jagħżel il-fajls tal-pakketti maħżuna li jeħtieġ—inklużi d-dipendenzi neqsin tal-fergħat.
Ġib 27 pakketti tal-fergħa prinċipali.
Agħżel fergħa biex tinkludi d-dipendenzi tagħha mill-fergħa prinċipali.
Pando jassoċja l-haves u l-wants tal-protokoll Git ma’ sekwenza ta’ verżjonijiet tar-referenzi. Talba għal fergħa sekondarja timplika talba li tinkludi wkoll id-dipendenzi tagħha fuq il-fergħa ewlenija.
Il-protokoll Git jippermetti li jintbagħat packfile wieħed biss fit-tweġiba HTTP għal clone jew fetch. Madankollu, funzjonalità tal-protokoll Git li ma tingħatax biżżejjed attenzjoni, packfile-uri, tippermetti lis-server jirritorna links biex jitniżżlu pakketti addizzjonali separatament. Pando juża biss dan il-metodu, u jibgħat packfile vojt fit-tweġiba nnifisha. Biex tappoġġja din il-funzjonalità, OpenAI kkontribwiet diversi titjibiet għal packfile-uri fil-proġett oriġinali.
Is-sistemi ta’ OpenAI jaħdmu f’ħafna reġjuni ġeografiċi, għalhekk inżommu clusters ta’ Pando b’caches lokali f’kull wieħed. Servizz għat-twassil tal-pakketti, Express, iżomm cache tal-maħżen tal-blobs tagħna, u servizz separat iżomm cache tal-maħżen tal-metadata. Dawn il-caches jippermettu lil Pando jaqdi talbiet għal ID ta’ commit jew qari speċjali ta’ referenza kompletament mill-istat maħżun fil-cache ta’ dak il-cluster. Nużaw hashing konsistenti biex nidderieġu t-talbiet għal packfile lejn is-servers ta’ Express, b’rati ta’ sejba fil-cache ta’ aktar minn 99%.
Din is-sistema ta’ caches tipprovdi throughput għoli ħafna, biżżejjed biex tilħaq il-limitu tan-network bejn il-klijenti u Pando. Bl-użu ta’ dawn il-URIs tal-packfiles u l-caches lokali, ivverifikajna li, anki b’magni virtwali standard biss ta’ fornitur tal-cloud, l-operazzjonijiet clone u fetch jużaw il-kapaċità kollha ta’ konnessjonijiet tan-network ta’ 10 Gbps.
Għall-biċċa l-kbira tas-servers Git, l-ippakkjar mill-ġdid u t-tneħħija tad-data mhux meħtieġa huma meħtieġa biex tinżamm il-prestazzjoni ta’ repożitorju li qed jikber. Dawn iż-żewġ passi jirkupraw l-ispazju, iżda jeħtieġu ħafna komputazzjoni u I/O.
F’repożitorju li jinbidel malajr bħall-monorepo ta’ OpenAI, mhuwiex prattiku li jintbagħat URI ta’ packfile individwali għal kull push li seħħ mill-aħħar fetch. Kuljum, klijent ikollu jniżżel għexieren ta’ eluf ta’ packfiles biex jaġġorna l-fergħa ewlenija tiegħu.
Minflok, Pando jgħaqqad pakketti fl-isfond biex inaqqas dan ix-xogħol żejjed, b’disinn simili għall-kompattazzjoni f’siġar ta’ għaqda strutturati bħala reġistru. Kull push jipproduċi dak li Pando jsejjaħ packfile “L0”, li jirrappreżenta l-iżgħar unità ta’ data li Pando jista’ jittrażmetti. Maż-żmien, proċessi fl-isfond jiġbru dawn il-packfiles fi gruppi ta’ kopertura li jkopru sekwenza ta’ verżjonijiet tar-referenzi, u jikbru ġeometrikament minn L0. Illum, il-monorepo tagħna juża gruppi ta’ kopertura tal-packfiles sal-livell L4.
Dawn il-gruppi ta’ kopertura jaqdu żewġ skopijiet. Meta grupp ta’ kopertura jkun mimli biżżejjed, proċess ta’ kompattazzjoni jieħu ħsiebu u jipproduċi packfile wieħed. Dan itejjeb il-proporzjon tal-kompressjoni billi jorganizza mill-ġdid l-oġġetti fil-packfile. Iżda jtejjeb ukoll il-prestazzjoni tan-negozjar tal-fetch billi jaġixxi bħala lista b’qabżiet bejn il-verżjonijiet tar-referenzi. Billi jiskennja l-indiċijiet f’kull livell fl-istess ħin, Pando jista’ jagħżel sett ta’ pakketti biex jibgħat lill-klijent fi żmien logaritmiku. Dawn il-gruppi ta’ kopertura tal-packfiles, kemm jekk ippakkjati mill-ġdid kif ukoll jekk le, jippermettu ppjanar aktar effiċjenti tal-fetches, u jnaqqsu r-rekwiżiti kemm tat-throughput kif ukoll tal-latenza għal Pando.
Kompattazzjoni f’Pando
Fajls żgħar ta’ pakketti jinġabru f’koperturi akbar f’livelli differenti, biex titjieb il-kompressjoni u jitħaffef il-ġbir tad-data.
Il-kompattazzjoni tgħaqqad fl-isfond packfiles minn ħafna verżjonijiet tar-referenzi, biex tippermetti fetches aktar effiċjenti b’inqas fajls.
B’differenza minn ħafna servers Git, il-packfiles jinżammu f’kull livell u ma jintremewx jew jitneħħew bħala data mhux meħtieġa. Il-pakketti f’kull livell jintużaw kontinwament biex jaqdu lill-klijenti, abbażi tal-entrati have u want li jibagħtu f’fetch. Għall-klijenti li jużaw Pando bħala API, il-qari ta’ oġġett arbitrarju minn packfile ġeneralment jeħtieġ inqas qari ta’ data minn L0 milli minn L4, għax ikun inqas probabbli li l-oġġett ikun ikkompressat.
Il-kompattazzjoni f’Pando tnaqqas b’mod sinifikanti d-daqs totali tad-data ttrasferita lill-klijenti, u tippermetti li l-ippjanar tal-pakketti jikber b’mod sublineari skont kemm il-klijent ikun baqa’ lura. Dan huwa partikolarment importanti għal repożitorji kbar li jinbidlu malajr, li nistennew li jsiru n-norma l-ġdida fl-iżvilupp tas-software.
Bnejna Pando b’Codex, mill-bidu sal-produzzjoni, f’10 ġimgħat biss. Il-qalba ta’ Pando tfasslet minn inġinier wieħed, ġiet implimentata minn timijiet ta’ aġenti, u tnediet minn ftit inġiniera. Pando beda jipproċessa traffiku tal-produzzjoni f’April ta’ din is-sena, u huwa parti minn sistema akbar ta’ għodod għall-ġestjoni tal-kontroll tal-kodiċi sors użati f’OpenAI.
Użajna firxa wiesgħa ta’ approċċi biex nivvalidaw id-disinn ta’ Pando. Applikajna l-prinċipji tagħna biex nibnu pedamenti aktar siguri għas-software. Billi kien proġett mibdi mill-bidu, għażilna li nimplimentaw Pando f’Rust u mingħajr dipendenzi fuq sistemi antiki. Ktibna sett ta’ testijiet tal-konformità biex l-aġenti jkunu jistgħu jittestjaw il-bidliet tagħhom kontra l-imġiba standard ta’ Git. Żviluppajna wkoll harnesses tal-ittestjar b’simulazzjoni deterministika biex niċċekkjaw l-invarjanti u l-proprjetajiet tas-sistema, u b’hekk insibu u nnaqqsu kundizzjonijiet sottili ta’ tellieqa u rigressjonijiet fin-negozjar u l-ippjanar tal-pakketti.
Ħafna mudelli kkontribwew għal din is-sistema; hekk kif saru disponibbli mudelli ġodda, użajniehom biex intejbu l-prestazzjoni u l-affidabbiltà ta’ Pando. Bl-użu ta’ GPT‑6 Astra, l-aġenti kitbu f’Lean u TLA+ biex jifformalizzaw “teorija ta’ Pando” li użajna biex insibu u nsewwu bugs fl-implimentazzjoni, u nippruvaw proprjetajiet tas-sistema. Diversi sessjonijiet kontinwi damu għaddejjin għal mijiet ta’ sigħat, isibu u jsewwu każijiet estremi f’Pando. Inħaddmu wkoll aġenti lejl u nhar biex jittestjaw is-sigurtà ta’ Git u Pando b’attakki simulati, bl-użu ta’ mudelli bil-kapaċitajiet ta’ Daybreak.
Inizjalment nedejna Pando bħala proxy li jgħaddi l-qari u l-kitba lis-sistema eżistenti tagħna tal-kontroll tal-kodiċi sors. Dan ippermettilna nżommu lil Pando u s-sistema preċedenti sinkronizzati, biex immexxu t-traffiku lejn Pando b’mod sigur mingħajr waqfien tas-servizz.
Bħala parti mid-disinn tal-caching tiegħu, Pando jista’ wkoll ineħħi talbiet duplikati u jgħaqqad it-talbiet qabel jgħaddihom bħala proxy. Dan ippermettilna nżommu l-għodod eżistenti tagħna jaħdmu tajjeb waqt li konna qed inmexxu s-sistemi lejn Pando waħda waħda. Hekk kif emigrajna aktar xogħol lejn Pando, il-pushes tiegħu mlew il-cache ta’ Pando u tejbu l-affidabbiltà tal-backend preċedenti tagħna.
Biex nottimizzaw il-prestazzjoni meta jintuża Pando, bdejna nqassmu d-distribuzzjoni pubblika tagħna ta’ Git fuq il-magni tal-iżviluppaturi u fl-app tad-desktop ta’ ChatGPT. Biex nemigraw il-klijenti lejn Pando, użajna saff intern madwar is-CLI ta’ Git biex nagħmlu l-migrazzjoni f’fażijiet. Ħloqna ħafna għodod oħra għall-ġestjoni tat-talbiet għal bidliet, ir-reviżjoni tal-kodiċi, u APIs għall-awtomazzjonijiet. Flimkien mat-traffiku Git, emigrajna mijiet ta’ integrazzjonijiet li kienu jiddependu fuq APIs antiki, webhooks u tniżżil ta’ repożitorji.
Codex innifsu għen lill-iżviluppaturi u lit-timijiet jagħmlu l-bidla. Ħloqna ħiliet biex iħejju l-kopji tax-xogħol eżistenti, u biex jiggwidaw lill-aġenti fl-użu tas-sistema l-ġdida. B’hekk, l-iżviluppaturi setgħu sempliċement jitolbu lil Codex jemigra l-ambjenti tal-iżvilupp u s-servizzi tagħhom.
Il-qlib għal Pando tejjeb l-affidabbiltà tal-għaqdiet u naqqas il-latenza medjana tal-push bi kważi 80%.
Pando jista’ jwassal petabyte ta’ data Git kuljum bi ftit cores tas-CPU biss. Pando wassal aktar minn 57 terabyte ta’ pakketti Git f’siegħa waħda, b’aktar minn 99% ta’ dawk il-bytes ġejjin mill-cache tad-diska lokali.
L-użu mill-ġdid tal-pakketti jippermetti lil ħafna klijenti jniżżlu l-istess storja tar-repożitorju bi ftit komputazzjoni fuq in-nodi li jipprovduha. Dan l-eżempju juri repożitorju wieħed, iżda Pando huwa mfassal biex jappoġġja ħafna aktar. Hekk kif tikber id-domanda, nistgħu nżidu l-kapaċità tat-twassil tad-data u tan-negozjar Git b’mod indipendenti.
Il-bini ta’ Pando fuq il-protokoll u l-klijent Git għenna nidentifikaw bugs u opportunitajiet biex intejbu l-prestazzjoni ta’ Git innifsu.
Pereżempju, Pando jipprovdi pakketti li jistgħu jerġgħu jintużaw direttament lill-klijenti, għalhekk it-tniżżil u l-indiċjar tagħhom saru parti ċentrali biex is-sistema tkun veloċi u affidabbli. Dak ix-xogħol kixef każijiet estremi fit-tniżżil simultanju, fit-tindif wara trasferimenti interrotti, u fit-tkomplija ta’ tniżżil li kien diġà tlesta. Irranġajna dawk il-mogħdijiet tal-eżekuzzjoni, żidna validazzjonijiet meta jiġi aċċettat pakkett eżistenti għal fetch, u kkontribwejna dak ix-xogħol lura lill-proġett oriġinali.
Kellna bżonn naraw ukoll fejn kienu qed jintefqu l-ħin u l-bandwidth, għalhekk żidna traċċar għat-tniżżil ta’ packfile-uri u għadd tal-bytes għall-ġenerazzjoni tal-pakketti. Dan għamilha aktar faċli li naraw jekk fetch bil-mod kienx qed iqatta’ l-ħin jiġġenera l-pakketti jew jittrasferihom.
Fil-verżjoni ta’ Git ta’ OpenAI(jinfetaħ f’tieqa ġdida), il-klijent jista’ jniżżel u jindiċja pakketti indipendenti b’mod parallel. Żidna l-kunċett ta’ “haves espliċiti” biex server ikun jista’ jħabbar il-ponta attwali ta’ fergħa separatament mill-istorja li klijent li jagħmel push jista’ jħalli barra mill-pakkett tiegħu. F’Pando, dan jippermetti lill-klijenti jużaw --force-with-lease biex jiċċekkjaw li fergħa għal funzjonalità ma tkunx avvanzat u jibnu l-pakkett tagħha abbażi tal-fergħa ewlenija biss. Kull min ikollu dik l-istorja tal-fergħa ewlenija mbagħad jista’ jġib il-fergħa bl-istess pakkett.
Diversi minn dawn it-titjibiet diġà jinsabu fil-proġett oriġinali ta’ Git, u ħafna oħrajn fir-repożitorju pubbliku tagħna. Qed inkomplu naħdmu mal-komunità ta’ Git biex dawn it-titjibiet ikunu utli wkoll lil hinn minn Pando. Tista’ ssegwi dak ix-xogħol fis-sistema pubblika tagħna ta’ traċċar tal-patches(jinfetaħ f’tieqa ġdida).
Billi jerġa’ jaħseb il-fehmiet tradizzjonali dwar kif jespandu r-repożitorji Git, Pando jippermettilna nespandu l-monorepo tagħna mingħajr ma nbiddlu l-flussi tax-xogħol Git li diġà jużaw l-inġiniera u l-aġenti tagħna. Fil-monorepo tagħna, Pando ppermetta aktar xogħol parallel, tejjeb l-affidabbiltà tal-għaqdiet, u naqqas il-ħin meħtieġ biex jiġu ppubblikati bidliet fil-kodiċi. Lil hinn mill-monorepo tagħna, qed nesploraw ukoll użi oħra għal Pando fi ħdan OpenAI, inkluż xogħol fejn għadd kbir ta’ aġenti jeħtieġ jikkollaboraw fuq repożitorju Git kondiviż.
Hekk kif l-inġiniera u l-aġenti jipproduċu aktar software, aktar timijiet barra OpenAI se jiltaqgħu mal-limiti li ltqajna magħhom fil-kontroll tal-kodiċi sors. Bħalissa qed nesploraw modi kif naqsmu mal-utenti tagħna t-teknoloġija li tagħmel Pando possibbli.
Pando jibni fuq għoxrin sena ta’ esperjenza tal-utenti u l-operaturi tar-repożitorji Git. Se nkomplu niżviluppaw Pando filwaqt li naħdmu mal-komunità open-source ta’ Git biex naqsmu kull titjib li jkun ta’ benefiċċju usa’ għall-utenti ta’ Git.


