tekologiablogi

seikkailut linuxien ja tekoälyjen ihmemaassa

📍 Hyvinkää

Linux-migraatio

MBR vs GPT ja osiointi eli partitiointi

Ennen kiintolevyn osiointia kannattaa valita käytettävä osiointimenetelmä sillä sitä ei voi levyn ollessa käytössä tosta noin vain enää vaihtaa. Jos kiintolevy on kooltaan yli 2 teratavua, M.2 NVMe SSD tai haluaa riivata itseään Windows dual-boot hullutuksilla ainoa vaihtoehto on GPT, muussa tapauksessa kelpaa myös MBR.

gparted screenshot

Levyn partitiointi onnistuu kätevästi GPartedilla.

GPT-levylle on luotava erillinen osio joko EFI- tai BIOS-boottia varten. BIOS-partitiolle riittää 2 megatavua levyn alusta eikä sille valita tiedostojärjestelmää. Se on merkittävä flagilla bios_grub, tämän partition sisältö kirjoitetaan grubilla myöhemmin. EFI-partitiolle tarvitsee varata vähintään 100 megatavua, käytöstä riippuen mahdollisesti paljon enemmän. 512 megatavua on yleisesti suositeltu. EFI-partitiolla käytetään fat32/vfat-tiedostojärjestelmää ja se merkitään boot flagilla. Kuvasta poiketen GPT-juuripartitiolla ei tarvita flageja, ne taitavat olla jäänteitä levyllä olleesta Windowsista. Sen sijaan jos valitaan MBR niin juuripartitio tarvitsee boot flagin eikä erillistä boot-osiota tarvita vaan MBR-boot sector mahtuu levyn alkuun.

GPT ei ole huono idea, ext4 on klassinen valinta.

Linuxille tarvitaan yksi osio jonne juurihakemisto tulee mutta tapauskohtaisesti /home ja jokunen muukin voi olla viisasta sijoittaa erilliselle levylle tai partitiolle. Valitse tiedostojärjestelmä kuten ext4 ja formatoi linux-käyttöön tulevat partitiot. Myös swap kannattaa olla vaikka tuntuisi siltä ettei RAM voi koskaan loppua. Swapista on hyvä tehdä hieman suurempi kuin RAM-muistista, muuten hibernointi eli suspend-to-disk ei toimi.

Käytössä olevan Linuxin siirto toiselle levylle

Olet itse vastuussa syöttämistäsi komennoista! Kopioimalla sokeasti komentoja saatat aiheuttaa silmitöntä vahinkoa.

Jos on asentanut tuhansia paketteja ja kirjoittanut toista sataa konffia hartaana käsityönä tällaisessa migraatiossa levyltä toiselle on houkutuksensa. Muussa tapauksessa voi olla helpompaa asentaa linux uudestaan uudelle levylle ja pitää tiedostonsa erillisellä /home partitiolla. Tiedosto-konfliktien välttämiseksi järjestelmän siirto on parasta tehdä mahdollisimman lähellä yhden käyttäjän tilaa, esimerkiksi buuttaamalla recovery-moodiin mikä löytynee grub-valikosta Advanced optionsin alta ja sitten sieltä root shell.

mkdir /mnt/newhd
mount /dev/sdb2 /mnt/newhd
cp -ax /bin* /boot /dev /etc /initrd* /lib* /root /sbin* /snap /sys /usr /var /vmlinuz* /mnt/newhd

Parempi valita kaikki tarvitsemansa hakemistot. Tietyt tyhjät hakemistot on hyvä luoda, esim. /proc, /run ja /tmp on luotava uudelle levylle koska ilman niitä linux ei toimi.

cd /mnt/newhd
mkdir mnt proc run tmp

Uuden levyn /etc/fstab

UUID-tunnukset täytyy vaihtaa fstabiin. Kaukoviisaana voisi tietysti selvittää uuden levyn tunnuksen lsblk -f komennolla ja lisätä se fstabiin kommenttina ennen kuin buuttaa hankalakäyttöiseen shelliin, sitten ei tarvitsisi kuin poistaa # valmiina odottavan rivin alusta.

lsblk -f |grep sdb2|sed 's/^.*\ \([0-9a-f-]\+\)\ .*$/UUID=\1\ \/\ ext4\ errors=remount-ro\ 0\ 1/' \
>>/etc/fstab

Jos ehti jo rescue shelliin saa tarvittavan rivin lisättyä fstabiin harjoittamalla hieman säännöllisiä lausekkeita. Jos ei kuitenkaan tunne itseään riittävän velhoksi käyttääkseen niitä voi vaihtoehtoisesti kirjoittaa lunttilapun ja kopioida siitä tarvittavat konffitiedot:

lsblk -f|grep sdb >>etc/fstab
nano etc/fstab

Kaikkia partitioita koskevien tietojen oikeellisuudesta on varmistuttava huolellisesti jotta buutti varmasti onnistuu. Lopuksi poistetaan lunttirivit fstabin lopusta.

