Päätin itsekin lähteä kokeilemaan yhtä tai useampaa lokaalia avustajaa projektissa, jonka lopullisena tavoitteena on integroida avustaja(t) muutamaan itse ylläpidettyyn rajapintaan.
Inspiroiduin aiheesta jo kevättalvella, mutta pääsin liikkeelle vasta tällä viikolla, kun kohdalle osui sopivaa käytettyä laitekantaa. Alla muutamat alkuhuomiot sekä benchmark-tulokset.
Huomatkaa niitä lukiessanne, että olen AI-asioissa aivan aloittelija, enkä tässä vaiheessa edes täysin tiedä, mitä mitattiin ja mitä tulokset merkitsevät
Tavoitteina oli
-baseOS:n pitkä elinkaari
-mahdollisimman pieni binäärijalanjälki, ts. ei turhia/tarpeettomia paketteja
-kyky ajaa malleja täysin paikallisesti
Alkuun asensin Red Hat Enterprise Linux tuoreimman version vanhaan pelikonerautaan, jossa on kaksi kappaletta RTX3060-näyttiksiä. VRAMia yhteensä 24 Gt, mutta toisen kortin PCIe-väylä on vanha, v3.0.
Kierrätetystä kuluttajaraudasta huolimatta lähdin tavoittelemaan lähes tuotantokelpoista toteutusta. Käyttäjämääräpotentiaaliin nähden ehkä tarpeetonta, mutta halusin samalla myös oppia.
Osin samasta syystä käytössä ei myöskään ole konttipohjaisia ratkaisuja.
Paikallisten LLM:ien ajamiseen valitsin vLLM:n lähinnä sen suorituskyvyn [1-6] ansiosta. Mutta erityisen kiinnostavaa oli myös tuki erilaisiin GPU-kokoonpanoihin esim. yhdessä koneessa kolme korttia, joista jokainen eri muistimäärällä.
Koska asensin RHEL10:n ilman graafista työpöytää, myös nVIDIA ajureista asennettiin vastaavasti ns. headless-versio, Compute-only [d].
Penkitetyt mallit olivat:
01. Qwen/Qwen2.5-7B-Coder-Instruct (tensor parallelism vs pipeline parallelism)
02. Qwen/Qwen2.5-7B-Coder-Instruct-AWQ (tensor parallelism vs pipeline parallelism)
03. Qwen/Qwen2.5-7B-Coder-Instruct-AWQ (Marlin) (tensor parallelism vs pipeline parallelism)
04. Qwen/Qwen2.5-14B-Coder-Instruct-AWQ (Marlin) (tensor parallelism vs pipeline parallelism)
Testauksessa käytin vLLM:n mukana tulevaa
vllm bench serve -komentoa. Ohessa muutama kuva ensiasennuksen jälkeisistä benchmarkeista (
--tensor-parallel-size=2).
Testejä edelsi mallien lataaminen, esim:
Bash:
$ hf download Qwen/Qwen2.5-Coder-7B-Instruct-AWQ --local-dir /opt/vllm/models/qwen/awq
# Huom. jos mallin antoi muodossa 'vllm serve Qwen/Qwen2.5-..', halusi palvelin välttämättä ottaa yhteyden huggingfaceen. Haluan ajaa näitä nimenomaan paikallisesti, offline/air-gap-tyylillä, joten mallit osoitettiin levyltä:
Bash:
$ vllm serve models/qwen/awq/ --served-model-name qwencoderawq --host <palvelimenip> --port 8001 --gpu-memory-utilization 0.80 --max-model-len 32768 --max-num-seqs 128 --tensor-parallel-size 2 --quantization awq_marlin
Tämä varsinainen benchmark ajettiin ns. clientina, eli esim. paikallisesti palvelimen toisessa terminaalissa:
Bash:
$vllm bench serve --backend openai-chat --base-url http://<palvelimenip>:8001 --endpoint /v1/chat/completions --model qwencoderawq --tokenizer models/qwen/awq --num-prompts 128 --max-concurrency 32 --request-rate 20
Penkitysten lisäksi pyysin python-koodin toiminta-analyysiä ja vertailin samoja malleja täsmälleen samalla promptilla.
vLLM tarjoaa Prometheus-yhteensopivaa metriikkaa, joten visualisoin tämän testin tulokset.
Oheisessa testissä, samoin kuin aiemmissa penkitesteissä, kaikki mallit käynnistettiin kylmiltään, ja koodianalyysi oli ensimmäinen niille esitetty prompt.
Kuvassa näkyvät ajat sekunneissa, ja palkkien järjestys kuvassa: Qwen2.5-7B-Coder-Instruct - Qwen2.5-7B-Coder-Instruct-AWQ(Marlin) - Qwen2.5-14B-Coder-Instruct-AWQ(Marlin).
Saman perusmallin AWQ-versio oli tässä käytännön testissä viisi sekuntia perusmallia nopeampi valitsimella
--quantization awq_marlin; 12,5 sekuntia vs 17,5 sekuntia.
vLLM:n
/metrics-endpoint [e] tarjoaa siis mitattua dataa valmiiksi haettavaksi esim. Grafanalla tai Metricbeatilla, mutta samaa dataa pääsee tarkastelemaan myös FastAPIn kautta, joka löytyy oletuksena endpointista
/docs
Lähitulevaisuudessa selvitettäviä asioita
-Prometheus-metriikkojen viimeistely
-tarkoitukseen paremmin sopivat mallit etsintään
-vLLM sleep mode 1|2 [7] testiin, onko käytännön ajallista etua mallien vaihtamiseen lennosta vs. kylmäkäynnistykseen
Sitten kun on aikaa -osio
-Kontekstilaajennus [8,9,10] ja testaus sekä benchmarkien [11] perusteellisempi katsaus
-Poikkeava laitekokoonpano, eli vaihdan toisen näytönohjaimen tilalle pienemmällä muistimäärällä varustetun, vielä vanhemman RTX:n.
-Poikkeavan kokoonpanon penkkitesti (
--pipeline-parallel-size=2)
Lähteitä
[1]
Best Local LLM Tools: vLLM Beats Ollama on Production Throughput | Markaicode
[2]
Ollama vs vLLM: Local vs Production LLM Inference Compared (2026) | Spheron Blog
[3]
https://like2byte.com/ollama-vs-vllm-local-benchmarks-2026/
[4]
vLLM vs Llama.cpp vs Ollama: Multi-GPU LLM Performance
[5]
Ollama vs. vLLM: A deep dive into performance benchmarking | Red Hat Developer
[6]
Stop Wasting Your Multi-GPU Setup With llama.cpp: Use vLLM or ExLlamaV2 for Tensor Parallelism · Osman's Odyssey: Byte & Build
[7]
Zero-Reload Model Switching with vLLM Sleep Mode
[8]
Context Extension - vLLM
[9]
YaRN: Efficient Context Window Extension of Large Language Models
[10]
Qwen2.5-Coder-14B-Instruct-AWQ - Processing Long Texts
[11]
Benchmark CLI - vLLM
Asennusohjeita
[ a ]
How to Serve AI Models Using vLLM on RHEL for Production Inference
[ b ]
Install vLLM on Linux for Production LLM Serving (2026 Guide)
[ c ]
vLLM User Guide - Installation
[ d ]
Red Hat Enterprise Linux — NVIDIA Driver Installation Guide
[ e ]
Metrics - vLLM
# AWQ:sta enemmän
1.
AWQ Quantization Guide: Deploy LLMs at Half the GPU Cost (2026) | Spheron Blog
2.
GitHub - mit-han-lab/llm-awq: [MLSys 2024 Best Paper Award] AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration
3.
AWQ: Activation-aware Weight Quantization for On-Device LLM Compression and Acceleration
4.
AWQ INT4 Deep Dive on RTX 4090 24GB: Marlin Kernels, Calibration, and the 24GB Sweet Spot GIGAGPU
5.
AWQ - Qwen
#AWQ Marlin
1.
How Marlin pushes the boundaries of mixed-precision LLM inference | Red Hat Developer
2.
https://arxiv.org/pdf/2408.11743
//edit: parannettu luettavuutta, mm. pienet kuvat sekä oikea benchmark-komento ja korjattu ainakin yksi väärä linkki







