Vision Language Models (VLM’s) zijn generatieve AI-modellen die zowel beelden als tekstinvoer verwerken. Enkele van de nieuwste VLM’s kunnen ook worden uitgevoerd op goedkope edge-hardware, zoals de RUBIK Pi 3. Dit platform beschikt over meerdere accelerators die het mogelijk maken om tegelijkertijd een VLM en een objectdetectiemodel uit te voeren. Hierdoor kan een techniek worden toegepast die bekendstaat als modelcascadering, waarmee de betrouwbaarheid en prestaties worden verbeterd bij complexe Edge-AI-toepassingen.

RUBIK Pi 3 dev kit with powerful hardware acceleration in the form of GPUs and NPUs.
Figuur 1. Een RUBIK Pi 3 devkit met krachtige hardwareversnelling in de vorm van GPU’s en NPU’s.

In het afgelopen jaar zagen we een samensmelting van twee technologieën die gloednieuwe manieren mogelijk maken om Edge-AI-toepassingen te bouwen. De eerste is de prestaties van edge-hardware. Goedkope single-board computers zijn nu beschikbaar met krachtige hardwareversnelling in de vorm van GPU's (Grafische Processors) voor algemene taken en NPU's (Neurale Processors) voor het draaien van neurale netwerken. Een goed voorbeeld hiervan is de Thundercomm RUBIK Pi 3 devkit (Figuur 1), die de Qualcomm DragonwingTM QCS6490-chip bevat, met een krachtige CPU, 8 GB RAM, een 12 TOPs NPU en een flinke GPU. De tweede technologische vooruitgang is de verkleining van Large Language Models, en nog belangrijker, multimodale modellen die afbeeldingen en tekst als input accepteren, deze heten Vision Language Models (VLMs).

 

Cloudgebaseerde VLMs bestaan uit triljoenen parameters en hebben datacenters en terabytes aan RAM nodig om te draaien, maar ze worden kleiner! Dit jaar zagen we initiatieven zoals Hugging Face’s SmolVLM, die de modellen verkleinen tot minder dan 2 miljard parameters; hierdoor kun je ze op goedkope edge-hardware draaien met een redelijke hoeveelheid RAM. Natuurlijk heeft het verkleinen van een VLM wat nadelen, vooral qua nauwkeurigheid, maar met slimme keuzes kunnen ze heel nuttig zijn voor jouw Edge-AI-oplossing.

Een VLM draaien op de RUBIK Pi 3 met Llama.cpp

Llama.cpp is een open-source engine voor het draaien van generatieve Edge-AI modellen. Het is geschreven in C/C++ en je kunt het zo instellen dat het hardwareversnelling gebruikt. Op de RUBIK Pi kunnen we Llama.cpp bouwen met OpenCL om generatieve AI-modellen te draaien op de ingebouwde GPU.

Bekijk de RUBIK Pi 3-handleiding om te zien hoe je Llama.cpp met OpenCL op je apparaat installeert. Je kunt Llama.cpp trouwens ook op andere platforms installeren, zoals Mac en Raspberry Pi. Hoe goed en snel het model draait, hangt af van je apparaat en de beschikbare hardwareversnelling.

Als je Llama.cpp eenmaal hebt geïnstalleerd, kun je een SmolVLM-model met 256 miljoen parameters draaien op de RUBIK Pi door dit in je terminal te typen:

 

llama-server -hf ggml-org/SmolVLM-256M-Instruct-GGUF

 

Deze opdracht downloadt het model van Hugging Face en start een webserver die een interface biedt om met het model te werken. In Figuur 2 heb ik een afbeelding van een voertuig ingevoerd; het model kan mij vertellen wat de kleur en het type voertuig is. De inference duurt ongeveer 10 seconden.

Running SmolVLM on the RUBIK Pi 3 using Llama.cpp.
Figuur 2. SmolVLM draaien op de RUBIK Pi 3 met Llama.cpp.

