de Sue Denim (nu numele real al autorului)

[Vă rugăm să rețineți: o analiză de urmărire este acum disponibilă aici.]

Imperial a lansat în cele din urmă un derivat al codului lui Ferguson. M-am gândit că voi face o recenzie și vă voi trimite câteva dintre lucrurile pe care le-am observat. Nu vă cunosc trecutul, așa că vă scuzați dacă unele dintre acestea sunt prezentate la un nivel greșit.

Trecutul meu. Scriu software de 30 de ani. Am lucrat la Google între 2006 și 2014, unde am fost inginer software principal care lucra pe Maps, Gmail și securitatea contului. Am petrecut ultimii cinci ani la o firmă din SUA/Marea Britanie unde am proiectat produsul bazei de date a companiei, printre alte locuri de muncă și proiecte. De asemenea, am fost consultant independent timp de câțiva ani. Evident, îmi dau doar propria părere profesională și nu vorbesc pentru angajatorul meu actual.

Codul. Nu este codul pe care Ferguson l-a executat pentru a produce faimosul său Raport 9. Ceea ce a fost lansat pe GitHub este un derivat puternic modificat al acestuia, după ce a fost actualizat de peste o lună de o echipă de la Microsoft și alții. Această bază de cod revizuită este împărțită în mai multe fișiere pentru lizibilitate și scrisă în C ++, în timp ce programul original era „un singur fișier de 15.000 de linii la care s-a lucrat timp de un deceniu” (aceasta este considerată o practică extrem de slabă). O cerere pentru codul original a fost făcută acum 8 zile, dar ignorată și probabil va fi nevoie de un fel de constrângere legală pentru a-i face să fie eliberați. În mod clar, Imperialii sunt prea jenați de starea de a-l elibera vreodată din propria lor voință, ceea ce este inacceptabil, dat fiind că a fost plătit de contribuabil și le aparține.

Modelul. Ceea ce face este cel mai bine descris ca „SimCity fără grafică”. Încearcă să simuleze gospodăriile, școlile, birourile, oamenii și mișcările acestora etc. Nu voi merge mai departe în ipotezele subiacente, deoarece acest lucru este bine explorat în altă parte.

Rezultate nedeterministe. Datorită erorilor, codul poate produce rezultate foarte diferite, având date de intrare identice. În mod obișnuit, aceștia acționează ca și când acest lucru nu ar fi important.

Această problemă face codul inutilizabil în scopuri științifice, dat fiind că o parte cheie a metodei științifice este capacitatea de a reproduce rezultatele. Fără replicare, descoperirile s-ar putea să nu fie deloc reale - deoarece domeniul psihologiei a aflat la costul său. Chiar dacă codul lor original a fost lansat, este evident că aceleași numere ca în Raportul 9 s-ar putea să nu iasă din el.

Rezultatele nedeterministe ar putea avea o oarecare explicație, deoarece nu este ceva pe care cineva l-a plătit anterior ca posibilitate.

Documentația spune:

Modelul este stocastic. Pentru a vedea un comportament mediu, ar trebui să se efectueze alergări multiple cu semințe diferite.

„Stochastic” este doar un cuvânt cu sunet științific pentru „aleator”. Aceasta nu este o problemă dacă aleatoritatea este pseudoaleatorie intenționată, adică întâmplarea este derivată dintr-o „sămânță” inițială care este iterată pentru a produce numerele aleatoare. O astfel de întâmplare este adesea utilizată în tehnicile Monte Carlo. Este sigur, deoarece sămânța poate fi înregistrată și aceleași (pseudo-) numere aleatorii produse din ea în viitor. Orice copil care a jucat Minecraft este familiarizat cu pseudo-aleatoriu, deoarece Minecraft îți oferă semințele pe care le folosește pentru a genera lumile aleatorii, deci prin partajarea semințelor poți împărtăși lumi.

În mod clar, documentația dorește să ne gândim că, având în vedere o serie inițială, modelul va produce întotdeauna aceleași rezultate.

Investigația relevă adevărul: codul produce rezultate extrem de diferite, chiar și pentru semințe și parametri de pornire identici.

Voi ilustra cu câteva bug-uri. În numărul 116, o „echipă roșie” din Marea Britanie de la Universitatea din Edinburgh raportează că au încercat să utilizeze un mod care stochează tabelele de date într-un format mai eficient pentru o încărcare mai rapidă și au descoperit - spre surprinderea lor - că predicțiile rezultate au variat cu aproximativ 80.000 de decese după 80 de zile:

codului

Acest mod nu schimbă nimic în legătură cu simularea lumii, deci acest lucru a fost evident o eroare.