UUID=12345678-9abc-def0-1234-56789abcdef0    /   ext4    defaults,noatime,errors=remount-ro  0  1
UUID=01234567-89ab-cdef-0123-456789abcdef   none    swap    sw,pri=10   0    0
#UUID=f0123456-789a-bcde-f012-3456789abcde  none    swap    sw,pri=1    0  0
UUID=ef012345-6789-abcd-ef01-23456789abcd   /home   ext4    defaults,relatime   0   2
UUID=def01234-5678-9abc-def0-123456789abc   /data   ext4    defaults,nofail,noatime,noexec,errors=remount-ro    0   2

Esimerkki /etc/fstab sisällöstä. SSD-systeemilevyn elämää pidentää noatime-optio. Mikäli käytössä on useita swappeja voi niiden prioriteetteja säätää pri-optiolla, mitä suurempi luku sitä ensisijaisempi swap.

Tarkista juurihakemiston UUID ainakin kahdesti.

Käynnistäminen bios_grub-partitiolla

Linux ei käynnisty uudelta levyltä ilman grubia, se täytyy päivittää.

Älä yritä muokata grub.cfg konffia käsin 😬

Muokattavaksi tarkoitetut konffit löytyy /etc alta kuten /etc/default/grub, sen sijaan /boot konffit on automaattisesti luotuja ja ylikirjoittuvat myöskin automaattisesti.

grub-install --boot-directory=/mnt/newhd/boot /dev/sdb
grub-mkconfig -o /mnt/newhd/boot/grub/grub.cfg
umount /dev/sdb2

Jos käytössä olevalla levyllä on UEFI-boot ja grub-install herjaa jotain efiin liittyen, grub-installiin on lisättävä --target=i386-pc määrite. Kun grub on laitettu voi koneen sammuttaa ja vanhan levyn irrottaa. Sitten muutetaan buuttijärjestys ja muut tarvittavat asetukset biosista ja toivotaan parasta..

Manuaalinen käynnistys

multifail

Toisinaan lipsahtaa typotus, unohtuu jotain tai pääsee aivopieru. Käynnistysvaihe on hyvin anteeksiantamaton.

set root=(hd0,gpt2)
linux /boot/vmlinuz-6.8.0-40-generic root=/dev/sdb2
initrd /boot/initrd.img-6.8.0-40-generic
boot

Kukaan ei halua nähdä virheilmoitusta unknown filesystem, se tarkoittaa että koneeseen on kytkettävä levy tai usb-muisti jolta käynnistys onnistuu koska kiinni olevalta levyltä se ei onnistu. Sen sijaan jos vastassa on tavallinen grub-kehote ei hätää käynnistystä voi jatkaa manuaalisesti. Kehote tottelee ls-komentoa jolla voi selvittää miltä partitiolta /boot löytyy ja jopa tab-täydennys onnistuu, sen avulla tarvittavan kernel-version ja initrd-imagen valinta sujuu helposti.

fsck /dev/sdb2
mount -o remount,rw /dev/sdb2 /

Toisinaan epämääräisen buutin jälkeen levy saattaa olla likainen ja read-only, jolloin virheellisiä konffeja ei pysty muokkaamaan. Ongelmaan tarjoaa ratkaisun fsck.

Käynnistyksen suojaaminen salasanalla

Osaavissa käsissä grub-valikko tarjoaa vapaan pääsyn linux-järjestelmään rescue root shellin kautta, on syytä suojata salasanalla jollei koko käynnistystä niin ainakin edistyneet toiminnot ja toimintojen muokkaaminen. On myös mahdollista estää root-login jolloin grubin salasanasuojaus jää vähän redundantiksi, mutta toisaalta sitten ilman root rescue shelliä kyykkyyn päätyneen järjestelmän pelastaminen voi osoittautua astetta hankalammaksi.

grub-mkpasswd-pbkdf2
sudo nano /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# dont touch the tail
set superusers="naserume"
password_pbkdf2 naserume grub.pbkdf2.sha512.10000.???????

Lisätään 40_custom conffiin rivit joilla määritellään käyttäjänimi ja grub-mkpasswd-pbkdf2 komennolla saatu salasana-hash.

sudo nano /etc/grub.d/10_linux
echo "menuentry '$(echo "$os" | grub_quote)' --unrestricted ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"

Jotta normaali käynnistys ei kysyisi salasanaa etsitään 10_linux conffista gnulinux-simple ja lisätään tälle riville unrestricted määritys. Grub versiopäivityksen jälkeen tämän rivin voi joutua lisäämään uudelleen.

Käytä sellaista salasanaa jonka varmasti muistat.

Virtuaalinen Linux

Virt-manager ja QEMU

sudo apt install virt-manager
sudo usermod -aG libvirt,kvm artint

Virt-managerin asentaminen on varsin suoraviivaista ja QEMU asentuu siinä samalla dependenssinä. Käyttäjä on lisättävä ryhmiin libvirt ja kvm.

virt error

Välittömästä asennuksen jälkeen käyttäjä ei vielä näy tarvittavassa ryhmässä mistä seuraa virhetilanne. Tilanteen voi korjata rebootilla.