Je kunt met dit model chatten zoals je dat met een cloud-LLM zou doen, maar het wordt pas echt interessant als je de OpenAI-compatibele API gebruikt en deze functie verwerkt in een complexere toepassing.

Het voorbeeld Python-script in Listing 1 pakt een afbeelding van een auto (bestandsnaam: car.jpg) en stuurt het naar je llama-server, samen met een prompt waarin gevraagd wordt naar de kleur van het voertuig. Daarna print het script het antwoord, dat in dit geval was: The vehicle is white. Als je deze functie combineert met een traditioneel Edge-AI-model, krijg je echt krachtige toepassingen!


Listing 1: Python-script dat een afbeelding van een auto maakt en naar de Llama.cpp-server stuurt.

import requests, base64

response = requests.post(

    "http://localhost:8080/v1/chat/completions",

    json={

     ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ "messages": [

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ {"role": "user", "content": [

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ {base64.b64encode(open('car.jpg', 'rb').read()).decode()}"}},

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ {"type": "text", "text": "What color is this vehicle?"}

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ]}

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ]

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ },

)

print(response.json()["choices"][0]["message"]["content"])
 


Model-cascadering met VLMs

Kleine VLMs zoals deze zijn beperkt door hun formaat; ze kunnen niet goed omgaan met grote contexten en zijn vatbaarder voor verzinsels (onjuiste informatie genereren) dan cloudmodellen. Traditionele modellen die je zelf traint, bijvoorbeeld een objectdetectiemodel om auto’s op een parkeerplaats te vinden, zijn lastiger te maken omdat je data moet verzamelen en zelf moet trainen, maar ze zijn veel minder zwaar en meestal betrouwbaarder.

Door de sterke punten van deze modellen te combineren met de betrouwbaarheid van een objectdetectiemodel dat wordt geactiveerd door, of cascadeert naar het generalisme van een VLM, kunnen we een robuust en krachtig systeem creëren.

Vision mod 3
Figuur 3. Objectdetectie-resultaten triggeren een VLM om elk voertuig te beschrijven.

Als we de parkeerplaats-afbeelding uit Figuur 3 gebruiken en de volledige afbeelding doorgeven aan ons SmolVLM-model met de vraag What color are these vehicles?, krijgen we het antwoord The cars are red and blue. Dit is onjuist en ook niet erg nuttig, omdat we niet weten in welke volgorde de VLM de kleuren weergeeft.

Als we in plaats daarvan een objectdetectiemodel draaien om de locatie van elk voertuig te vinden, deze eruit knippen en dan ons VLM apart vragen stellen per voertuig, krijgen we veel betrouwbaardere antwoorden, zoals te zien is in Figuur 4.

object detection model to identify the location of each vehicle
Figuur 4a. Het voertuig is wit. Figuur 4b. Het voertuig is rood. Figuur 4c. Het voertuig is zwart. Figuur 4d. Het voertuig is groen.

Het voertuigdetectiemodel trainen

Dit demovoorbeeld gebruikt een model dat in Edge Impulse is getraind met de YOLO-Pro-modelarchitectuur. Wil je meer weten over het trainen van een objectdetectiemodel, check dan de tutorial eerder in deze editie of kijk bij .

Gestructureerde uitvoer

Een laatste uitdaging bij generatieve Edge-AI is het gedrag van de toepassing. Deze modellen geven standaard ongestructureerde tekst en zijn van nature niet deterministisch (dezelfde input kan elke keer iets anders opleveren). Mensen begrijpen dat “The vehicle is white” en “It is a white vehicle” hetzelfde betekenen, maar computers kunnen dat niet. Je kunt het model echter een JSON-format meegeven, zodat het altijd dezelfde, betrouwbare uitvoer geeft (Listing 2).


Listing 2: Python-script, met gespecificeerd responsformaat in JSON.

import requests, base64