Răspunsul echipei imperiale este că nu contează: sunt „conștienți de unele mici nedeterminisme”, dar „acest lucru a fost considerat istoric acceptabil din cauza naturii stochastice generale a modelului”. Rețineți expresia aici: Imperial știe că codul lor are astfel de erori, dar acționează ca și cum ar fi o anumită aleatorie inerentă a universului, mai degrabă decât un rezultat al codificării amatorilor. Aparent, în epidemiologie, o diferență de 80.000 de decese este „un mic nedeterminism”.

Imperial a sfătuit Edinburgh că problema dispare dacă rulați modelul în modul cu un singur fir, așa cum fac ei. Acest lucru înseamnă că sugerează utilizarea unui singur nucleu CPU mai degrabă decât numeroasele nuclee pe care orice joc video le-ar folosi cu succes. Pentru o simulare a unei țări, utilizarea unui singur nucleu de procesor este, evident, o problemă gravă - cât de departe poți obține de la supercomputere. Cu toate acestea, așa folosesc Imperial codul: știu că se rupe atunci când încearcă să îl ruleze mai repede. Din citirea codului reiese clar că în 2014 Imperial a încercat să facă codul să utilizeze mai multe procesoare pentru a-l accelera, dar niciodată nu a făcut ca acesta să funcționeze în mod fiabil. Se știe că acest tip de programare este dificil și necesită, de obicei, ingineri experimentați pentru a obține rezultate bune. Rezultatele care se schimbă aleatoriu de la o rulare la alta sunt o consecință obișnuită a erorilor de siguranță a firului. Mai colocvial, acestea sunt cunoscute sub numele de „Heisenbugs”.

Dar Edinburgh s-a întors și a raportat că - chiar și în modul cu un singur fir - ei încă văd problema. Așadar, înțelegerea de către Imperial a problemei este greșită. În cele din urmă, Imperial recunoaște că există o eroare făcând referire la o modificare a codului pe care au făcut-o, care o remediază. Explicația dată este „Se pare că istoric a fost folosită a doua pereche de semințe în acest moment, pentru a face rulările identice indiferent de modul în care a fost realizată rețeaua, dar că acest lucru a fost schimbat când s-a implementat resetarea semințelor”. Cu alte cuvinte, în procesul de schimbare a modelului, l-au făcut să nu fie reproductibil și niciodată să nu fie observat.

De ce nu au observat? Deoarece codul lor este atât de adânc plin de bug-uri similare și s-au străduit atât de mult să le remedieze, încât au luat obiceiul de a calcula media rezultatelor mai multor alergări pentru a-l acoperi în cele din urmă și, în cele din urmă, acest comportament a devenit normalizat în cadrul echipei.

În numărul 30, cineva raportează că modelul produce ieșiri diferite în funcție de ce tip de computer rulează (indiferent de numărul de procesoare). Din nou, explicația este că, deși această nouă problemă „se va adăuga doar problemelor” ... „Aceasta nu este o problemă la executarea completă a modelului, întrucât este stocastic oricum”.

Deși academicianul din aceste subiecte nu este Neil Ferguson, el este foarte conștient de faptul că codul este plin de bug-uri care creează rezultate aleatorii. În modificarea nr. 107, el a scris: „Include remedieri la InitModel pentru a asigura rulări deterministe cu sărbătorile activate”. În schimbarea nr. 158, el descrie schimbarea doar ca „O mulțime de mici modificări, unele critice pentru determinare”.

Imperial încearcă să-și ia tortul și să-l mănânce. Rapoartele privind rezultatele aleatorii sunt respinse cu răspunsuri precum „nu este o problemă, pur și simplu executați-o de multe ori și luați media”, dar în același timp, remediază astfel de erori atunci când le găsesc. Știu că codul lor nu poate rezista controlului, așa că l-au ascuns până când profesioniștii au avut șansa să îl remedieze, dar daunele cauzate de peste un deceniu de programare a hobby-urilor amatori sunt atât de extinse încât nici Microsoft nu a reușit să-l facă să ruleze corect.

Fără teste. În discuția despre remedierea primului bug, Imperial a spus că codul era determinist în acel loc, dar l-au rupt fără să observe când schimbă codul.

Regresii de acest gen sunt frecvente atunci când se lucrează la un software complex, motiv pentru care echipele industriale de inginerie software scriu teste de regresie automate. Acestea sunt programe care rulează programul cu intrări variate și apoi verifică dacă rezultatele sunt așteptate. Fiecare modificare propusă este executată împotriva fiecărui test și, în cazul în care testele eșuează, este posibil ca modificarea să nu fie făcută.

