3 mei 2023
AI gebruiken om code te genereren
Programmeren met superkrachten
Als onderdeel van mijn software-optimalisatie om cloudkosten te verlagen, moest ik een bestaand stuk inefficiënte serversoftware vervangen door iets dat gebruik maakt van robuustere (maar gefragmenteerde) tools die beschikbaar zijn in Debian GNU/Linux. Kon het GPT4 taalmodel me wat AI-magie bieden? Lees verder!
Onderdeel van de clouddiensten van mijn bedrijf is de zogenaamde "Lemmid Manager", een geïntegreerd contentmanagementsysteem dat ruwe input (tekst, video's, afbeeldingen) neemt en mooie, goed presterende statische websites genereert. Geconfronteerd met stijgende cloudkosten, ben ik bezig delen van de software te herschrijven om efficiënter te zijn: minder computerkracht gebruiken om dezelfde resultaten te bereiken.
Afbeelding rotatie
Je realiseert het je misschien niet, maar wanneer je je telefoon gebruikt om een foto te maken, wordt deze altijd liggend (of breedbeeld) opgeslagen. Wanneer je een staande (of rechtopstaande) foto maakt, voegt je telefoon simpelweg een beetje extra informatie toe die de manier waarop je de camera hebt gehouden opslaat - zodat wanneer je de foto terugkijkt, deze correct georiënteerd wordt weergegeven. Het is sneller om één bitje (extra) informatie te schrijven dan om de daadwerkelijke bits en bytes waaruit je afbeelding bestaat te roteren.
Dit is allemaal prima als de foto je telefoon niet verlaat, maar wanneer je de foto naar een website uploadt, moet deze geoptimaliseerd worden voor het web. De daadwerkelijke afbeeldingsbits en -bytes moeten dan de daadwerkelijke inhoud van de foto weerspiegelen. De afbeelding kan dan verder geoptimaliseerd worden voor laadsnelheden en verschillende viewports.
Automatische afbeeldingsrotatie op basis van EXIF
Moderne (smartphone) camera's slaan de oriëntatie op in de zogenaamde EXIF die de daadwerkelijke afbeeldingsgegevens vergezelt. Om de afbeelding (bits en bytes) correct de oriëntatie van de camera te laten weerspiegelen, moet men de EXIF-gegevens lezen en op basis van de oriëntatie een rotatie-algoritme toepassen op de afbeeldingsbits en -bytes.
Huidige implementatie
De originele (handgeschreven) implementatie gebruikt NodeJS en een module genaamd "lwip" (LightWeight ImageProcessor) om dit te doen. Dit werkt prima in de meeste situaties, maar naarmate afbeeldingen groter zijn geworden (vanwege meer megapixels), zijn de geheugenvereisten aanzienlijk toegenomen. Het nadeel van alles in één NodeJS-proces te doen, is dat het geheel een soort geheugenvreter wordt - waardoor de volledige NodeJS-backend eronder lijdt wanneer je hem tot het uiterste drijft door duizenden foto's te verwerken.
Een veelgebruikte strategie om knelpunten in een stuk software te optimaliseren, is ze uit het hoofdprogramma te halen. In plaats van afbeeldingen rechtstreeks vanuit NodeJS te verwerken, wil ik veelgebruikte Debian GNU/Linux-tools (die hun sporen verdiend hebben) gebruiken om de automatische afbeeldingsrotatie uit te voeren. Vanuit NodeJS kan ik dan de externe 'auto_rotator' aanroepen en wachten tot deze zijn taak heeft voltooid. Door een NodeJS-proces te laten wachten op een asynchroon resultaat/callback, maak je het weer beschikbaar voor andere verzoeken.
GPT4 als codegenerator
Het mooie van vrije software is dat er veel bouwstenen beschikbaar zijn die je kunt gebruiken om je eigen programma's te bouwen. Ik wist dat Debian GNU/Linux tools beschikbaar heeft die de afbeeldingsrotatie op basis van EXIF-gegevens kunnen uitvoeren. De uitdaging is om één script te maken dat deze verschillende tools gebruikt om de klus te klaren en tegelijkertijd enige robuustheid biedt bij het afhandelen van uitzonderingen.
In plaats van zelf diep in alle beschikbare commando's en commando-opties te duiken, besloot ik GPT4 te vragen om een script voor me te genereren dat precies doet wat ik wilde, met behulp van standaardtools die beschikbaar zijn in Debian GNU/Linux:

Binnen enkele seconden genereerde OpenAI's GPT4 een bash-script dat ImageMagick (een veelgebruikte grafische tool) gebruikt om aanpassingen uit te voeren op basis van de EXIF-gegevens in een bepaald afbeeldingsbestand. De AI selecteerde de "exiftool" om de oriëntatiegegevens te lezen en op basis van de output van die tool het "convert"-commando van ImageMagick uit te voeren om de juiste rotatie toe te passen.

De volledige code (die binnen enkele seconden werd gegenereerd) is prachtig becommentarieerd, waardoor je een goed gevoel krijgt van wat er gebeurt. Het is gestructureerd en geoptimaliseerd om door mensen te worden gelezen.
Documentatie
Naast de daadwerkelijk werkende code leverde de AI documentatie waarin werd uitgelegd hoe de nieuw gegenereerde software moet worden gebruikt - inclusief installatie-instructies. Dit is iets waarvan ik weet dat de meeste programmeurs het over het hoofd zien (technische documentatie is vaak een bijzaak).

Conclusie
Binnen een paar minuten had ik een werkend, gedocumenteerd stuk code dat me helpt een knelpunt in een stuk cloudsoftware op te lossen. Dat is gewoon geweldig - het bespaarde me tijd (die ik vervolgens heb gebruikt om deze blogpost te schrijven).
Je kunt je alleen maar afvragen welke effecten grote taalmodellen zoals ChatGPT/GPT4 zullen hebben op hoe we werken. Ik omarm AI-tools volledig - weten hoe je ze moet gebruiken zal in de nabije toekomst essentieel zijn (denk ik)!
