Pá. Led 31st, 2025
screenshot z programu LM studio dotazující se uživatele, jestli si chce stáhnout nabízený jazykový model QWEN-2.5

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.

Hlavní stránka lmstudio.ai, stáhněte LM studio pro váš operační systém

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)

Ukázka navrhovaného modelu Deepseek R1 distilled Qwen 7B ke stažení v programu LM Studio

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.

Ukázka 32B modelu, který by neměl spořádat více než něco okolo 20GB videopaměti
Víc ram vám rozhodně pomůže načíst větší modely

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.
Jak to vypadá po zadání dotazu – program byl tou dobou nastaven tak, ať použije nastavení Guardrails: „Relaxed“
To poslední, co chcete, je zadat dotaz a pak řešit, že stroj přetížíte, přetečou ramky, sekne se vám stroj, ugrilujete grafiku a vy tak přijdete o to, co vám to doposud nagenerovalo a to by byla škoda. Proto jsem zvolil nastavení Guardrails: Relaxed.

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.

Ikonka protiběžných šipek dá přegenerovat již vygenerovanou odpověď, pokud s ní nejste spokojeni

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.

Ukázka úpravy již zpracováváného promptu.

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

Ukázka zadaného promptu navazující na předchozí dotaz a součást generování odpovědi.

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?

Avatar

By mirra

Hardwaru a počítačům se věnuji již od roku 2003. Za tu dobu jsem poskládal stovky počítačů, opravil tisíce počítačů a vyřešil nespočetně problémů, vad a chyb, se kterými se setkávali uživatelé. Od roku 2005 se zabývám servery, zejména těmi herními, v roce 2007 jsem se začal věnovat Valve Source SDK level designu, který šel od roku 2009 k ledu kvůli studiu Informatiky na univerzitě. Podílel jsem se chvíli i na provozu síťové laboratoře MENDELU, dnes spravuji v jedné osobě cca 100 serverů/diskových polí na univerzitě, řeším IT v malých a středních firmách tak, aby firmy ušetřily nemalé částky při zlepšení kvality a soustředím se na snižování nákladů na IT od licencí až po hardware, software, provádím konsolidace a audity platnosti licencí, které firmám šetří rovněž nemalé peníze. Z velkých firem jsem měl příležitost s dalšími kolegy řešit správu 8000 serverů po celé západní Evropě s vysokou mírou automatizace a poznávání nejrůznějších evropských pracovních mentalit. Dále jsem řešil hybridní cloud ve velké firmě, orientované na trhy střední a východní Evropy. Posledních několik let se věnuji Devops pro velké zákazníky v Azure cloudu, spravuji kubernetes (AKS), Gitlab.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *