AI se posouvá neskutečným tempem. Před 2 lety jsem rozběhal první open-source jazykový model na vlastním stroji s Linuxem, mělo to neskutečnou spotřebu RAMek, procesoru i grafiky. Dnes si ukážeme něco mnohem snadnějšího, sofistikovanějšího a mnohem přívětivějšího na Windows 11. Na počítači s 500/500Mbps internetovým připojením to nemohlo trvat déle než 20 minut a měl jsem nainstalovaný program, stažený jazykový model a měl jsem vše připraveno na ukázku, kterou uvidíte v tomto článku.
Tento článek se budu snažit psát co nejsrozumitelněji, aby byl pochopitelný i pro případné začátečníky, proto omluvte, že se budu snažit vyhýbat většímu množství odborných výrazů bez sebevětší snahy některé pojmy vysvětlit do hloubky. Napište mi do komentářů, pokud třeba něčemu stále nebudete rozumět, článek buď doplním, anebo sepíšu další díl, ve kterém si vysvětlíme případné dotazy z tohoto článku.
Pro ty z vás, kteří již několikátým rokem protáčíte ChatGPT, Claude, Gemini a jiné LLM modely můžete článek klidně přeskočit, protože z hlediska promptingu (dotazování) se tu nenaučíte nic nového a ještě vás budou otravovat opakované začátky pro začátečníky.
Proč?
Domnívám se, že čím dříve co nejvíce občanů naší země chytne tuto vlnu, tím dříve se možná zlepší produktivita práce všech, tím dříve se to musí někde projevit, ať už na vyšší kvalitě služeb, rychlejším dodání zadaných úkolů ku spokojenosti všech apod…
Dnes bych vás rád provedl demonstrativní ukázkou, ať máte praktičtější příklad, který vás posune mnohem více, než teorie z minulého dílu.
Jak to celé funguje jednou větou
Ke zprovoznění nějakého LLM (Large Language Model) potřebujete aplikaci, která vám zprostředkuje načtení takového modelu a rozhraní, skrze které se takového modelu, běžícího na vašem počítači či serveru, následně můžete ptát (promptovat, též promptit = zadávat prompty = dotazovat se), na co chcete.
Všechny vygenerované odpovědi AIčkem (LLM) budou kurzívou
Nadpis hovoří jasně. Kdybych něco zapomněl označit kurzívou, dejte vědět v komentářích, děkuji.
1. Stáhněte LM studio nebo jakoukoliv jinou konkurenci
Stáhnout LM studio můžete zde. Pokud znáte lepší program, navrhněte ho v komentářích, děkuji.
2. Po nainstalování a spuštění programu stáhněte navrhovaný model
Program máte stažený, nainstalovaný, musíte do něj stáhnout jazykový model. Díky programu LMstudio můžete měnit LLM modely v LM studiu tak snadno jako kazety ve videopřehrávači, DVDčka v přehrávači, nebo USB flash disky v počítači. (horší přirovnání mě nenapadlo)
Následující jazykový model proto stáhněte a nainstalujte, překvapivě spousta modelů nezabírá tolik místa na disku. Např. DeepSeek-R1-Distill-Qwen-7B-GGUF má jen 4,68GB a měl by vám jet i na kartě se 2 – 3 GB videopaměti. (takže např. Geforce GTX 1060 3GB)
Pokud máte grafickou kartu s 20GB, 24GB nebo 32GB videopamětí, jste schopni zprovoznit větší grafické modely na grafické kartě. Grafická karta však není povinná.
Pozor! Mnohé, zejména ty menší modely umí běžet i čistě jen na procesoru. U větších modelů to sice taky pojede, ale už vám to bude za sebe sázet slabiky/slova velmi pomalu a celková odpověď pak může trvat i 10 a více minut.
Dotaz zadán 32B modelu
Zkusil jsem si připomenout retro hraní s Unreal-Tournament 99 a nechal jsem ho vygenerovat docker-compose.yml soubor (který však je nutné zkontrolovat a vy to taky vždy kontrolujte), který jsem ho nechal naplnit s vloženými informacemi z dokumentace tohoto repozitáře. (naprosto naslepo, vůbec jsem nad tím nepřemýšlel)
Dotaz zněl takto: (teď neřešme, že ten prompt šel popsat lépe, přesněji, bez zbytečných slov atd…)
Napiš docker-compose.yml file pro rozběh Unreal-tournament UT99-server, vložím sem užitečné parametry s konkrétními porty -p 5580:5580 -p 7777:7777/udp -p 7778:7778/udp -p 7779:7779/udp -p 7780:7780/udp -p 7781:7781/udp -p 8777:8777/udp -p 27900:27900 -p 27900:27900/udp -v ut99-data:/ut-data roemer/ut99-server:latest
a chci nastavit environment variables - initial number of bots pro DM na 6, CTF na 8 a ostatní hodnoty vyplň jak uznáš za vhodné a zajisti bezpečné použití všech hesel.
Variable Mandatory Description
UT_SERVERURL Yes This is the default uri for the server startup. By default, it looks like: CTF-Face?game=BotPack.CTFGame?mutator=BotPack.InstaGibDM,MVES.MapVote,FlagAnnouncementsV2.FlagAnnouncements
UT_SERVERNAME No If this variable is set, it will always override the server name in UnrealTournament.ini with this on startup.
UT_ADMINNAME No If this variable is set, it will always override the admin name in UnrealTournament.ini with this on startup.
UT_ADMINEMAIL No If this variable is set, it will always override the admin email in UnrealTournament.ini with this on startup.
UT_MOTD1 No If this variable is set, it will always override the MOTD1 in UnrealTournament.ini with this on startup.
UT_DOUPLINK No If this variable is set, it will always override the DoUpLink in UnrealTournament.ini with this on startup. Default is true.
UT_ADMINPWD No If this variable is set, it will always override the admin password in UnrealTournament.ini with this on startup.
UT_GAMEPWD No If this variable is set, it will always override the game password in UnrealTournament.ini with this on startup.
UT_WEBADMINUSER No If this variable is set, it will always override the web admin username in UnrealTournament.ini with this on startup.
UT_WEBADMINPWD No If this variable is set, it will always override the web admin password in UnrealTournament.ini with this on startup.
UT_MINPLAYERS_DM No Set the minimum number of players in DeathMatchPlus.
UT_MINPLAYERS_CTF No Set the minimum number of players in CTF.
UT_MAXPLAYERS No Set the max number of players.
UT_INITIALBOTS_DM No Set the initial number of bots in DeathMatchPlus.
UT_INITIALBOTS_CTF No Set the initial number of bots in CTF.
Přesvědčivé výsledky
Musím uznat, že na první pohled se docker-compose file zdál skutečně přesvědčivý. Rovněž velká výhoda je, že můžete použít i delší prompt na upřesnění dotazu, či vložení většího množství textu do zadání dotazu.
Nespokojenost s odpovědí? Regenerate message
Geniální, rychlé, jednoduché, tak jako jste byli doposud zvyklí používat ChatGPT, používáte úplně stejným způsobem LM studio s načteným modelem.
Výsledek – Lepší než od Juniora, ale best practicies v tom nehledejte
Tak jak hovoří nadpis. Použitelné by to +- bylo, ale ta hesla v environment variables nepořešená bezpečnější formou, jsou vyloženě prasárna. Nicméně na nějaké to domácí hraní by to asi stačilo.
Následující odstavec byl vygenerován pomocí Qwen2.5-32B-Instruct-GGUF:
Zde je příklad konfigurace souboru docker-compose.yml
pro spuštění Unreal Tournament 99 serveru pomocí Dockeru. Tento soubor zahrnuje všechny požadované porty, nastavení proměnných prostředí a bezpečné hesla.
version: '3.8'
services:
ut99-server:
image: roemer/ut99-server:latest
container_name: ut99-server-container
ports:
- "5580:5580"
- "7777:7777/udp"
- "7778:7778/udp"
- "7779:7779/udp"
- "7780:7780/udp"
- "7781:7781/udp"
- "8777:8777/udp"
- "27900:27900/tcp"
- "27900:27900/udp"
volumes:
- ut99-data:/ut-data
environment:
UT_SERVERURL: CTF-Face?game=BotPack.CTFGame?mutator=BotPack.InstaGibDM,MVES.MapVote,FlagAnnouncementsV2.FlagAnnouncements
UT_ADMINNAME: "AdminName"
UT_ADMINEMAIL: "admin@example.com"
UT_MOTD1: "Welcome to our Unreal Tournament 99 server!"
UT_DOUPLINK: "true"
UT_ADMINPWD: "Str0ngP@ssw0rd4dm!n"
UT_GAMEPWD: "GamePassW0rD"
UT_WEBADMINUSER: "WebAdminUser"
UT_WEBADMINPWD: "WebAdm1nPass!"
UT_MINPLAYERS_DM: "2"
UT_MINPLAYERS_CTF: "3"
UT_MAXPLAYERS: "64"
UT_INITIALBOTS_DM: "6"
UT_INITIALBOTS_CTF: "8"
volumes:
ut99-data:
Příprava hesel
Výše uvedené hesla by měly být vytvořeny tak, aby zahrnovaly kombinaci malých a velkých písmen, číslic a speciálních znaků. Je důležité je aktualizovat na náhodnou hodnotu pro každý nový spuštění nebo periodicky pro zlepšení bezpečnosti.
Poznámky
UT_SERVERURL
je nastavena podle vašeho požadavku, ale můžete ji upravit dle potřeby.- Pro vlastní bezpečnost doporučujeme generovat náhodné hesla a udržovat je v tajnosti.
UT_MAXPLAYERS
je nastaven na 64, což je běžný maximální limit pro mnoho Unreal Tournament serverů. Pokud potřebujete menší nebo větší kapacitu, změňte hodnotu podle potřeby.UT_DOUPLINK
je nastavena na „true“, což znamená, že server automaticky připojí do seznamu dostupných her. Pokud toto nechcete, můžete tento parametr změnit na „false“.
Zde končí výstup z Qwen2.5-32B-Instruct-GGUF.
Když víte, co chcete, nakonec s dalším dotazem LLM donutíte k odpovědi odpovídající vašim představám
Všimněte si, že ještě za chodu jste schopni váš stávající dotaz upravit a pomocí CTRL + ENTER potvrdit jeho změnu.
Upravená odpověď z Qwen2.5-32B-Instruct-GGUF:
Jistě, můžeme vytvořit .env
soubor pro uchování hesel a ostatních citlivých informací. Tento přístup zlepšuje bezpečnost a údržbu konfigurace.
Soubor .env
Vytvořte soubor .env
ve stejné složce jako docker-compose.yml
, kam uložíme všechny hesla a další proměnné:
UT_ADMINNAME=AdminName
UT_ADMINEMAIL=admin@example.com
UT_MOTD1="Welcome to our Unreal Tournament 99 server!"
UT_DOUPLINK=true
UT_ADMINPWD=Str0ngP@ssw0rd4dm!
UT_GAMEPWD=GamePassW0rD
UT_WEBADMINUSER=WebAdminUser
UT_WEBADMINPWD=WebAdm1nPass!
UT_MINPLAYERS_DM=2
UT_MINPLAYERS_CTF=3
UT_MAXPLAYERS=64
UT_INITIALBOTS_DM=6
UT_INITIALBOTS_CTF=8
Soubor docker-compose.yml
Nyní upravme soubor docker-compose.yml
tak, aby odkazoval na proměnné z .env
.
version: '3.8'
services:
ut99-server:
image: roemer/ut99-server:latest
container_name: ut99-server-container
ports:
- "5580:5580"
- "7777:7777/udp"
- "7778:7778/udp"
- "7779:7779/udp"
- "7780:7780/udp"
- "7781:7781/udp"
- "8777:8777/udp"
- "27900:27900/tcp"
- "27900:27900/udp"
volumes:
- ut99-data:/ut-data
environment:
UT_SERVERURL: CTF-Face?game=BotPack.CTFGame?mutator=BotPack.InstaGibDM,MVES.MapVote,FlagAnnouncementsV2.FlagAnnouncements
UT_ADMINNAME: ${UT_ADMINNAME}
UT_ADMINEMAIL: ${UT_ADMINEMAIL}
UT_MOTD1: ${UT_MOTD1}
UT_DOUPLINK: ${UT_DOUPLINK}
UT_ADMINPWD: ${UT_ADMINPWD}
UT_GAMEPWD: ${UT_GAMEPWD}
UT_WEBADMINUSER: ${UT_WEBADMINUSER}
UT_WEBADMINPWD: ${UT_WEBADMINPWD}
UT_MINPLAYERS_DM: ${UT_MINPLAYERS_DM}
UT_MINPLAYERS_CTF: ${UT_MINPLAYERS_CTF}
UT_MAXPLAYERS: ${UT_MAXPLAYERS}
UT_INITIALBOTS_DM: ${UT_INITIALBOTS_DM}
UT_INITIALBOTS_CTF: ${UT_INITIALBOTS_CTF}
volumes:
ut99-data:
Shrnutí
Tento přístup umožňuje uchovávat citlivé informace v .env
souboru, který je často ignorován v kontrolovaných verzích systémů (jako např. Git), což zlepšuje bezpečnost a udržitelnost konfigurací.
Konec odpovědi QWEN-2.5-32B-instruct
A teď totéž, ale do kubernetes.yaml formátu
Zatížení procesoru by sneslo více, ale neumí to pracovat s SMT (multivláknem) od AMD, takže na procesorech od AMD podporující více „logických procesorů“, se budete muset spolehnout na údaj počtu jader.
Rychlost generování odpovědi je okolo 1,5 tokenu za vteřinu.
Domnívám se, že takový pěkný výstup by vám standardní GPT 4o nedalo, anebo by vás pláclo přes prsty kvůli délce promptu. Následující text kurzívou je vygenerován qwen2.5-32B_instruct-GGUF:
Jistě, můžeme vytvořit Kubernetes manifest s použitím `ConfigMap` a `Secret` pro uchování konfiguračních proměnných a citlivých informací. Toto umožní bezpečný a správný způsob, jak spravovat proměnné prostředí v Kubernetes.
### Soubor `kubernetes-configmap.yaml` pro konfigurační hodnoty
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: ut99-server-config
data:
UT_ADMINNAME: "AdminName"
UT_ADMINEMAIL: "admin@example.com"
UT_MOTD1: "Welcome to our Unreal Tournament 99 server!"
UT_DOUPLINK: "true"
UT_MINPLAYERS_DM: "2"
UT_MINPLAYERS_CTF: "3"
UT_MAXPLAYERS: "64"
UT_INITIALBOTS_DM: "6"
UT_INITIALBOTS_CTF: "8"
```
### Soubor `kubernetes-secret.yaml` pro citlivé informace
```yaml
apiVersion: v1
kind: Secret
metadata:
name: ut99-server-secrets
type: Opaque
data:
# Hesla musí být zakódovány do base64
UT_ADMINPWD: UHN0cm9uZ1BAc3N3b3JkNGRtIQ==
UT_GAMEPWD: R2FtZVBhc3dPUg==
UT_WEBADMINUSER: V2ViQWRtaW5Vc2Vy
UT_WEBADMINPWD: V2ViQWRtaW5QYXNzIQ==
```
### Soubor `kubernetes-deployment.yaml` pro nasazení serveru
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ut99-server-deployment
spec:
replicas: 1
selector:
matchLabels:
app: ut99-server
template:
metadata:
labels:
app: ut99-server
spec:
containers:
- name: ut99-server-container
image: roemer/ut99-server:latest
ports:
- containerPort: 5580
- containerPort: 7777
protocol: UDP
- containerPort: 7778
protocol: UDP
- containerPort: 7779
protocol: UDP
- containerPort: 7780
protocol: UDP
- containerPort: 7781
protocol: UDP
- containerPort: 8777
protocol: UDP
- containerPort: 27900
volumeMounts:
- name: ut99-data
mountPath: /ut-data
envFrom:
- configMapRef:
name: ut99-server-config
- secretRef:
name: ut99-server-secrets
volumes:
- name: ut99-data
persistentVolumeClaim:
claimName: ut99-pvc
```
### Soubor `kubernetes-service.yaml` pro vytvoření služby, která expone porty serveru
```yaml
apiVersion: v1
kind: Service
metadata:
name: ut99-server-service
spec:
selector:
app: ut99-server
ports:
- protocol: TCP
port: 5580
targetPort: 5580
- protocol: UDP
port: 7777
targetPort: 7777
- protocol: UDP
port: 7778
targetPort: 7778
- protocol: UDP
port: 7779
targetPort: 7779
- protocol: UDP
port: 7780
targetPort: 7780
- protocol: UDP
port: 7781
targetPort: 7781
- protocol: UDP
port: 8777
targetPort: 8777
- protocol: TCP
port: 27900
targetPort: 27900
- protocol: UDP
port: 27900
targetPort: 27900
type: LoadBalancer # Nebo ClusterIP podle vašich potřeb
```
### Soubor `kubernetes-pvc.yaml` pro přidělení PersistentVolumeClaim (PVC)
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ut99-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
```
### Shrnutí
Tato konfigurace umožňuje správu konfiguračních hodnot a citlivých informací pomocí `ConfigMap` a `Secret`, což zajišťuje bezpečný a udržovatelný způsob nasazení Unreal Tournament 99 serveru v Kubernetes.
Závěr – co ušetříte za chatGPT, vrazíte do nedoplatků za elektřinu
Neplatí pro majitele notebooků, ti si je v létě možná ugrilují. Na druhou stranu ani v mém případě nedocházelo k většímu zatížení grafické karty. Důležitá je tu hlavně velikost videopaměti grafiky.
Už se těším na ta letní vedra, kdy budu protáčet LLM na vlastních strojích, ofukovaných mobilní klimatizací!
Každopádně máte možnost si to rozjet doma. Rozhodně to stojí za to, pokud máte již nakoupený hardware, který vám každý další den zastarává, tak proč ho nevyužít, aniž byste krmili dalšími daty LLM modely provozované někým jiným?