newgrp libvirt
virt-manager
exit

Mikäli on kiire päästä käyttämään virtuaalikoneita tai reboot ei muusta syystä käy päinsä voi vaihtaa käyttäjäryhmän ja käynnistää virt-managerin tähän tapaan. Jotta käyttäjän luomat tiedostot eivät kirjautuisi ryhmätunnuksella libvirt komennetaan exit ennen kuin terminaalia käytetään muuhun.

Linux virtuaalikoneessa

vm setup

Uuden virtuaalikoneen luominen sujuu mutkattomasti asennusvelhon avulla. Valittaessa paikallinen asennusmedia käyttöjärjestelmä asennetaan joko iso-tiedostosta tai optiselta asemalta.

  • Nyrkkisääntönä voi pitää että viime vuosina julkaistut linuxit vaativat minimissään 1 ytimen, 2 gigaa muistia ja 20 gigaa levyä kevyeen työpöytäkäyttöön. Sujuvaan työpöytäkäyttöön tarvitsee 2 ydintä, 4 gigaa muistia ja yli 25 gigaa levyä.
  • Ydinten ja muistin määrää voi vaihdella mielin määrin myöhemmin jotenka asennusvaiheessa ei tarvitse turhaan säästellä.
  • Levynkin kokoa pystyy muuttamaan mutta se ei suju aivan yhtä käden käänteessä, jotenka on parempi harkita hieman paljonko levytilaa asennusvaiheessa varaa. 25-30 gigaa voi olla kaukonäköinen ratkaisu.
  • Virtuaalikoneeseen ei välttämättä kannata laittaa täyttä työpöytäasennusta vaan ainoastaan käytön kannalta olennaiset paketit.
snap fix

Tuore Ubuntu 22.04 Jammy sisältää hienosäädön tarvetta.

sudo snap refresh
snap-store --quit && sudo snap refresh snap-store
sudo apt install ubuntu-mate-core

Snap-store pitää sulkea jotta sen voi päivittää. Myös ikkunoissa havaitun gnome-pöhön voi korjata. Logout, login ja pöhö on pois silmistä.

cloning

Kun asennukset on päivitelty ja välttämättömät paketit lisätty, on viisasta ottaa varmuuskopio kloonaamalla virtuaalikone. Jos jokin menee pahasti pieleen voi halutessaan deletoida kuralle menneen virtuaalikoneen ja kloonata varmuuskopiosta uuden käyttökopion.

Tiedostojen kopiointi virtuaali- ja isäntäkoneen välillä

sudo apt install libguestfs-tools

Libguestfs työkalupakki sisältää useita käyttökelpoisia komentoja VM-levykuvien käsittelyyn.

sudo virt-copy-out -a /var/lib/libvirt/images/ubuntu22.qcow2 \
/home/artint/stable-diffusion.cpp/build/bin/sd ~/Downloads/
sudo virt-copy-in -a /var/lib/libvirt/images/ubuntu18.qcow2 ~/Downloads/ubuntu2004-cuda-11.2.2.tgz \
/home/artint/Downloads/

Esimerkissä virt-copy-out komennolla kopioidaan virtuaalikoneessa käännetty binääri isäntäkoneen käyttäjän Downloads hakemistoon ja virt-copy-in komennolla kopioidaan isäntäkoneella oleva CUDA 11.2.2 toolkit virtuaalikoneen käyttäjän Downloads hakemistoon. Virtuaalikonetta ei tarvitse sammuttaa tiedostoja kopioidakseen.

sudo guestmount -o allow_other -a /var/lib/libvirt/images/ubuntu22.qcow2 -m /dev/sda3 --ro /mnt/vm/
sudo guestunmount /mnt/vm

Esimerkissä mountataan guestmount komennolla osio virtuaalikoneen kiintolevyltä. Unmount tapahtuu komennolla guestunmount. Käynnissä olevan virtuaalikoneen osiot on mountattava read-only jotta tiedostojärjestelmän korruptoitumiselta vältytään. Guestmountin allow_other parametrin voi jättää pois jos muokataan /etc/fuse.conffia. Ilman tuota määritystä tai konffin muokkausta mountpoint on ainoastaan rootin käytettävissä.

sudo nano /etc/fuse.conf
user_allow_other

VM-levykuvan suurentaminen

sudo qemu-img info /var/lib/libvirt/images/ubuntu18.qcow2
sudo virt-filesystems -la /var/lib/libvirt/images/ubuntu18.qcow2 --blkdevs --extra
sudo qemu-img resize /var/lib/libvirt/images/ubuntu18.qcow2 +10G

Ennen levykuvan muokkaamista virtuaalikone täytyy pysäyttää, koska sen muokkaaminen virtuaalikoneen ollessa käynnissä voi aiheuttaa levykuvan tuhoutumisen. Levykuvan tiedot voi tarkistaa komennolla qemu-img info ja tarkempaa tietoa sen sisältämistä osioista saa komennolla virt-filesystems. Kokoa muutetaan komennolla qemu-img resize.

growing

