{"id":37358,"date":"2026-07-15T13:58:11","date_gmt":"2026-07-15T11:58:11","guid":{"rendered":"https:\/\/keplervision.eu\/dyplaering\/"},"modified":"2026-07-15T13:58:11","modified_gmt":"2026-07-15T11:58:11","slug":"dyplaering","status":"publish","type":"page","link":"https:\/\/keplervision.eu\/no\/dyplaering\/","title":{"rendered":"Hvitbok om dyp l\u00e6ring"},"content":{"rendered":"<!--themify_builder_content-->\n<div id=\"themify_builder_content-37358\" data-postid=\"37358\" class=\"themify_builder_content themify_builder_content-37358 themify_builder tf_clear\">\n                    <div  data-lazy=\"1\" class=\"module_row themify_builder_row tb_ioth476 tb_first tf_w\">\n                        <div class=\"row_inner col_align_top tb_col_count_1 tf_box tf_rel\">\n                        <div  data-lazy=\"1\" class=\"module_column tb-column col-full tb_84m6478 first\">\n                    <!-- module text -->\n<div  class=\"module module-text tb_vh3f478   \" data-lazy=\"1\">\n        <div  class=\"tb_text_wrap\">\n        <h1>Hvitbok om beste praksis for programvareutvikling innen dyp l\u00e6ring<\/h1>\n<p>Vi gratulerer Per John, medlem av Kepler-teamet v\u00e5rt, med at artikkelen hans om \u00abBest Practices for Software Development in a Deep Learning Environment\u00bb er blitt publisert p\u00e5 Towards Data Science. Towards Data Science er en plattform der tusenvis av mennesker kan utveksle ideer og utvide forst\u00e5elsen av datavitenskap. <\/p>\n<p>For enkelhets skyld f\u00f8lger det nedenfor en kopi av publikasjonen:<\/p>\n<h3>Programvareutvikling: beste praksis i et milj\u00f8 for dyp l\u00e6ring<\/h3>\n<p>Deep learning-systemer brukes n\u00e5 i stor utstrekning i mange milj\u00f8er. De skiller seg fra tradisjonelle programvaresystemer n\u00e5r det gjelder m\u00e5ten utdata genereres p\u00e5: beslutningene som tas for \u00e5 produsere resultater, l\u00e6res fra treningsdata, i stedet for \u00e5 v\u00e6re h\u00e5ndkodet, slik tilfellet er med tradisjonelle programvaresystemer. <\/p>\n<p>Dette har f\u00f8rt til at folk feilaktig tror at programvareutvikling ikke er like n\u00f8dvendig for maskinl\u00e6ringssystemer, siden algoritmene \u2013 som utgj\u00f8r kjernen i ethvert omfattende system \u2013 l\u00e6res av systemet selv. Videre utvikler den nyeste teknologien innen maskinl\u00e6ring (ML) seg s\u00e5 raskt at dataforskere hovedsakelig fokuserer p\u00e5 kortsiktige m\u00e5l som modellpresisjon. Siden verdenen innen dyp l\u00e6ring vil ha forandret seg i l\u00f8pet av f\u00e5 m\u00e5neder, hvorfor kaste bort tid p\u00e5 \u00e5 utvikle systemet ditt ordentlig i dag? For tiden er situasjonen innen dyp l\u00e6ringsutvikling slik at man eksperimenterer med et system inntil et bestemt presisjonsm\u00e5l er oppn\u00e5dd, for deretter \u00e5 sette det i produksjon.   <\/p>\n<p>Selv om denne metoden for \u00e5 utvikle et maskinl\u00e6ringssystem skiller seg fra tradisjonelle systemer, er den skadelig av flere grunner:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Det er lett \u00e5 gj\u00f8re en feil, noe som kan f\u00f8re til feilaktig presisjon. For eksempel p\u00e5 grunn av en feil ved innlasting eller transformering av data, eller feil h\u00e5ndtering av trenings-, test- og valideringssett. <\/li>\n<li>Det er tidkrevende \u00e5 gjenskape treningsresultater, siden dataene og konfigurasjonen som brukes ofte ikke er dokumentert og ikke versjonert.<\/li>\n<li>Det er vanskelig \u00e5 kj\u00f8re ML-modellen i et produksjonsmilj\u00f8, siden systemet kun er testet i et d\u00e5rlig dokumentert utviklingsmilj\u00f8.<\/li>\n<li>Det er ogs\u00e5 vanskelig \u00e5 tilpasse ML-systemet til endrede krav, siden vedlikeholdbarheten av kodebasen ikke var et fokusomr\u00e5de, og systemet mangler automatiserte tester.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Gitt disse utfordringene, hvordan utvikler man dyp l\u00e6ringssystemer samtidig som man unng\u00e5r de skadelige effektene av engangskoding og eksperimentering? I denne artikkelen deler vi de beste praksisene som er utviklet og tatt i bruk hos <a href=\"https:\/\/keplervision.eu\/no\/\"><span style=\"text-decoration: underline\">Kepler Vision Technologies<\/span><\/a>. Disse metodene er solid forankret i moderne programvareutviklingspraksis og tar hensyn til de spesielle forholdene ved utvikling av maskinl\u00e6ringssystemer. S\u00e5 hva er det som er spesielt ved utvikling av dyp l\u00e6ringssystemer, sammenlignet med tradisjonelle systemer?   <\/p>\n<figure id=\"attachment_3335\" class=\"wp-caption alignleft\" style=\"width: 400px\" aria-describedby=\"caption-attachment-3335\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3335\" src=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6-300x201.jpeg\" alt=\"\" width=\"400\" height=\"268\" srcset=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6-300x201.jpeg 300w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6-768x514.jpeg 768w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6-1024x685.jpeg 1024w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6.jpeg 1200w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/>\n<figcaption id=\"caption-attachment-3335\" class=\"wp-caption-text\">Foto av Shane Rounce p\u00e5 Unsplash<\/figcaption>\n<\/figure>\n<h3>S\u00e6rtrekkene ved utvikling av dyp l\u00e6ring<\/h3>\n<p>I dette avsnittet redegj\u00f8r vi for de aspektene ved deep learning-utvikling som utgj\u00f8r store hindringer for \u00e5 ta i bruk beste praksis fra tradisjonell programvareutvikling. I det p\u00e5f\u00f8lgende avsnittet presenterer vi tiltakene vi har iverksatt for \u00e5 gj\u00f8re v\u00e5r utviklingsprosess for deep learning mer robust og effektiv, og dermed overvinne (en del av) hindringene som er nevnt her. <\/p>\n<p><strong>1. Raskt utviklende rammeverk for dyp l\u00e6ring<\/strong><br \/> Ved begynnelsen av den dype l\u00e6ringsrevolusjonen ble modeller bygget basert p\u00e5 lavniv\u00e5biblioteker. En tid senere begynte spesialiserte biblioteker \u00e5 dukke opp for \u00e5 hjelpe ML-ingeni\u00f8rer, s\u00e6rlig med lanseringen av Caffe-biblioteket, grunnlagt i 2013. Tre \u00e5r senere hadde en mengde andre dype l\u00e6ringsbiblioteker dukket opp. Blar vi frem til i dag, fortsetter antallet forskjellige biblioteker \u00e5 \u00f8ke, selv om en gruppe ledende frontl\u00f8pere har dannet seg. Foruten f\u00f8dselen av nye individuelle biblioteker, m\u00e5 hvert bibliotek i seg selv stadig gjennomg\u00e5 rask utvikling ettersom de pr\u00f8ver \u00e5 holde tritt med ny utvikling innen forskning p\u00e5 nevrale nettverk.    <\/p>\n<p><strong>2. Datah\u00e5ndtering<\/strong><br \/>Et viktig kjennetegn ved dyp l\u00e6ringssystemer er at mengden inndata er mye st\u00f8rre, og at st\u00f8rrelsen p\u00e5 hvert enkelt dataelement ogs\u00e5 er st\u00f8rre, sammenlignet med tradisjonelle programvaresystemer. Dette gjelder s\u00e6rlig i treningsfasen, hvor datamengden som brukes ofte er sv\u00e6rt omfattende. Selv om det ogs\u00e5 er sant at datalagre som administreres av tradisjonelle programvaresystemer kan bli enorme i st\u00f8rrelse, kan disse systemene likevel kj\u00f8res og testes ved \u00e5 bruke bare en br\u00f8kdel av de tilgjengelige dataene. Trening av et dyp l\u00e6ringssystem kan derimot aldri lykkes uten at enorme datamengder tas i bruk.   <\/p>\n<p><strong>3. Konfigurasjonsh\u00e5ndtering<\/strong><br \/> \u00c5 h\u00e5ndtere konfigurasjonsdata er en intrikat kunst innen programvareutvikling, og beste praksis er at konfigurasjonsdata versjoneres p\u00e5 en slik m\u00e5te at det er tydelig hvilke konfigurasjonsdata som tilh\u00f8rer hvilken versjon av kildekoden. Denne beste praksisen gjelder ogs\u00e5 for maskinl\u00e6ringssystemer, men er fortsatt vanskelig \u00e5 implementere, ettersom st\u00f8rrelsen p\u00e5 konfigurasjonsdataene er s\u00e5 stor sammenlignet med tradisjonelle systemer. Tross alt er vekten av et trent nevralt nettverk konfigurasjonsdata og kan lett m\u00e5le seg opp til totalt 1 GB.  <\/p>\n<p>De s\u00e5kalte hyperparametrene som brukes ved trening av en dyp l\u00e6ringsmodell, er ogs\u00e5 konfigurasjonsdata og m\u00e5 h\u00e5ndteres som s\u00e5dan. Det viser seg at disse hyperparametrene ofte er spredt rundt i koden, og at de er innstilt p\u00e5 en slik m\u00e5te at presisjonsm\u00e5let kan oppn\u00e5s. <\/p>\n<p><strong>4. Testing av dyp l\u00e6ringssystemer<\/strong><br \/>Testautomatisering er i dag utbredt i programvareutvikling. Innen dyp l\u00e6ring er testautomatisering imidlertid ikke i n\u00e6rheten av \u00e5 v\u00e6re like utbredt. Det er to \u00e5rsaker til dette: For det f\u00f8rste har utviklere innen dyp l\u00e6ring ikke tilstrekkelig oppl\u00e6ring i moderne programvareutviklingspraksis, og for det andre krever utviklingen av en dyp l\u00e6ringsmodell mye eksperimentering.  <\/p>\n<p>I tillegg er oppl\u00e6ring av et dyp l\u00e6ringssystem en ikke-deterministisk prosess. Dette gj\u00f8r automatisert testing av oppl\u00e6ringsprosessen vanskeligere, siden enkle sjekker av oppl\u00e6ringsresultatene ikke vil v\u00e6re tilstrekkelig. Tar man hensyn til de lange oppl\u00e6ringstidene, er det lett \u00e5 forst\u00e5 hvorfor de fleste ingeni\u00f8rer innen dyp l\u00e6ring velger \u00e5 ikke bruke automatisert testing.  <\/p>\n<p>Automatisert testing av inferens er enklere. N\u00e5r en modell f\u00f8rst er trent, gjenst\u00e5r det bare sm\u00e5 mengder ikke-determinisme p\u00e5 grunn av avrundingsfeil. <\/p>\n<p><strong>5. Implementering av dyp l\u00e6ringssystemer<\/strong><br \/>To sentrale trekk skiller implementering av dyp l\u00e6ringssystemer fra tradisjonelle systemer: For det f\u00f8rste trenger de fleste dyp l\u00e6ringssystemer spesiell maskinvare, en GPU, for \u00e5 kj\u00f8re med tilstrekkelig gjennomstr\u00f8mning. For det andre krever dyp l\u00e6ringssystemer en stor konfigurasjonsfil, vektfilen, for \u00e5 kunne foreta prediksjoner. Dette gj\u00f8r det vanskeligere \u00e5 oppn\u00e5 \u00abdev\/prod-paritet\u00bb, det vil si et likt milj\u00f8 for utvikling og testing. Videre er det uklokt \u00e5 pakke vektfilen sammen med kildekoden i \u00e9n distribusjonspakke p\u00e5 grunn av st\u00f8rrelsen. Dette medf\u00f8rer at du m\u00e5 distribuere vektfiler og systemet ved hjelp av separate artefakter, samtidig som du holder dem synkronisert.    <\/p>\n<h3>V\u00e5r tiln\u00e6rming til utvikling av dyp l\u00e6ringssystemer<\/h3>\n<p>V\u00e5r tiln\u00e6rming bygger p\u00e5 det grunnleggende prinsippet om at oppl\u00e6ring og drift av et dyp l\u00e6ringssystem b\u00f8r automatiseres i st\u00f8rst mulig grad. Det b\u00f8r ikke v\u00e6re avhengig av at en enkelt person m\u00e5 trene og evaluere modellen etter flere ukers eksperimentering. <\/p>\n<p><strong>Bruk av kontinuerlig integrasjon til \u00e5 bygge Docker-bilder<\/strong><br \/>Vi bruker Docker til \u00e5 definere utviklings- og kj\u00f8remilj\u00f8et for v\u00e5re dyp l\u00e6ringssystemer. N\u00e5r vi legger ut endringer i versjonskontrollsystemet v\u00e5rt \u2013 i v\u00e5rt tilfelle GitHub \u2013 trer Travis i kraft og kj\u00f8rer tester, og hvis disse er vellykkede, vil det deretter bygge de nyeste Docker-bildene og legge dem ut i Docker-repositoriet. Docker-bildene vil ikke inneholde modellen, da dette ville gjort dem for store til \u00e5 kunne distribueres enkelt.  <\/p>\n<p>Ved \u00e5 bruke Docker sikres kj\u00f8ringsmilj\u00f8et sammen med koden, og det er mulig \u00e5 distribuere og kj\u00f8re systemet p\u00e5 en p\u00e5litelig m\u00e5te i ethvert milj\u00f8 som st\u00f8tter Docker, uavhengig av hvilket deep learning-rammeverk som brukes.<\/p>\n<figure id=\"attachment_3336\" class=\"wp-caption alignleft\" style=\"width: 400px\" aria-describedby=\"caption-attachment-3336\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3336\" src=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv-300x200.jpeg\" alt=\"\" width=\"400\" height=\"266\" srcset=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv-300x200.jpeg 300w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv-768x511.jpeg 768w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv-1024x682.jpeg 1024w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv.jpeg 1200w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/>\n<figcaption id=\"caption-attachment-3336\" class=\"wp-caption-text\">Foto av elCarito p\u00e5 Unsplash<\/figcaption>\n<\/figure>\n<p><strong>\u00c5 prioritere skyen<\/strong><br \/>Vi streber etter at modellene v\u00e5re skal trenes og evalueres p\u00e5 en instans i skyen (vi bruker Amazon AWS), siden dette skiller plattformdetaljene fra driften av systemet v\u00e5rt. Docker-bilde-tiln\u00e6rmingen beskrevet ovenfor, sammen med Amazon AWS, passer perfekt sammen for \u00e5 oppn\u00e5 denne abstraksjonen. <\/p>\n<p><strong>Lagring av data p\u00e5 et sentralt sted<\/strong><br \/>Datah\u00e5ndtering er en integrert del av deep learning-systemer. Vi lagrer data og annotasjoner i et sentralt arkiv (AWS S3-b\u00f8tter) og bruker skript for \u00e5 synkronisere data lokalt, slik at v\u00e5re applikasjoner, jobber og utviklere har tilgang til de nyeste dataene. Jobber kj\u00f8rer alltid med rene kopier av data, og vi anser tiden det tar \u00e5 laste ned dataene som vel anvendt; dette gir oss sikkerhet for at de riktige trenings- og testdataene blir brukt.  <\/p>\n<p><strong>Lagring av vektfiler p\u00e5 et sentralt sted<\/strong><br \/> Vi lagrer vektfiler p\u00e5 et sentralt sted og henter dem inn om n\u00f8dvendig for \u00e5 starte en inferenseringsserver eller en evalueringsjobb. Vektfilene oppdateres n\u00e5r en treningsjobb har produsert en forbedret versjon av modellen. Sentral lagring av vektfiler sikrer at jobber og utviklere har enkel tilgang til den nyeste modellen.  <\/p>\n<p><strong>Feil i konfigurasjonen av hyperparametere p\u00e5 et sentralt sted<\/strong><br \/>Vi lagrer (endringer i) hyperparametere som brukes til trening og evaluering i en konfigurasjonsfil. Dette hindrer at disse parametrene blir spredt utover kildekoden. Vi bruker et sentralt sted til \u00e5 lagre disse konfigurasjonsfilene, slik at de er tilgjengelige for jobber og utviklere.  <\/p>\n<figure id=\"attachment_3337\" class=\"wp-caption alignleft\" style=\"width: 400px\" aria-describedby=\"caption-attachment-3337\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3337\" src=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg-300x192.png\" alt=\"\" width=\"400\" height=\"256\" srcset=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg-300x192.png 300w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg-768x492.png 768w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg-1024x656.png 1024w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg.png 1194w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/>\n<figcaption id=\"caption-attachment-3337\" class=\"wp-caption-text\">Jenkins-oppl\u00e6ringsoppgave<\/figcaption>\n<\/figure>\n<p><strong>Konsolidering av trening og evaluering i jobber<\/strong><br \/>Vi konsoliderer trening og evaluering i jobber ved hjelp av <a href=\"https:\/\/jenkins.io\/\" target=\"_blank\" rel=\"noopener\">automatiseringsserveren Jenkins.<\/a> Jobbene henter inn de nyeste Docker-bildene, samt dataene og annotasjonene, og kj\u00f8rer oppl\u00e6ring eller evaluering inne i en Docker-container. Docker-containeren har tilknyttede volumer som peker til dataene, annotasjonene og modellfilen i tilfelle evaluering. <\/p>\n<p>N\u00e5r en trenings\u00f8kt er fullf\u00f8rt, vil det bli generert en vektfil som kan lagres, forutsatt at den oppfyller modellens KPI-er.<\/p>\n<p>Denne oppgaven vil samle all n\u00f8dvendig kunnskap og data i skript, slik at hvem som helst vil kunne trene eller evaluere en modell p\u00e5 en p\u00e5litelig m\u00e5te, uten \u00e5 m\u00e5tte forst\u00e5 modellens finesser.<\/p>\n<p>Vi arkiverer imidlertid annotasjonsfilene, konfigurasjonsfilene og de genererte vektfilene, slik at resultatene fra en jobb kan reproduseres.<\/p>\n<p><strong>Bruk av PyCharms funksjoner for ekstern utvikling<\/strong><br \/>Det er mer produktivt n\u00e5r utviklere kan bruke et integrert utviklingsmilj\u00f8 (IDE). Noen ganger kan det v\u00e6re n\u00f8dvendig for utviklere \u00e5 teste og feils\u00f8ke kildekoden og modellen p\u00e5 en GPU, som ofte ikke er tilgjengelig direkte p\u00e5 utviklingsmaskinen deres. En m\u00e5te \u00e5 kombinere bruk av et IDE med \u00e5 kj\u00f8re koden p\u00e5 en GPU er \u00e5 starte en Docker-container p\u00e5 en maskin med en GPU og deretter bruke PyCharms funksjoner for \u00e5 kj\u00f8re en ekstern tolk. En ekstern tolk reduserer rundturstiden betydelig sammenlignet med \u00e5 laste opp kildekoden til en ekstern server og legge til loggingsuttrykk for feils\u00f8king.   <\/p>\n<p><strong>Bruk av testautomatiserings<\/strong><br \/>Som forklart ovenfor er det vanskeligere \u00e5 skrive effektive og effektive automatiserte tester for dyp l\u00e6ringssystemer enn for tradisjonelle programvaresystemer. Vi skriver riktignok automatiserte tester for dyp l\u00e6ringssystemer ved hjelp av pytest-rammeverket, men ikke i like stor utstrekning som vi ville gjort for tradisjonelle programvaresystemer. <\/p>\n<p>Vi fokuserer p\u00e5 \u00e5 teste datainput og viktige algoritmer. Vi skriver ogs\u00e5 tester for trening og evaluering, men bare i den grad at koden skal kj\u00f8re problemfritt. Vi sjekker ikke om en fullstendig treningsrunde gir de riktige resultatene, da dette ville v\u00e6re for tidkrevende. I stedet skriver vi en automatisert test som kj\u00f8rer \u00e9n eller to epoker p\u00e5 et sv\u00e6rt lite datasett, og deretter sjekker vi at utdatametrikker genereres, men vi verifiserer ikke verdiene deres.   <\/p>\n<p>Resultatet av v\u00e5rt arbeid med testautomatisering er at kodebasen v\u00e5r er lettere \u00e5 forst\u00e5, og at det krever mindre innsats \u00e5 gjennomf\u00f8re endringer.<\/p>\n<p><strong>M\u00e5ling av vedlikeholdbarhetsmetrikker<\/strong><br \/>Et programvaresystem m\u00e5 vedlikeholdes for \u00e5 kunne tilpasses endrede krav og milj\u00f8er, og et dyp l\u00e6ringssystem er intet unntak. Jo mer vedlikeholdbart et system er, desto enklere blir det \u00e5 endre og utvide det. Vi bruker bettercodehub.com til \u00e5 sjekke 10 retningslinjer for programvareutvikling og til \u00e5 varsle oss n\u00e5r et system avviker fra retningslinjene. Vi foretrekker dette verkt\u00f8yet fremfor verkt\u00f8y for kodesbrudd, siden det lar oss fokusere p\u00e5 de viktige retningslinjene for vedlikeholdbarhet, i stedet for \u00e5 m\u00e5tte h\u00e5ndtere enorme mengder brudd som et verkt\u00f8y som PyLint vil rapportere.   <\/p>\n<p><strong>Konklusjon<\/strong><br \/>. Dyp l\u00e6ring er et relativt nytt tilskudd til organisasjonenes IT-verkt\u00f8ykasse. Det har delvis sine r\u00f8tter i tradisjonell programvareutvikling og delvis i datavitenskap. Med tanke p\u00e5 at dyp l\u00e6ring fortsatt er i sin spede begynnelse, er det ikke overraskende at det enn\u00e5 ikke er etablert standardiserte utviklingspraksiser. Utviklingen av dyp l\u00e6ringsprogramvare er imidlertid en integrert del av programvareutviklingen, og vi m\u00e5 hente inspirasjon fra prinsippene for moderne programvareutvikling som utgangspunkt for \u00e5 forbedre programvareutviklingen innen dyp l\u00e6ring.   <\/p>\n<p>De ovennevnte metodene har gjort utviklingsprosessen v\u00e5r for dyp l\u00e6ringsmodeller mer robust og repeterbar, og har skapt et felles grunnlag for samarbeid mellom fagfolk innen dyp l\u00e6ring og programvareingeni\u00f8rer. Prosessen er ikke perfekt, slik ingen prosess er, og vi s\u00f8ker kontinuerlig etter m\u00e5ter \u00e5 forbedre v\u00e5re n\u00e5v\u00e6rende arbeidsmetoder p\u00e5. <\/p>\n<p>Takk til Rob van der Leek.<\/p>    <\/div>\n<\/div>\n<!-- \/module text -->        <\/div>\n                        <\/div>\n        <\/div>\n        <\/div>\n<!--\/themify_builder_content-->","protected":false},"excerpt":{"rendered":"<p>Hvitbok om beste praksis for programvareutvikling innen dyp l\u00e6ring Vi gratulerer Per John, medlem av Kepler-teamet v\u00e5rt, med at artikkelen hans om \u00abBest Practices for Software Development in a Deep Learning Environment\u00bb er blitt publisert p\u00e5 Towards Data Science. Towards Data Science er en plattform der tusenvis av mennesker kan utveksle ideer og utvide forst\u00e5elsen [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":37356,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-37358","page","type-page","status-publish","has-post-thumbnail","hentry","has-post-title","has-post-date","has-post-category","has-post-tag","has-post-comment","has-post-author",""],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Hvitbok om dyp l\u00e6ring | Kepler Vision Technologies<\/title>\n<meta name=\"description\" content=\"Kepler Vision Technologies utvikler programvare basert p\u00e5 dyp l\u00e6ring eller maskinl\u00e6ring. Her finner du de beste praksisene innen programvareutvikling!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/keplervision.eu\/no\/dyplaering\/\" \/>\n<meta property=\"og:locale\" content=\"nb_NO\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hvitbok om dyp l\u00e6ring | Kepler Vision Technologies\" \/>\n<meta property=\"og:description\" content=\"Kepler Vision Technologies utvikler programvare basert p\u00e5 dyp l\u00e6ring eller maskinl\u00e6ring. Her finner du de beste praksisene innen programvareutvikling!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/keplervision.eu\/no\/dyplaering\/\" \/>\n<meta property=\"og:site_name\" content=\"Kepler Vision Technologies\" \/>\n<meta property=\"og:image\" content=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"799\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Ansl. lesetid\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/dyplaering\\\/\",\"url\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/dyplaering\\\/\",\"name\":\"Hvitbok om dyp l\u00e6ring | Kepler Vision Technologies\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/dyplaering\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/dyplaering\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/keplervision.eu\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/0_cj2-qxaGC368JOxv.jpeg\",\"datePublished\":\"2026-07-15T11:58:11+00:00\",\"description\":\"Kepler Vision Technologies utvikler programvare basert p\u00e5 dyp l\u00e6ring eller maskinl\u00e6ring. Her finner du de beste praksisene innen programvareutvikling!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/dyplaering\\\/#breadcrumb\"},\"inLanguage\":\"nb-NO\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/keplervision.eu\\\/no\\\/dyplaering\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nb-NO\",\"@id\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/dyplaering\\\/#primaryimage\",\"url\":\"https:\\\/\\\/keplervision.eu\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/0_cj2-qxaGC368JOxv.jpeg\",\"contentUrl\":\"https:\\\/\\\/keplervision.eu\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/0_cj2-qxaGC368JOxv.jpeg\",\"width\":1200,\"height\":799,\"caption\":\"The Cloud\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/dyplaering\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hvitbok om dyp l\u00e6ring\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/#website\",\"url\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/\",\"name\":\"Kepler Vision Technologies\",\"description\":\"TRUSTED, PROVEN TECHNOLOGIES SECURING CARE AVAILABILITY\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/keplervision.eu\\\/no\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nb-NO\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Hvitbok om dyp l\u00e6ring | Kepler Vision Technologies","description":"Kepler Vision Technologies utvikler programvare basert p\u00e5 dyp l\u00e6ring eller maskinl\u00e6ring. Her finner du de beste praksisene innen programvareutvikling!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/keplervision.eu\/no\/dyplaering\/","og_locale":"nb_NO","og_type":"article","og_title":"Hvitbok om dyp l\u00e6ring | Kepler Vision Technologies","og_description":"Kepler Vision Technologies utvikler programvare basert p\u00e5 dyp l\u00e6ring eller maskinl\u00e6ring. Her finner du de beste praksisene innen programvareutvikling!","og_url":"https:\/\/keplervision.eu\/no\/dyplaering\/","og_site_name":"Kepler Vision Technologies","og_image":[{"width":1200,"height":799,"url":"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv.jpeg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Ansl. lesetid":"11 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/keplervision.eu\/no\/dyplaering\/","url":"https:\/\/keplervision.eu\/no\/dyplaering\/","name":"Hvitbok om dyp l\u00e6ring | Kepler Vision Technologies","isPartOf":{"@id":"https:\/\/keplervision.eu\/no\/#website"},"primaryImageOfPage":{"@id":"https:\/\/keplervision.eu\/no\/dyplaering\/#primaryimage"},"image":{"@id":"https:\/\/keplervision.eu\/no\/dyplaering\/#primaryimage"},"thumbnailUrl":"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv.jpeg","datePublished":"2026-07-15T11:58:11+00:00","description":"Kepler Vision Technologies utvikler programvare basert p\u00e5 dyp l\u00e6ring eller maskinl\u00e6ring. Her finner du de beste praksisene innen programvareutvikling!","breadcrumb":{"@id":"https:\/\/keplervision.eu\/no\/dyplaering\/#breadcrumb"},"inLanguage":"nb-NO","potentialAction":[{"@type":"ReadAction","target":["https:\/\/keplervision.eu\/no\/dyplaering\/"]}]},{"@type":"ImageObject","inLanguage":"nb-NO","@id":"https:\/\/keplervision.eu\/no\/dyplaering\/#primaryimage","url":"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv.jpeg","contentUrl":"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv.jpeg","width":1200,"height":799,"caption":"The Cloud"},{"@type":"BreadcrumbList","@id":"https:\/\/keplervision.eu\/no\/dyplaering\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/keplervision.eu\/no\/"},{"@type":"ListItem","position":2,"name":"Hvitbok om dyp l\u00e6ring"}]},{"@type":"WebSite","@id":"https:\/\/keplervision.eu\/no\/#website","url":"https:\/\/keplervision.eu\/no\/","name":"Kepler Vision Technologies","description":"TRUSTED, PROVEN TECHNOLOGIES SECURING CARE AVAILABILITY","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/keplervision.eu\/no\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nb-NO"}]}},"builder_content":"<h1>Hvitbok om beste praksis for programvareutvikling innen dyp l\u00e6ring<\/h1> <p>Vi gratulerer Per John, medlem av Kepler-teamet v\u00e5rt, med at artikkelen hans om \u00abBest Practices for Software Development in a Deep Learning Environment\u00bb er blitt publisert p\u00e5 Towards Data Science. Towards Data Science er en plattform der tusenvis av mennesker kan utveksle ideer og utvide forst\u00e5elsen av datavitenskap. <\/p> <p>For enkelhets skyld f\u00f8lger det nedenfor en kopi av publikasjonen:<\/p> <h3>Programvareutvikling: beste praksis i et milj\u00f8 for dyp l\u00e6ring<\/h3> <p>Deep learning-systemer brukes n\u00e5 i stor utstrekning i mange milj\u00f8er. De skiller seg fra tradisjonelle programvaresystemer n\u00e5r det gjelder m\u00e5ten utdata genereres p\u00e5: beslutningene som tas for \u00e5 produsere resultater, l\u00e6res fra treningsdata, i stedet for \u00e5 v\u00e6re h\u00e5ndkodet, slik tilfellet er med tradisjonelle programvaresystemer. <\/p> <p>Dette har f\u00f8rt til at folk feilaktig tror at programvareutvikling ikke er like n\u00f8dvendig for maskinl\u00e6ringssystemer, siden algoritmene \u2013 som utgj\u00f8r kjernen i ethvert omfattende system \u2013 l\u00e6res av systemet selv. Videre utvikler den nyeste teknologien innen maskinl\u00e6ring (ML) seg s\u00e5 raskt at dataforskere hovedsakelig fokuserer p\u00e5 kortsiktige m\u00e5l som modellpresisjon. Siden verdenen innen dyp l\u00e6ring vil ha forandret seg i l\u00f8pet av f\u00e5 m\u00e5neder, hvorfor kaste bort tid p\u00e5 \u00e5 utvikle systemet ditt ordentlig i dag? For tiden er situasjonen innen dyp l\u00e6ringsutvikling slik at man eksperimenterer med et system inntil et bestemt presisjonsm\u00e5l er oppn\u00e5dd, for deretter \u00e5 sette det i produksjon. <\/p> <p>Selv om denne metoden for \u00e5 utvikle et maskinl\u00e6ringssystem skiller seg fra tradisjonelle systemer, er den skadelig av flere grunner:<\/p> <ul> <li style=\"list-style-type: none\"> <ul> <li>Det er lett \u00e5 gj\u00f8re en feil, noe som kan f\u00f8re til feilaktig presisjon. For eksempel p\u00e5 grunn av en feil ved innlasting eller transformering av data, eller feil h\u00e5ndtering av trenings-, test- og valideringssett. <\/li> <li>Det er tidkrevende \u00e5 gjenskape treningsresultater, siden dataene og konfigurasjonen som brukes ofte ikke er dokumentert og ikke versjonert.<\/li> <li>Det er vanskelig \u00e5 kj\u00f8re ML-modellen i et produksjonsmilj\u00f8, siden systemet kun er testet i et d\u00e5rlig dokumentert utviklingsmilj\u00f8.<\/li> <li>Det er ogs\u00e5 vanskelig \u00e5 tilpasse ML-systemet til endrede krav, siden vedlikeholdbarheten av kodebasen ikke var et fokusomr\u00e5de, og systemet mangler automatiserte tester.<\/li> <\/ul> <\/li> <\/ul> <p>Gitt disse utfordringene, hvordan utvikler man dyp l\u00e6ringssystemer samtidig som man unng\u00e5r de skadelige effektene av engangskoding og eksperimentering? I denne artikkelen deler vi de beste praksisene som er utviklet og tatt i bruk hos <a href=\"https:\/\/keplervision.eu\/no\/\">Kepler Vision Technologies<\/a>. Disse metodene er solid forankret i moderne programvareutviklingspraksis og tar hensyn til de spesielle forholdene ved utvikling av maskinl\u00e6ringssystemer. S\u00e5 hva er det som er spesielt ved utvikling av dyp l\u00e6ringssystemer, sammenlignet med tradisjonelle systemer? <\/p> <figure id=\"attachment_3335\" style=\"width: 400px\" aria-describedby=\"caption-attachment-3335\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6-300x201.jpeg\" alt=\"\" width=\"400\" height=\"268\" srcset=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6-300x201.jpeg 300w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6-768x514.jpeg 768w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6-1024x685.jpeg 1024w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_wuN6nJiONvPVk4E6.jpeg 1200w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/> <figcaption id=\"caption-attachment-3335\">Foto av Shane Rounce p\u00e5 Unsplash<\/figcaption> <\/figure> <h3>S\u00e6rtrekkene ved utvikling av dyp l\u00e6ring<\/h3> <p>I dette avsnittet redegj\u00f8r vi for de aspektene ved deep learning-utvikling som utgj\u00f8r store hindringer for \u00e5 ta i bruk beste praksis fra tradisjonell programvareutvikling. I det p\u00e5f\u00f8lgende avsnittet presenterer vi tiltakene vi har iverksatt for \u00e5 gj\u00f8re v\u00e5r utviklingsprosess for deep learning mer robust og effektiv, og dermed overvinne (en del av) hindringene som er nevnt her. <\/p> <p><strong>1. Raskt utviklende rammeverk for dyp l\u00e6ring<\/strong><br \/> Ved begynnelsen av den dype l\u00e6ringsrevolusjonen ble modeller bygget basert p\u00e5 lavniv\u00e5biblioteker. En tid senere begynte spesialiserte biblioteker \u00e5 dukke opp for \u00e5 hjelpe ML-ingeni\u00f8rer, s\u00e6rlig med lanseringen av Caffe-biblioteket, grunnlagt i 2013. Tre \u00e5r senere hadde en mengde andre dype l\u00e6ringsbiblioteker dukket opp. Blar vi frem til i dag, fortsetter antallet forskjellige biblioteker \u00e5 \u00f8ke, selv om en gruppe ledende frontl\u00f8pere har dannet seg. Foruten f\u00f8dselen av nye individuelle biblioteker, m\u00e5 hvert bibliotek i seg selv stadig gjennomg\u00e5 rask utvikling ettersom de pr\u00f8ver \u00e5 holde tritt med ny utvikling innen forskning p\u00e5 nevrale nettverk. <\/p> <p><strong>2. Datah\u00e5ndtering<\/strong><br \/>Et viktig kjennetegn ved dyp l\u00e6ringssystemer er at mengden inndata er mye st\u00f8rre, og at st\u00f8rrelsen p\u00e5 hvert enkelt dataelement ogs\u00e5 er st\u00f8rre, sammenlignet med tradisjonelle programvaresystemer. Dette gjelder s\u00e6rlig i treningsfasen, hvor datamengden som brukes ofte er sv\u00e6rt omfattende. Selv om det ogs\u00e5 er sant at datalagre som administreres av tradisjonelle programvaresystemer kan bli enorme i st\u00f8rrelse, kan disse systemene likevel kj\u00f8res og testes ved \u00e5 bruke bare en br\u00f8kdel av de tilgjengelige dataene. Trening av et dyp l\u00e6ringssystem kan derimot aldri lykkes uten at enorme datamengder tas i bruk. <\/p> <p><strong>3. Konfigurasjonsh\u00e5ndtering<\/strong><br \/> \u00c5 h\u00e5ndtere konfigurasjonsdata er en intrikat kunst innen programvareutvikling, og beste praksis er at konfigurasjonsdata versjoneres p\u00e5 en slik m\u00e5te at det er tydelig hvilke konfigurasjonsdata som tilh\u00f8rer hvilken versjon av kildekoden. Denne beste praksisen gjelder ogs\u00e5 for maskinl\u00e6ringssystemer, men er fortsatt vanskelig \u00e5 implementere, ettersom st\u00f8rrelsen p\u00e5 konfigurasjonsdataene er s\u00e5 stor sammenlignet med tradisjonelle systemer. Tross alt er vekten av et trent nevralt nettverk konfigurasjonsdata og kan lett m\u00e5le seg opp til totalt 1 GB. <\/p> <p>De s\u00e5kalte hyperparametrene som brukes ved trening av en dyp l\u00e6ringsmodell, er ogs\u00e5 konfigurasjonsdata og m\u00e5 h\u00e5ndteres som s\u00e5dan. Det viser seg at disse hyperparametrene ofte er spredt rundt i koden, og at de er innstilt p\u00e5 en slik m\u00e5te at presisjonsm\u00e5let kan oppn\u00e5s. <\/p> <p><strong>4. Testing av dyp l\u00e6ringssystemer<\/strong><br \/>Testautomatisering er i dag utbredt i programvareutvikling. Innen dyp l\u00e6ring er testautomatisering imidlertid ikke i n\u00e6rheten av \u00e5 v\u00e6re like utbredt. Det er to \u00e5rsaker til dette: For det f\u00f8rste har utviklere innen dyp l\u00e6ring ikke tilstrekkelig oppl\u00e6ring i moderne programvareutviklingspraksis, og for det andre krever utviklingen av en dyp l\u00e6ringsmodell mye eksperimentering. <\/p> <p>I tillegg er oppl\u00e6ring av et dyp l\u00e6ringssystem en ikke-deterministisk prosess. Dette gj\u00f8r automatisert testing av oppl\u00e6ringsprosessen vanskeligere, siden enkle sjekker av oppl\u00e6ringsresultatene ikke vil v\u00e6re tilstrekkelig. Tar man hensyn til de lange oppl\u00e6ringstidene, er det lett \u00e5 forst\u00e5 hvorfor de fleste ingeni\u00f8rer innen dyp l\u00e6ring velger \u00e5 ikke bruke automatisert testing. <\/p> <p>Automatisert testing av inferens er enklere. N\u00e5r en modell f\u00f8rst er trent, gjenst\u00e5r det bare sm\u00e5 mengder ikke-determinisme p\u00e5 grunn av avrundingsfeil. <\/p> <p><strong>5. Implementering av dyp l\u00e6ringssystemer<\/strong><br \/>To sentrale trekk skiller implementering av dyp l\u00e6ringssystemer fra tradisjonelle systemer: For det f\u00f8rste trenger de fleste dyp l\u00e6ringssystemer spesiell maskinvare, en GPU, for \u00e5 kj\u00f8re med tilstrekkelig gjennomstr\u00f8mning. For det andre krever dyp l\u00e6ringssystemer en stor konfigurasjonsfil, vektfilen, for \u00e5 kunne foreta prediksjoner. Dette gj\u00f8r det vanskeligere \u00e5 oppn\u00e5 \u00abdev\/prod-paritet\u00bb, det vil si et likt milj\u00f8 for utvikling og testing. Videre er det uklokt \u00e5 pakke vektfilen sammen med kildekoden i \u00e9n distribusjonspakke p\u00e5 grunn av st\u00f8rrelsen. Dette medf\u00f8rer at du m\u00e5 distribuere vektfiler og systemet ved hjelp av separate artefakter, samtidig som du holder dem synkronisert. <\/p> <h3>V\u00e5r tiln\u00e6rming til utvikling av dyp l\u00e6ringssystemer<\/h3> <p>V\u00e5r tiln\u00e6rming bygger p\u00e5 det grunnleggende prinsippet om at oppl\u00e6ring og drift av et dyp l\u00e6ringssystem b\u00f8r automatiseres i st\u00f8rst mulig grad. Det b\u00f8r ikke v\u00e6re avhengig av at en enkelt person m\u00e5 trene og evaluere modellen etter flere ukers eksperimentering. <\/p> <p><strong>Bruk av kontinuerlig integrasjon til \u00e5 bygge Docker-bilder<\/strong><br \/>Vi bruker Docker til \u00e5 definere utviklings- og kj\u00f8remilj\u00f8et for v\u00e5re dyp l\u00e6ringssystemer. N\u00e5r vi legger ut endringer i versjonskontrollsystemet v\u00e5rt \u2013 i v\u00e5rt tilfelle GitHub \u2013 trer Travis i kraft og kj\u00f8rer tester, og hvis disse er vellykkede, vil det deretter bygge de nyeste Docker-bildene og legge dem ut i Docker-repositoriet. Docker-bildene vil ikke inneholde modellen, da dette ville gjort dem for store til \u00e5 kunne distribueres enkelt. <\/p> <p>Ved \u00e5 bruke Docker sikres kj\u00f8ringsmilj\u00f8et sammen med koden, og det er mulig \u00e5 distribuere og kj\u00f8re systemet p\u00e5 en p\u00e5litelig m\u00e5te i ethvert milj\u00f8 som st\u00f8tter Docker, uavhengig av hvilket deep learning-rammeverk som brukes.<\/p> <figure id=\"attachment_3336\" style=\"width: 400px\" aria-describedby=\"caption-attachment-3336\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv-300x200.jpeg\" alt=\"\" width=\"400\" height=\"266\" srcset=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv-300x200.jpeg 300w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv-768x511.jpeg 768w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv-1024x682.jpeg 1024w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/0_cj2-qxaGC368JOxv.jpeg 1200w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/> <figcaption id=\"caption-attachment-3336\">Foto av elCarito p\u00e5 Unsplash<\/figcaption> <\/figure> <p><strong>\u00c5 prioritere skyen<\/strong><br \/>Vi streber etter at modellene v\u00e5re skal trenes og evalueres p\u00e5 en instans i skyen (vi bruker Amazon AWS), siden dette skiller plattformdetaljene fra driften av systemet v\u00e5rt. Docker-bilde-tiln\u00e6rmingen beskrevet ovenfor, sammen med Amazon AWS, passer perfekt sammen for \u00e5 oppn\u00e5 denne abstraksjonen. <\/p> <p><strong>Lagring av data p\u00e5 et sentralt sted<\/strong><br \/>Datah\u00e5ndtering er en integrert del av deep learning-systemer. Vi lagrer data og annotasjoner i et sentralt arkiv (AWS S3-b\u00f8tter) og bruker skript for \u00e5 synkronisere data lokalt, slik at v\u00e5re applikasjoner, jobber og utviklere har tilgang til de nyeste dataene. Jobber kj\u00f8rer alltid med rene kopier av data, og vi anser tiden det tar \u00e5 laste ned dataene som vel anvendt; dette gir oss sikkerhet for at de riktige trenings- og testdataene blir brukt. <\/p> <p><strong>Lagring av vektfiler p\u00e5 et sentralt sted<\/strong><br \/> Vi lagrer vektfiler p\u00e5 et sentralt sted og henter dem inn om n\u00f8dvendig for \u00e5 starte en inferenseringsserver eller en evalueringsjobb. Vektfilene oppdateres n\u00e5r en treningsjobb har produsert en forbedret versjon av modellen. Sentral lagring av vektfiler sikrer at jobber og utviklere har enkel tilgang til den nyeste modellen. <\/p> <p><strong>Feil i konfigurasjonen av hyperparametere p\u00e5 et sentralt sted<\/strong><br \/>Vi lagrer (endringer i) hyperparametere som brukes til trening og evaluering i en konfigurasjonsfil. Dette hindrer at disse parametrene blir spredt utover kildekoden. Vi bruker et sentralt sted til \u00e5 lagre disse konfigurasjonsfilene, slik at de er tilgjengelige for jobber og utviklere. <\/p> <figure id=\"attachment_3337\" style=\"width: 400px\" aria-describedby=\"caption-attachment-3337\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg-300x192.png\" alt=\"\" width=\"400\" height=\"256\" srcset=\"https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg-300x192.png 300w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg-768x492.png 768w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg-1024x656.png 1024w, https:\/\/keplervision.eu\/wp-content\/uploads\/2019\/04\/1_zKsgmiQ66tpicgu-ppA5Tg.png 1194w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/> <figcaption id=\"caption-attachment-3337\">Jenkins-oppl\u00e6ringsoppgave<\/figcaption> <\/figure> <p><strong>Konsolidering av trening og evaluering i jobber<\/strong><br \/>Vi konsoliderer trening og evaluering i jobber ved hjelp av <a href=\"https:\/\/jenkins.io\/\" target=\"_blank\" rel=\"noopener\">automatiseringsserveren Jenkins.<\/a> Jobbene henter inn de nyeste Docker-bildene, samt dataene og annotasjonene, og kj\u00f8rer oppl\u00e6ring eller evaluering inne i en Docker-container. Docker-containeren har tilknyttede volumer som peker til dataene, annotasjonene og modellfilen i tilfelle evaluering. <\/p> <p>N\u00e5r en trenings\u00f8kt er fullf\u00f8rt, vil det bli generert en vektfil som kan lagres, forutsatt at den oppfyller modellens KPI-er.<\/p> <p>Denne oppgaven vil samle all n\u00f8dvendig kunnskap og data i skript, slik at hvem som helst vil kunne trene eller evaluere en modell p\u00e5 en p\u00e5litelig m\u00e5te, uten \u00e5 m\u00e5tte forst\u00e5 modellens finesser.<\/p> <p>Vi arkiverer imidlertid annotasjonsfilene, konfigurasjonsfilene og de genererte vektfilene, slik at resultatene fra en jobb kan reproduseres.<\/p> <p><strong>Bruk av PyCharms funksjoner for ekstern utvikling<\/strong><br \/>Det er mer produktivt n\u00e5r utviklere kan bruke et integrert utviklingsmilj\u00f8 (IDE). Noen ganger kan det v\u00e6re n\u00f8dvendig for utviklere \u00e5 teste og feils\u00f8ke kildekoden og modellen p\u00e5 en GPU, som ofte ikke er tilgjengelig direkte p\u00e5 utviklingsmaskinen deres. En m\u00e5te \u00e5 kombinere bruk av et IDE med \u00e5 kj\u00f8re koden p\u00e5 en GPU er \u00e5 starte en Docker-container p\u00e5 en maskin med en GPU og deretter bruke PyCharms funksjoner for \u00e5 kj\u00f8re en ekstern tolk. En ekstern tolk reduserer rundturstiden betydelig sammenlignet med \u00e5 laste opp kildekoden til en ekstern server og legge til loggingsuttrykk for feils\u00f8king. <\/p> <p><strong>Bruk av testautomatiserings<\/strong><br \/>Som forklart ovenfor er det vanskeligere \u00e5 skrive effektive og effektive automatiserte tester for dyp l\u00e6ringssystemer enn for tradisjonelle programvaresystemer. Vi skriver riktignok automatiserte tester for dyp l\u00e6ringssystemer ved hjelp av pytest-rammeverket, men ikke i like stor utstrekning som vi ville gjort for tradisjonelle programvaresystemer. <\/p> <p>Vi fokuserer p\u00e5 \u00e5 teste datainput og viktige algoritmer. Vi skriver ogs\u00e5 tester for trening og evaluering, men bare i den grad at koden skal kj\u00f8re problemfritt. Vi sjekker ikke om en fullstendig treningsrunde gir de riktige resultatene, da dette ville v\u00e6re for tidkrevende. I stedet skriver vi en automatisert test som kj\u00f8rer \u00e9n eller to epoker p\u00e5 et sv\u00e6rt lite datasett, og deretter sjekker vi at utdatametrikker genereres, men vi verifiserer ikke verdiene deres. <\/p> <p>Resultatet av v\u00e5rt arbeid med testautomatisering er at kodebasen v\u00e5r er lettere \u00e5 forst\u00e5, og at det krever mindre innsats \u00e5 gjennomf\u00f8re endringer.<\/p> <p><strong>M\u00e5ling av vedlikeholdbarhetsmetrikker<\/strong><br \/>Et programvaresystem m\u00e5 vedlikeholdes for \u00e5 kunne tilpasses endrede krav og milj\u00f8er, og et dyp l\u00e6ringssystem er intet unntak. Jo mer vedlikeholdbart et system er, desto enklere blir det \u00e5 endre og utvide det. Vi bruker bettercodehub.com til \u00e5 sjekke 10 retningslinjer for programvareutvikling og til \u00e5 varsle oss n\u00e5r et system avviker fra retningslinjene. Vi foretrekker dette verkt\u00f8yet fremfor verkt\u00f8y for kodesbrudd, siden det lar oss fokusere p\u00e5 de viktige retningslinjene for vedlikeholdbarhet, i stedet for \u00e5 m\u00e5tte h\u00e5ndtere enorme mengder brudd som et verkt\u00f8y som PyLint vil rapportere. <\/p> <p><strong>Konklusjon<\/strong><br \/>. Dyp l\u00e6ring er et relativt nytt tilskudd til organisasjonenes IT-verkt\u00f8ykasse. Det har delvis sine r\u00f8tter i tradisjonell programvareutvikling og delvis i datavitenskap. Med tanke p\u00e5 at dyp l\u00e6ring fortsatt er i sin spede begynnelse, er det ikke overraskende at det enn\u00e5 ikke er etablert standardiserte utviklingspraksiser. Utviklingen av dyp l\u00e6ringsprogramvare er imidlertid en integrert del av programvareutviklingen, og vi m\u00e5 hente inspirasjon fra prinsippene for moderne programvareutvikling som utgangspunkt for \u00e5 forbedre programvareutviklingen innen dyp l\u00e6ring. <\/p> <p>De ovennevnte metodene har gjort utviklingsprosessen v\u00e5r for dyp l\u00e6ringsmodeller mer robust og repeterbar, og har skapt et felles grunnlag for samarbeid mellom fagfolk innen dyp l\u00e6ring og programvareingeni\u00f8rer. Prosessen er ikke perfekt, slik ingen prosess er, og vi s\u00f8ker kontinuerlig etter m\u00e5ter \u00e5 forbedre v\u00e5re n\u00e5v\u00e6rende arbeidsmetoder p\u00e5. <\/p> <p>Takk til Rob van der Leek.<\/p>","_links":{"self":[{"href":"https:\/\/keplervision.eu\/no\/wp-json\/wp\/v2\/pages\/37358","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keplervision.eu\/no\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/keplervision.eu\/no\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/keplervision.eu\/no\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/keplervision.eu\/no\/wp-json\/wp\/v2\/comments?post=37358"}],"version-history":[{"count":1,"href":"https:\/\/keplervision.eu\/no\/wp-json\/wp\/v2\/pages\/37358\/revisions"}],"predecessor-version":[{"id":37359,"href":"https:\/\/keplervision.eu\/no\/wp-json\/wp\/v2\/pages\/37358\/revisions\/37359"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/keplervision.eu\/no\/wp-json\/wp\/v2\/media\/37356"}],"wp:attachment":[{"href":"https:\/\/keplervision.eu\/no\/wp-json\/wp\/v2\/media?parent=37358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}