Codul imperial nu pare să aibă teste de regresie de lucru. Au încercat, dar amploarea comportamentului aleatoriu din codul lor i-a lăsat învinși. La 4 aprilie, ei au spus: „Cu toate acestea, nu am avut timp pentru a elabora un mod scalabil și menținut de a rula testul de regresie într-un mod care permite o cantitate mică de variație, dar nu lasă cifrele să derive în timp. "

Dincolo de natura aparent insalubră a acestei baze de cod specifice, testarea predicțiilor modelului se confruntă cu o problemă fundamentală, în sensul că autorii nu știu care este răspunsul „corect” până la mult timp după fapt, și până atunci codul s-a schimbat din nou oricum, astfel schimbând setul de bug-uri din acesta. Deci, nu este clar ce înseamnă cu adevărat testele de regresie pentru modele de acest gen - chiar dacă au avut unele care au funcționat.

Ecuații nedocumentate. O mare parte din cod constă în formule pentru care nu este dat niciun scop. John Carmack (un legendar programator de jocuri video) a presupus că unele dintre coduri ar fi putut fi traduse automat din FORTRAN acum câțiva ani.

De exemplu, pe linia 510 din SetupModel.cpp există o buclă peste toate „locurile” despre care știe simularea. Acest cod pare să încerce să calculeze R0 pentru „locuri”. Hotelurile sunt excluse în timpul acestui permis, fără explicații.

Această bucată de cod evidențiază o problemă pe care Caswell Bligh a discutat-o ​​în comentariile site-ului dvs.: R0 nu este o caracteristică reală a virusului. R0 este atât o intrare, cât și o ieșire a acestor modele și este ajustată în mod obișnuit pentru diferite medii și situații. Modelele care își consumă propriile rezultate ca intrări este o problemă bine cunoscută sectorului privat - poate duce la divergențe rapide și predicții incorecte. Există o discuție despre această problemă în secțiunea 2.2 din lucrarea Google, „Învățarea automată: cardul de credit cu dobândă ridicată a datoriilor tehnice”.

Dezvoltare continuă. În ciuda faptului că sunt conștienți de problemele grave din codul lor pe care „nu au avut timp” să le remedieze, echipa Imperial continuă să adauge noi caracteristici; de exemplu, modelul încearcă să simuleze impactul aplicațiilor digitale de urmărire a contactelor.

Adăugarea de noi funcții la o bază de coduri cu aceste numeroase probleme de calitate le va compune și le va înrăutăți. Dacă aș vedea acest lucru într-o companie pe care o consultam, i-aș sfătui imediat să oprească dezvoltarea de noi funcții până când testele de regresie amănunțite au fost în vigoare și calitatea codului a fost îmbunătățită.

Concluzii. Toate lucrările bazate pe acest cod ar trebui retractate imediat. Eforturile de modelare ale Imperial ar trebui resetate cu o nouă echipă care nu se află sub domnul profesorului Ferguson și care se angajează să obțină rezultate replicabile cu codul publicat din prima zi.

La nivel personal, aș merge mai departe și aș sugera ca toată epidemiologia academică să fie defundată. Acest tip de muncă este cel mai bine realizat de sectorul asigurărilor. Asigurătorii angajează modelatori și oameni de știință de date, dar angajează și manageri a căror sarcină este să decidă dacă un model este suficient de precis pentru utilizarea în lumea reală și ingineri de software profesioniști pentru a se asigura că modelul software este testat, ușor de înțeles și așa mai departe. Eforturile academice nu le au pe acești oameni, iar rezultatele vorbesc de la sine.

Identitatea mea. Sue Denim nu este o persoană reală (citiți-o). Am ales să rămân anonim parțial din cauza luptelor intense care înconjoară blocarea, dar există și un motiv mai profund. Această situație s-a produs din cauza credențialismului rampant și m-am săturat de asta. Așa cum demonstrează disperarea larg răspândită de către programatori, dacă cineva din SAGE sau din Guvern ar fi arătat codul unui inginer de software funcțional pe care l-ar fi cunoscut, s-ar fi sunat imediat alarmele. În schimb, Guvernul este dominat de academicieni care se pare că nu au putut pune la îndoială nimic din ceea ce a făcut un coleg profesor. Între timp, cetățenilor obișnuiți ca mine li se spune că nu ar trebui niciodată să punem la îndoială „expertiza”. Deși mi-am dovedit angajarea pe Google pentru Toby, această mentalitate este dăunătoare și trebuie să se încheie: vă rog, evaluați afirmațiile pe care le-am făcut pentru dvs. sau cereți unui programator pe care îl cunoașteți și de încredere să le evalueze pentru dvs.