VM-levykuvaan lisätty tila näkyy virtuaalikoneessa varaamattomana ja sen saa käyttöön suurentamalla olemassaolevaa partitiota tai luomalla vapaaseen tilaan uuden partition.

VM-levykuvan pienentäminen

cd-boot

Jotta virtuaalikoneen levyä voisi kutistaa tilan itselleen varaavaa osiota on ensin pienennettävä. Se ei onnistu virtuaalikoneen ollessa käynnissä, jotenka VM käynnistetään sellaiselta optiselta medialta jolta löytyy osiointityökalu kuten GParted. Iso-kuvan valitsemisen lisäksi buuttijärjestystä pitää muuttaa.

gparted

Minimalistinen GParted Live hoitaa asian siinä missä järeämmätkin live-Linuxit.

sudo qemu-img resize --shrink /var/lib/libvirt/images/ubuntu18.qcow2 -25G

Pienentäminen tapahtuu qemu-img resize komennolla käyttäen shrink-parametria.

Levykuvaa pienennetään ainoastaan varaamattomalta alueelta.

Näytönohjain on huono

Legacy näytönohjain ja stable-diffusion.cpp

AI-slop

Enempi tai vähempi kaupallista AI-sloppia katsellessa tulee väkisinkin mieleen että sitähän voisi tehdä kotikoneella maksamatta siitä kellekään, eikä sitten tarvitsisi kirota hirttosilmukkaakin tiukempiin corporate policyihin perustuvia omituisia safety filttereitä ja miettiä että kuka tai mikä niitä kokeiltuja kehotteita vielä käy läpi ja onko niillä hyvät mielessä. Fingerporiakin voisi käyttää lähtökuvana eikä kukaan valittaisi tekijänoikeudesta ainakaan niin kauaa kun pitää ethernet-piuhaa irti koneesta.

sudo apt install git cmake
git clone --recursive https://github.com/leejet/stable-diffusion.cpp
cd stable-diffusion.cpp/
mkdir build-cpu && cd build-cpu
cmake .. -DCMAKE_CXX_FLAGS="-mno-avx2"
cmake --build . --config Release

Helpointa on kääntää stable-diffusion.cpp pelkällä cpu-tuella ja vaikka vanhasta prosessorista puuttuisi avx2-tuki voi sen jättää pois cmake flagilla. Kääntäjän kieräyttämä binääritiedosto ilmestyy build-cpu/bin-hakemistoon josta sen voi ottaa talteen. Vanha näytönohjain joka ei tue modernia cudaa ei välttämättä toimi prosessoria nopeammin vulkanilla, GTX 670 2GB oli noin 4 kertaa hitaampi vulkanilla kuin pelkkä i7 josta avx2 uupuu🙃 Elikä jos ei saa cudaa toimimaan Nvidia-ohjaimellaan sen vulkanin voisi ehkä suosiolla unohtaa.

sudo apt install gcc-10 g++-10 nvidia-cuda-toolkit
cd ..
mkdir build-cuda && cd build-cuda
cmake .. -DSD_CUDA=ON -DCMAKE_CXX_FLAGS="-mno-avx2" -DCMAKE_CXX_COMPILER=/usr/bin/g++-10 \
-DCMAKE_CUDA_HOST_COMPILER=/usr/bin/g++-10
cmake --build . --config Release

Cuda-tuki vanhoille ohjaimille on vähän haasteellisempi mutta Ubuntu Jammyn kun on laitellut virtuaalikoneeseen ja siellä kääntelee saa suhteellisen kivuttomasti aikaiseksi binäärin jolle pitäisi kelvata Nvidian ohjaimet alkaen cuda-versiosta 8.6 ja alaspäin yhteensopien aina 3.5 saakka. Se mitä ohjaimia versionumerot käytännössä tarkoittaa ratkeaa helposti tutkiskelemalla oheista taulukkoa. Jos koneesta löytyy vaikkapa GTX 1060 3GB se toiminee --offload-to-cpu vipusen avulla vaikkakin turkasen hitaasti mutta GTX 670 on auttamattomasti liian vanha, sitä ei kerta kaikkiaan tueta. Aikaa voi säästää jättämällä nuijasodan aikaiset linuxit asentamatta virtuaalikoneeseen, ggml-cuda vaatii cuda17 kieltä joka lisättiin toolkitin versiossa 11.0 mutta sm30-tuki poistettiin siinä samaisessa.

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110 --slave /usr/bin/g++ \
g++ /usr/bin/g++-11
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ \
g++ /usr/bin/g++-10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ \
g++ /usr/bin/g++-9
sudo update-alternatives --config gcc

Uutta rautaa ja uutta koodia harrastavat eivät tälläistä kikkailua tarvitse. Sen sijaan vanhaa koodia kääntäessä huomaa pian asentaneensa lukuisia versioita c++-kääntäjästä. Dependenssihelvetti ei ota hellittääkseen ja cmake rivikin helposti venyy lukuisista -DCMAKE flageista, sen sentään saa trimmattua vaihtelemalla kääntäjää kätevästi update-alternativesilla.

