En stor nyhet släpptes på måndagen den 22 november rörande OpenDroneMap. Då presenterades nämligen stöd för GPU beräkningar i vissa delar av beräkningarna (enbart nVidia grafikkort stöds). Enligt artikeln (länk) så kan detta potentiellt snabba upp de berörda processerna med runt 10x enligt initiala tester.
Den process det handlar om är ”point cloud densification”, eller förtätning av punktmolnet. Förbättringen är möjlig eftersom processen som används, OpenMVS, lagt till just detta beräkningsstöd.
Det är bara just OpenMVS processen i hela kedjan som nu kan beräknas med GPU, och tidsvinsterna handlar därför framför allt om just denna process. Däremot så har just beräkningen av det täta punktmolnet varit en av de mest beräkningsintensiva delarna, så det finns god potential att snabba upp beräkningarna rejält.
Jag har ett litet testprojekt som utan stöd av GPU tog 14m 55s att beräkna, medan det i samma version fast med GPU stöd aktiverat tog 10m 37s. Detta är långt ifrån 10x totalt, men jag körde även en monitor på grafikkortet och kunde registrera när det jobbade som mest under själva OpenMVS processen.
Det var i stort sett en ”blipp” i kurvan, och om alla 4:18 minuter sparades in här, då finns det enorm potential för projekt som är mer beräkningsintensiva.
För mig var det inte så enkelt som beskrivningen angav att få till GPU stödet. Startskriptet skall köras med optionen --gpu
, men det gav bara felmeddelanden initialt. Felsökning pekade på att det saknades stöd för nVidia i min Docker installation. Så efter lite trixande där bland annat nvidia-container-toolkit installerades så gick det bra att köra ./webodm.sh start –gpu och hantera WebODM som vanligt men med stöd av grafikkortet.
Efter de initiala testerna så körde jag även om ännu ett gammalt projekt som var lite större. Ett projekt med drygt 200 bilder som i version 2.4.1 tog drygt 41 minuter och genererade knappt 19 miljoner punkter, tog med 2.6.7 utan GPU bara 14 minuter men genererade bara lite drygt 7 miljoner punkter. Samma projekt med GPU stöd tog 11 minuter och 43 sekunder, och genererade ”bara” knappt 10 miljoner punkter. Beräkningstiden var anmärkningsvärt bättre i båda fallen än med den äldre versionen, men det blev bara hälften så många punkter, om nu det skall vara ett mått på kvalité. Skillnaden mellan körningen med och utan GPU var mindre än förväntat den här gången, men skillnaden i antal genererade punkter är helt omvänt mot det mindre projektet jag började med.
Hur stora förbättringar du kan uppnå beror säkert på många saker. Vilka produkter har du valt att generera? Vad har du för grafikkort? Hur många CPU trådar har du som skall ersättas med detta grafikkort? I mitt fall är det ett RTX 3070 kort som skall ersätta arbetet som utfördes med 24 CPU trådar, men om man har ett bättre kort och en CPU med färre trådar så kan förbättringen bli större än vad den blev för mig.
Andra skillnader
Det var inte bara hastigheten som var en skillnad. Det blev även en skillnad i resultatet i stort.
Det verkar som att beräkningen utan GPU genererat fler punkter och kunnat detektera och återskapa fler objekt, i ett av fallen, medan det såg lite annorlunda ut i det andra. Jag är inte speciellt orolig för antalet punkter för närvarande, men det kan vara värt att hålla ett öga på det här om man tycker att det kan vara ett problem.
Den version av ODM som använts här är 2.6.7 och den skillnaden som finns mellan körningar med och utan GPU är faktiskt ingenting om man jämför med den version som jag först körde det här projektet med, nämligen 2.4.1. Åtminstone inte om man ser till den beräknade tiden. I det lilla projektet var dessutom mängden punkter betydligt färre, medan i det större projektet var det fler punkter i den gamla körningen. Mer tester krävs, och jag vet inte riktigt vad skillnaderna beror på.
Så även om du inte har en nVidia GPU i din maskin, så kan det vara läge att kontrollera vilken version av ODM du kör (det står i de genererade rapporterna), och eventuellt uppgradera till en nyare version.