response = requests.post(

    "http://localhost:8080/v1/chat/completions",

  ​​​​​​​ ​​​​​​​ ​​​​​​​ json={

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ "messages": [

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ {"role": "user", "content": [

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ {base64.b64encode(open('car.jpg', 'rb').read()).decode()}"}},

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ {"type": "text", "text": "What color is this vehicle?"}

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ]}

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ],

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ "response_format":{

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ "type": "json_schema",

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ "json_schema": {

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ "schema": {

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ "type": "object",

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ "properties": { "color": { "type": "string" } },

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ "required": ["color"]

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ }

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ }

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ }

 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ },

)

print(response.json()["choices"][0]["message"]["content"])

 


De nieuwe response_format -parameter beperkt de uitvoer van het model tot strikte JSON. In dit geval, met dezelfde car.jpg (Figuur 4a), krijg je dan:

 

{ "color": "white" }

 

Nu kun je deze uitvoer uitlezen en gebruiken in een volledige toepassing, net als de uitvoer van een traditioneel model.

Een complex Edge-AI systeem ontwerpen

Dit voorbeeld gaat over meerdere AI-modellen die op dezelfde edge-hardware draaien. De RUBIK Pi is hier geschikt voor, omdat je het VLM op de GPU draait, het YOLO-Pro-objectdetectiemodel op de NPU, en het applicatiegedrag op de CPU. De QNN-Accelerator-NPU zorgt ervoor dat het objectdetectiemodel realtime draait met 30 frames per seconde op 640×640, en continu zoekt naar voertuigen in beeld. Op de CPU draait een object-tracking algoritme om voertuigen tussen frames te volgen en ieder voertuig een ID te geven. Dit betekent dat je het zware VLM alleen hoeft te draaien als er een nieuw voertuig verschijnt. Het architectuuroverzicht in Figuur 5 laat zien hoe alle onderdelen samenkomen in een productiesysteem.

Architecture diagram showing model distribution across GPU, NPU, and CPU.
Figuur 5. Architectuurschema dat de modelverdeling over GPU, NPU en CPU laat zien.

De toekomst van Edge-AI?

In dit artikel hebben we de kracht van vision language models onderzocht. Ze geven “zero-shot” antwoorden op vragen waar je normaal aparte modellen en gelabelde datasets voor nodig zou hebben. Op dit moment zijn er zeker beperkingen om rekening mee te houden bij het bouwen van je systeem, maar de technologie ontwikkelt zich snel. Alle generatieve AI-modellen kunnen “hallucineren” en dat zie je nog sterker bij kleine modellen die op de edge draaien. Maar net als large language models die de laatste jaren betrouwbaarder zijn geworden, gaan kleine modellen ook snel vooruit, en als je ze combineert met traditionele modellen in een hybride architectuur, wordt alles nog betrouwbaarder.

Edge-hardware was tot nu toe ook een beperking, want de meeste NPU’s zijn gebouwd voor kleinere netwerken. Nieuwe chips halen de modeltechnologie in en maken generatieve AI-toepassingen mogelijk in energiezuinige versies. Het testen en valideren van de output van VLMs kan lastig zijn, omdat ze normaal vrije tekst teruggeven; door de uitvoer te beperken tot gestructureerde JSON wordt dat veel makkelijker. Edge Impulse werkt ook aan tools om je te helpen deze validatie in de cloud te doen, zodat je de juiste modellen en prompts kunt kiezen die betrouwbaar werken op jouw hardware. Al deze ontwikkelingen wijzen op een toekomst waarin generatieve AI veel gebruikelijker en betrouwbaarder zal zijn aan de edge!


Noot van de redactie: Dit artikel (250818-01) is verschenen in de 2025 Edge Impulse Guest-Edited edition van Elektor.


Vragen of opmerkingen?

 

Hebt u technische vragen of feedback over dit artikel? Neem dan contact op met de auteur in het Edge Impulse-forum (forum.edgeimpulse.com) of met de redactie van Elektor via redactie@elektor.com.

Inschrijven
Schrijf u in voor tag alert e-mails over Edge Impulse!