Uusi näytönohjain ja stable-diffusion.cpp

wget "https://developer.download.nvidia.com/compute/cuda/12.8.1/local_installers/\
cuda_12.8.1_570.124.06_linux.run"
mkdir /home/artint/cuda-12.8
sh cuda_12.8.1_570.124.06_linux.run --silent --toolkit --toolkitpath=/home/artint/cuda-12.8 \
--installpath=/home/artint/cuda-12.8 --no-opengl-libs

Uusi näytönohjain on niin uusi ettei paketinhallinnasta löydy riittävän tuoretta versiota toolkitistä. Nvidian skripti on interaktiivinen ja asentaa valitut osaset globaalisti jollei sille anna --silent argumenttia. Ajurien asennus estetään argumentilla --no-opengl-libs. Haluttu polku määritellään myös. Omia tarpeitaan vastaavaa toolkitiä voi etsiä Nvidian sivuilta, jollei paketinhallinnasta sopivaa löydä.

git clone --recursive https://github.com/leejet/stable-diffusion.cpp
cd stable-diffusion.cpp
mkdir build && cd build
export PATH="/home/artint/cuda-12.8/bin:$PATH"
export LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu:/home/artint/cuda-12.8/lib64:$LD_LIBRARY_PATH"
export CUDA_HOME="/home/artint/cuda-12.8"
cmake .. -DSD_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=120 -DGGML_CUDA_COMPUTE_CAP=120
cmake --build . -j 6 --config Release

Toolkit ja libsit pitää saada asianmukaisessa järjestyksessä polkuun mutta normaalisti niiden ei tarvitse polussa näkyä jotenka ~/.profilen tai ~/.bashrc muokkauksen sijaan exportoidaan vaan.

Kuvien luominen

AI-slop

Diffuusiomallin ajamiseen tarvitaan usein kolme komponenttia jotka ladataan kukin omalla argumentillaan, itse diffuusiomalli --diffusion-model, tekstienkooderi --llm ja autoenkooderi --vae. Joissakin malleissa nämä toiminnot on sisäänleivottu, tällaisen mallin voi ladata argumentilla -m. Jos vae on yhteensopimaton lopputuloksena on pelkkää mustaa tms. Useimmiten autoenkooderin voi jättää poiskin mutta sitten värit voivat jäädä hailakoiksi ja kuvasta saattaa puuttua terävyyttä.

Akuuttia muistin loppumista vastaan on useita jippoja, kuten flash attention --diffusion-fa ja --vae-tiling joka jakaa kuvan erillisiin osa-alueisiin joiden määrän voi määrittää --vae-relative-tile-size argumentilla. Suurikokoisia kuvia generoitaessa tiletys on välttämätöntä. Tarvittaessa koko vae on mahdollista hoitaa prosessorilla käyttämällä --vae-on-cpu. Vihoviimeisenä keinona --offload-to-cpu jättää mallin painot rammiin josta ne ladataan vrammiin tarvittaessa, mutta sen käyttäminen moninkertaistaa kuvan valmistumiseen kuluvan ajan. Prosessorille nakitettuja tehtäviä voi nopeuttaa lisäämällä säikeitä -t argumentilla, suositeltu arvo on fyysisten ytimien määrä.

Ohjausaste --cfg-scale ja askelten määrä --steps on sovitettava käytössä olevan mallin mukaisiksi. Esimerkiksi turbo/lightning mallit saavat aikaiseksi viimeistellyn lopputuloksen hyvin pienellä määrällä askelia mutta eivät yleensä kestä korkeaa ohjausastetta ja ylimääräiset askelet heikentävät lopputulosta. Kuvan laadun kannalta on tärkeää valita mallille sopiva näytteenotto --sampling-method ja aikataulutus --scheduler. Oletusasetuksilla generointi usein onnistuu mutta lopputulos saattaa olla sumea ja yksityiskohdat jää uupumaan. Jos sampler tai scheduler on yhteensopimaton generointi epäonnistuu ja kuva on pelkkää mustaa tmv. Mallin tyypistä riippuen kuvan yksityiskohtaisuutta voi koittaa ehostaa myös määrittelemällä korkeampia --shift-value arvoja.

sd-cli --diffusion-model ~/gguf/ovis_image-Q8_0.gguf --llm ~/gguf/ovis_2.5_txt-q8_0.gguf --vae ~/tensors/FLUX.1-schnell-vae.safetensors --sampling-method euler --scheduler sgm_uniform --cfg-scale 4.5 --steps 50 -p "single panel cartoon, 3d photorealistic style, a bipedal dinosaur with sharp teeth wearing a scarf and shoes talks to an apprehensive pig, dinosaur has a speech bubble with text \"I was wondering if you could produce some more greenhouse gases, it\'s still a bit cold in here\!\", pig is quite unhappy, grasslands with acacia trees in the background, sun shining brightly, clear midday sky, high detail and sharp focus, detailed background, photography" -n "blurry, low resolution, (cropped:1.9), low quality, pixelated, bad anatomy, bad hand, bad foot, deformed, disfigured, extra limb, missing limb, floating limbs, disconnected limbs, disconnected head, malformed hands, mutated hands and fingers, bad hands, missing fingers, bad hands, fused hand, missing hand, disappearing arms, disappearing thigh, disappearing calf, disappearing legs, missing fingers, fused fingers, abnormal hands, abnormal legs, abnormal feet, abnormal fingers, glitch, watermark, trademark, logo, signature, unrealistic, fused fingers, inaccurate limb, extra fingers, extra arms, (extra legs:1.9), inaccurate eyes, bad composition, error, extra digit, missing digits" -t 6 -b 9 -H 768 -W 512 -s -1 -o ~/Pictures/sloppyslop.png --diffusion-fa

Ällistyttävän hienojen saatika kehotetta noudattavien kuvien aikaansaaminen on oma taitolajinsa jossa tietoteknisellä osaamisella on lähinnä mahdollistava ja avustava rooli. Kärsivällisyys ja tarkkaavaisuus katsottaneen eduksi🙃

AI Slop

Kotihakemistosta löytyi laama

cd llama.cpp
git pull
git submodule update --init --recursive
rm -rf build && mkdir build

Toisinaan kotihakemistosta voi löytää laaman jos on tullut sellaista kokeilleeksi. Ehkä näytönohjain oli huono ja sitten se jäi kunnes lopulta unohtui. Kun on uusi ohjain kotelopellin alla voi yrittää uudelleen. Ei raaski poistaa vanhaa laamaa, sen voi päivittää.

cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=100 \
-DCMAKE_INSTALL_RPATH="/home/artint/cuda-12.8/lib64" -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DLLAMA_CURL=OFF \
-DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=OFF
cmake --build build --config Release -j 6

Natiivi Blackwell 120 arkkitehtuuri ei kääntynyt mutta sitä voisi vielä joku viikko yrittää uudelleen. Sen tilalle valikoitunut 100 ei ehkä ole optimaalinen ratkaisu, väitteiden mukaan 90 olisi ollut varmempi valinta, mutta käännös onnistui ja näyttää myös toimivan ihan tarpeeksi nopeasti. Curl-tuen voi jättää pois lokaalia mallia ajellessa ja ilman jaettuja kirjastoja käännös on staattinen eli ei tarvitse pähkäillä missä ne ~/biniin sysätyn binäärin libsit luuraa. Käännöstä voi nopeuttaa lisäämällä -j vivulla käytettävien säikeiden määrää.

llama-server -m ~/gguf/gpt-oss-20b-Q6_K.gguf --host 192.168.1.7 --port 8080 --mlock --offline

Hetken valmisteltuaan laama tarjoilee kielimallin lähiverkolle. Oletuskokoisella konteksti-ikkunalla 6-bittiseksi kvantisoitu 20 miljardin parametrin gpt-oss mahtuu 16 gigan vrammiin vaikka kde plasma onkin rohmunnut gigan itselleen. Jos ei mahtuisi --mlock pistäisi koko mallin latautumaan rammiin. Mikäli kielimalli ei mahdu vram+rammiin se on liian hidas ja on parempi kokeilla pienempää ja/tai kvantisoidumpaa vaihtoehtoa. Joidenkin mielestä ovat hitaita jos eivät mahdu kokonaisuudessaan vrammiin, mutta voisihan sitä vaikka keittää teetä ja scrollailla tiktokkia tai katsoa jotakin striimauspalvelua inferenssiä odotellessa, liika kiire aiheuttaa stressiä.

llama

Llama Firefoxissa.

Kuva tekstiksi ja takaisin kuvaksi

llama-server -m ~/gguf/Qwen2.5-VL-7B-Instruct-UD-Q4_K_XL.gguf --mmproj \
~/gguf/Qwen2.5-VL-7B-Instruct-mmproj-F16.gguf --host 192.168.1.7 --port 8080 --mlock --offline

Laamalla voi ajaa myös näkökielimalleja, jotka osaavat nähdä liitteeksi annettuja kuvatiedostoja.

horstiger

Hätäsesti hutastu hevostiikeri kaipaa vähän viritystä.

Analyze this image and generate a detailed text-to-image prompt for a diffusion model (like Stable Diffusion) to recreate it. Break the 
description down into these specific components:
    1. Subject: Primary focus, appearance, pose, and clothing. (If applicable, emphasize details in this part in particular)
    2. Style & Medium: Artistic medium (e.g., oil painting, 3D render, raw photography), specific art style, or artist influences.
    3. Environment: Background details, setting, and atmosphere.
    4. Composition & Lighting: Camera angle (e.g., wide shot, macro), lighting type (e.g., cinematic, rim lighting), and color palette.
Output the final result as a single, cohesive paragraph of descriptive keywords and phrases.
vision model

Promptataan näkökielimalli generoimaan annetusta kuvasta kehote diffuusiomallia varten.

sd-cli --diffusion-model ~/gguf/qwen-image-2512-Q4_K_M.gguf --flow-shift 3 --vae ~/tensors/qwen_image_vae.safetensors --llm ~/gguf/Qwen2.5-VL-7B-Instruct-UD-Q4_K_XL.gguf --offload-to-cpu --sampling-method dpm++2m --scheduler sgm_uniform --cfg-scale 4.5 --steps 41 -n "blurry, low resolution, (cropped:1.2), worst quality, low quality, pixelated, bad anatomy, bad hand, bad foot, deformed, disproportionate body, long torso, watermark, disfigured, poorly drawn face, extra limb, poorly drawn hands, missing limb, floating limbs, disconnected limbs, disconnected head, long neck, mutated hands and fingers, bad hands, poorly drawn, disappearing thigh, disappearing calf, disappearing legs, abnormal eye proportion, abnormal hands, abnormal legs, abnormal feet, crayon, sketch, film grain, anime, cartoon, illustration, painting, drawing, (text:1.6), glitch, tattoo, watermark, trademark, logo, signature, unrealistic, inaccurate limb, (extra legs:1.2), inaccurate eyes, bad composition, error, normal quality, jpeg artifacts, artist's name, username, (words:1.6)" -t 6 -b 7 -H 1088 -W 1920 -s -1 -p "A majestic, tiger-horse hybrid creature with a fierce expression and a mix of orange and black stripes stands in a rustic, fenced enclosure. The horse's legs are robust and muscular, blending seamlessly with the tiger's body. The environment features a wooden fence and sparse greenery, suggesting a rural or zoo-like setting. The lighting is natural and slightly overexposed, casting a warm glow over the scene and creating a somewhat surreal and dreamlike atmosphere. The composition is a side profile of the hybrid, with the background slightly blurred to emphasize the subject, high detail and sharp focus, photography" --vae-tiling --vae-relative-tile-size 0.25 --diffusion-fa -o ~/Pictures/majestic_horstiger.png

Tekstikuvauksia on helppo muokata ja eri kuviin perustuvia kuvauksien osia voi vaihdella ja lisäillä promptiin käden käänteessä, mutta toisinaan kehote on niin hieno että sitä on kokeiltava lähes sellaisenaan😀

Majestic Horstiger

Nationalismi Linuxissa

Suomi-näppiksen ja bopomofon rauhanomainen rinnakkaiselo

Kde- ja Mate-ympäristöissä yhden Kiinan politiikka on vahva eikä bopomofoa löydy valikosta suoriltaan. Gnomessa asiat ehkä ovat toisin mutta muisti voi olla kortilla eikä lisäpöhö siihen auta, työpöytäympäristön vaihtoa läskimpään ei voi suositella. Asiasta on kirjoitettu toimiva dokumentti, mutta tässä samat sävelet suomeksi.

sudo apt install fcitx5 fcitx5-configtool fcitx5-chinese-addons fcitx-frontend-all
im-config
sudo apt install fcitx5-chewing
fcitx5-configtool

Gnomea kevyempi Fcitx5 asentuu helposti. Im-configissa vastataan yes ja valitaan fcitx5. Bopomofo-näppäimistöasetuksen saa lisättyä chewing-paketilla. Asetuksiin pääsee käsiksi joko komennolla fcitx5-configtool tai paneeliin ilmestyneen kuvakkeen kautta.

bopomofo

Jotta bopomofo ei yrittäisi käyttää suomalaista näppäimistökarttaa täytyy sille luoda oma ryhmä johonka lisätään pohjille ascii-näppäimistö kuten US English. Ryhmää voi vaihtaa kätevästi näppäinyhdistelmällä super+space. Ascii-ryhmän ollessa valittuna voi valita englannin ja chewingin välillä paneelista aukeavan valikon kautta. Samasta valikosta voi chewing-tilassa valita traditionaalisen ja yksinkertaistetun kiinan väliltä.

Kauniimpi ja rohkeampi fontti

curl https://radianssi.neocities.org/tekologia/kai.woff -o kai.woff
sudo apt install woff-tools
woff2sfnt kai.woff > ~/.local/share/fonts/kai.ttf
fc-cache -fv

Jostakin päin internettiä on löytynyt tavallista kauniimpi fontti. Jotta sitä pääsisi käyttämään vaikkapa LibreOffice Writerissä, on tiedosto muutettava ttf-muotoon ja laitettava sopivaan hakemistoon. Sitten rakennetaan fontticache uudelleen.

sudo apt install fontforge
fontforge
fontforge

Fontin nimeä voi vaihtaa fontforgella. Avataan fontti ja muokataan Element → Font Infoa. Uusi fonttitiedosto luodaan File → Generate Fonts kautta. Pienistä virheistä ei ole pakko välittää. Lopuksi fontticache rakennetaan jälleen uudelleen.

LibreOffice Writer

Säännölliset lausekkeet

Grepatut YouTube-tykkäykset sediputkistossa

YouTuben tykättyjen videoiden lista on kömpelö ja hidas, javascript lataa 100 riviä kerrallaan hitaanlaisesti. Vaikka kärsivällisyyttä riittäisi loppuun saakka saattaa muisti loppua kun jo 2500 tykkäyksen lista tabissa nielaisee pari gigatavua muistia, vanhempi kone hyytyy sitä vieritellessä.

source html

Kerran loppuun saakka jaksettuaan sivun voi tallentaa. Tallennetuista tiedostoista voi repiä irti haluamansa datan ja parsia siitä oman kevyen webbisivun jonka täydentäminen myöhemmin sujuu suhteellisen tuskattomasti.

grep -e '<yt-formatted-string id="text"' -e '<a id="video-title"' -e '^[[:blank:]]\+[0-9]\+:[0-9]\+' 'yt liked videos 150126 snapshot.html'|grep -v '<!--' |sed 's/[^[:print:]]//g; s/^.*href=\"\(.*\)\">\(.*\)<\/a\>.*$/<a href=https:\/\/youtube.com\1>\2<\/a>/g; s/^.*title=\"\(.*\)\".*href=\"\(.*\)\&amp\;list.*$/<a href=https:\/\/youtube.com\2>\1<\/a>/g; s/^.*spellcheck=\"false\">\(.*\)<\/a>.*$/\1/g'| sed '1,/<\/yt-formatted-string>/d; N; N; s/^[[:blank:]]\+\(.*\)\n\(.*\)\n\(.*\)/<div class=\"link-item\">\3<\/div><div class=\"link-item\">\2<\/div><div class=\"link-item\">\1<\/div>/' >'yt liked videos 150126 list.html'

Hirviömäinen oneliner on helpompi hahmottaa kun se pilkotaan osiin:

grep -e '<yt-formatted-string id="text"' -e '<a id="video-title"' -e '^[[:blank:]]\+[0-9]\+:[0-9]\+' 'yt liked videos 150126 snapshot.html'|grep -v '<!--'

Ensin grepataan rivit joilla haluttu tieto on ja poistetaan rivit joilla sitä ei ole. Rivejä valitaan argumentilla -e ja karsitaan argumentilla -v. Yksinkertaisilla lainausmerkeillä vähennetään tarvetta escapoida kenoviivalla \ erikoismerkkejä kuten välilyönti ja lainausmerkki. [[:blank:]] mätsää whitespacea ja [0-9] numeroita. Jos halutaan mätsätä yksi tai useampi merkki wildcard on + ja se täytyy escapoida.

sed 's/[^[:print:]]//g; s/^.*href=\"\(.*\)\">\(.*\)<\/a\>.*$/<a href=https:\/\/youtube.com\1>\2<\/a>/g; s/^.*title=\"\(.*\)\".*href=\"\(.*\)\&amp\;list.*$/<a href=https:\/\/youtube.com\2>\1<\/a>/g; s/^.*spellcheck=\"false\">\(.*\)<\/a>.*$/\1/g'

Saatu tuotos ohjataan putkea | pitkin edelleen sediin. Käyttämällä hyväksi pilkotulla sivulla olleita toistuvia elementtejä saa säännöllisillä lausekkeilla ja sedillä muotoiltua niiden sisällöstä uusia linkkejä. Todennäköisesti yleisin komento sedissä on s///, joka hakee ja korvaa tekstiä. Haku pysähtyy rivin ensimmäiseen löydökseen jollei tee siitä rivinlaajuista käyttämällä s///g. Hakulausekkeet rajataan kauttaviivalla /. Mikäli komentoja on useita ne erotetaan toisistaan puolipisteellä ja komentorivi verhotaan yksinkertaisilla lainausmerkeillä. [^[:print:]] mätsää tulostettavissa olevien merkkien negaatiota. Hakasulkeissa ^ tarkoittaa negaatiota, ilman niitä sillä tarkoitetaan rivin alkua. Vastaavasti rivin loppu on $. Jos näitä halutaan mätsätä merkkeinä ne pitää escapoida. Piste . mätsää mihin tahansa merkkiin ja nollan tai useamman tapauksessa wildcard on *.

sed '1,/<\/yt-formatted-string>/d; N; N; s/^[[:blank:]]\+\(.*\)\n\(.*\)\n\(.*\)/<div class=\"link-item\">\3<\/div><div class=\"link-item\">\2<\/div><div class=\"link-item\">\1<\/div>/'

Lähes valmis tavara viimeistellään laittamalla se vielä kerran putken kautta sediin. Komento 1,//d etsii tiedoston alusta alkaen ja trimmaa kaiken pois löydökseen saakka, N taas hakee seuraavan rivin mukaan käsiteltäväksi. Tässä tapauksessa käsitellään kolme riviä kerrallaan. Rivinvaihtoon mätsää \n. Jos löydettyä sisältöä halutaan käyttää korvaamiseen se laitetaan sulkuihin jotka on escapoitava. Korvaamisessa käytetään escapoituja numeroita, \1 tarkoittaa ensimmäistä löydöstä jnpp.

cat header.html 'yt liked videos 150126 list.html' footer.html >liked_vids.html

Jotta sivu olisi kokonainen tarvitaan tietyt elementit alkuun ja loppuun. Nyt 2500 suosikin tabi vie enää 400 megaa.

Apassilogit saattavat olla vihamielisiä