Bautagebuch | Construction Diary ... Build a DIY Low Budget Ai-Home-Server and Run LLM's Locally

by _-_kowabunga_-_ in Circuits > Raspberry Pi

78 Views, 2 Favorites, 0 Comments

Bautagebuch | Construction Diary ... Build a DIY Low Budget Ai-Home-Server and Run LLM's Locally

20250205_112737_013.jpg

diy build - low budget ai home server, run LLM's locally on Raspberry 5 8GB with second hand Radeon rx 580 8GB GPU over the pcie bus with NVMe dual SSD shiel adapter and a pcie 1x to 16x Riser Card with M.2 to pcie x1 NGFF slot adapter.

-----------------------------------------------------------------------------------------------------------------------------------------------------------

Disclaimer:

Die Zusammenstellung der Informationen in diesem Artikel wurde von mir mit größtmöglicher Sorgfalt vorgenommen.

Dennoch kann keinerlei Gewähr für Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereit gestellten Informationen und Daten übernommen werden.

Haftungsansprüche gegen mich oder die Autoren bzw. Verantwortlichen dieser Website für Schäden materieller oder immaterieller Art, die auf ggf. fehlerhaften oder unvollständigen Informationen und Daten beruhen, sind, soweit nicht Vorsatz oder grobe Fahrlässigkeit vorliegt, ausgeschlossen.

Diesr Artikel enthält Links zu Webseiten Dritter, die von anderen unterhalten werden. Diese Links sind rein für Ihren gefälligen Gebrauch zur Verfügung gestellt und stellen keine Billigung des Inhalts auf diesen genannten Seiten seitens von mir dar.

Ich bin für den Inhalt dieser Links nicht verantwortlich und stehen auch nicht für den Inhalt und die Genauigkeit des Materials auf den Webseiten Dritter ein.

Wenn Sie sich für einen Zugriff auf diese Links zu den Webseiten Dritter entscheiden, tun Sie dies auf eigene Verantwortung.

Mit freundlichen Grüßen

Supplies

Quellenangabe:


Jeff Geerling

https://www.youtube.com/@JeffGeerling

James Mackenzie

https://www.youtube.com/@jamesfmackenzie

GitHub_Repsitory von Core Forges

https://github.com/Coreforge/linux.git


Blog Postings and Hardware Link:


+++LLMs accelerated with eGPU on a Raspberry Pi 5 (Jeff Geerling)+++

https://www.jeffgeerling.com/blog/2024/llms-accelerated-egpu-on-raspberry-pi-5

Use an External GPU on Raspberry Pi 5 for 4K Gaming (Jeff Geerling)

https://www.jeffgeerling.com/blog/2024/use-external-gpu-on-raspberry-pi-5-4k-gaming

Llama Benchmarking issue

https://github.com/geerlingguy/ollama-benchmark?tab=readme-ov-file

AMD not supporting ROCm on Arm

https://github.com/ROCm/ROCm/issues/3960

Raspberry Pi PCIe Database

https://pipci.jeffgeerling.com

X1005 NVMe dual SSD Shield

https://wiki.geekworm.com/X1005

Kompilierung eines eigenen Linux-Kernels für den Raspberry Pi 5

https://blog.berrybase.de/raspberry-pi-5-grafikkarte-linux-kernel-kompilieren/

MZHOU PCI-E 1X to 16X VER010-X Riser Card mit M.2 to PCI-E X1 NGFF Slot Adapter für Bitcoin Cryptocurrency Mining Ethernet Mining

https://mzhou.com/product-category/pci-e-expansion-card/

Waveshare Micro HDMI to HDMI Multifunctional Adapter

https://www.waveshare.com/pi5-connector-adapter.htm

KIOXIA 64GB Micro Sd Card

https://europe.kioxia.com/de-de/personal/micro-sd/exceria.html

GeeekPi N07 M.2 PCIe to NVMe Bottom SSD Pip PCIe Peripheral Board for Raspberry Pi 5

https://amzn.eu/d/gF4ByPZ


Hardware and purchase price:

based on Februar 2025

Rasperrey 5 8GB (Semaf.at EUR 87,85)

Radeon RX 580 8GB GPU (refurbed, second Hand Price EUR 70-80)

Geekworm X1005 NVMe dual SSD Shield (Amazon EUR 39,32)

MZHOU PCI-E 1X to 16X VER010-X Riser (Amazon EUR 11,09)

Cooler Master Silent PRO 600W (refurbed, second Hand Price EUR 30-40)

KIOXIA 64GB Micro Sd Card (Semaf.at EUR 6,00)


Optional:


Waveshare Micro HDMI to HDMI Multifunctional Adapter (Amazon EUR 13,10 )

QIVYNSRY M.2 Kühlkörper NVME 2280 (optional Amazon EUR 10,07)

Samsung 980 PRO NVMe M.2 SSD, 1 TB (Amazon EUR 91,75)

Yunseity DIY ITX Computer Open Air Gehäuse (Amazon EUR 43,72)

GeeekPi N07 M.2 PCIe to NVMe Bottom SSD Pip PCIe Peripheral Board (Amazon EUR 15,97)

RPI Software Update

Stellen Sie zunächst sicher, dass auf Ihrem Raspberry Pi die neueste Software ausgeführt wird.

Führen Sie den folgenden Befehl aus, um das Update durchzuführen:

sudo apt update && sudo apt full-upgrade

Stellen Sie als Nächstes sicher, dass Ihre Raspberry Pi-Firmware auf dem neuesten Stand ist .

Führen Sie den folgenden Befehl aus, um zu sehen, welche Firmware Sie ausführen:

sudo rpi-eeprom-update

Wenn der 6. Dezember 2023 oder ein späteres Datum angezeigt wird, fahren Sie mit dem nächsten Schritt fort.

Wenn Sie ein Datum vor dem 6. Dezember 2023 sehen, führen Sie den folgenden Befehl aus, um die Raspberry Pi-Konfigurations-CLI zu öffnen:

sudo raspi-config

Unter Advanced Options > Bootloader Versionwählen Latest.

Beenden Sie dann raspi-config mit Finish oder die Esc-Taste .

Führen Sie den folgenden Befehl aus, um Ihre Firmware auf die neueste Version zu aktualisieren:

sudo rpi-eeprom-update -a

Starten Sie dann neu mit:

sudo reboot

Informationen PCI-Bus

sudo_nano.png

Der Linux-Befehl lspci (list PCI) zeigt Informationen zu jedem PCI-Bus auf Ihrem System an.

Dazu gehören Informationen über die an das PCI-Subsystem angeschlossenen Geräte.

lspci

schauen Sie mit sudo nano ob die Zeile [all] dtoverlay=pciex1_=3 paqsst.

sudo nano /boot/firmware/config.txt

mit Ctrl+X beenden

AMD Treiber Und Kernel Neu Kompilieren.

kernel.png
cd_linux.png
unaligned.png

Kernel-Quellcode aus dem GitHub_Repsitory von Core Forges

git clone --depth=1 --branch rpi-6.6.y-gpu https://github.com/Coreforge/linux.git

Build status for rpi-6.6.y: Pi kernel build tests dtoverlaycheck

Wechseln sie in das Verzeichnis linux

ls
cd linux

Holen Sie die Kopie der optimierten Mem-Kopierbibliothek von CoreForges und Speichern Sie sie unter /Linux

wget https://gist.githubusercontent.com/Coreforge/91da3d410ec7eb0ef5bc8dee24b91359/raw/b4848d1da9fff0cfcf7b601713efac1909e408e8/memcpy_unaligned.c

Anm.: die Datei memcpy_unaligned.c befindet sich jetzt im Ordner ~/linux

gcc -shared -fPIC -o memcpy.so memcpy_unaligned.c
sudo mv memcpy.so /usr/local/lib/memcpy.so

Führen Sie den Befehl aus:

sudo nano /etc/ld.so.preload

und fügen sie in die erste Zeile den Eintrag ein.

/usr/local/lib/memcpy.so

Anm.: Um eine Datei mit nano wieder zu speichern, hier folgende Anweisung:

. Drücken Sie Strg+O.

. Eine"WriteOut"-Meldung wird im Terminal angezeigt.

. Drücken Sie Enter, um die Datei zu speichern.

. Wenn Sie den Editor verlassen wollen, drücken Sie Strg+X.

Installieren der benötigten Pakete (Install Required Packages) mit:

sudo apt install bc bison flex libssl-dev libncurses-dev make

Wir verwenden den Kernel_2712

KERNEL=kernel_2712
make bcm2712_defconfig
make menuconfig


Anm.:

menuconfig ist ein Tool, das Benutzer:innen bei der Konfiguration des Linux-Kernels vor dem Erstellen unterstützt. Ein notwendiger Schritt, der zum Kompilieren des Quellcodes erforderlich ist. make menuconfig, erzeugt eine menügesteuerten Benutzeroberfläche , die es dem Benutzer ermöglicht, auszuwählen, welche Funktionen und Module kompiliert werden sollen.

Quelle: https://en.wikipedia.org/wiki/Menuconfig

Folgende Einstellungen sind vorzunehmen:

1. Kernel Features > Page Size > 4 KB (for Box86 compatibility)

2. Kernel Features > Kernel support for 32-bit EL0 > Fix up misaligned multi-word loads and stores in user space

3. Kernel Features > Fix up misaligned loads and stores from userspace for 64bit code

4. Device Drivers > Graphics support > AMD GPU (optionally SI/CIK support too)

5. Device Drivers > Graphics support > Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) > Force Architecture can write-combine memory

danach OK und Exit

Mit nachfolgendem Befehl startet die Kompilierung des Kernes

make -j6 Image.gz modules dtbs

WARTEN --- Kernel wird kompiliert

Anmerkung: auf dem Raspi 5 dauert es ca. 1 Std.

Module & AMD Grafik Firmware Installieren

Wenn die Kompilierung abgeschlossen ist müssen die Module noch installiert werden

sudo make -j6 modules_install

danach

sudo cp arch/arm64/boot/Image.gz /boot/firmware/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware
sudo cp arch/arm64/boot/dts/overlays/*.dtb /boot/firmware/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/

Jetzt noch die Grafik Firmware installieren

sudo apt install firmware-amd-graphics

Es sollte wenn alles gut geht folgende Meldung im cli erscheinen

# Install the base AMD GPU firmware
sudo apt install -y firmware-amd-graphics

Confirm everything is working by plugging a monitor into the graphics card; then confirm the card's GPU is in use by running glxinfo -B (part of the mesa-utils package), for example:
$ DISPLAY=:0 glxinfo -B
name of display: :0
display: :0 screen: 0
direct rendering: Yes
Extended renderer info (GLX_MESA_query_renderer):
Vendor: AMD (0x1002)
Device: AMD Radeon Pro W7700 (gfx1101, LLVM 15.0.6, DRM 3.54, 6.6.60-v8-AMDGPU+) (0x7470)
Version: 23.2.1
Accelerated: yes
Video memory: 15360MB
...
(Prepend DISPLAY=:0 if you're running these commands over SSH.)

jetzt noch ….NEUSTART

sudo reboot

Schauen sie mit lspci nach ob die GPU erkannt wurde.

lspci

der Eintrag sollte folgendes beinhalten:

~ $ lspci
0000:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 30)
0000:01:00.0 PCI bridge: ASMedia Technology Inc. ASM1182e 2-Port PCIe x1 Gen2 Packet Switch
0000:02:03.0 PCI bridge: ASMedia Technology Inc. ASM1182e 2-Port PCIe x1 Gen2 Packet Switch
0000:02:07.0 PCI bridge: ASMedia Technology Inc. ASM1182e 2-Port PCIe x1 Gen2 Packet Switch
0000:03:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
0000:04:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (rev e7)
0000:04:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590]
0001:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 30)
0001:01:00.0 Ethernet controller: Raspberry Pi Ltd RP1 PCIe 2.0 South Bridge

Installation Von Llama.cpp Mit Vulkanunterstützung

Quelle:

AMD Radeon PRO W7700 running on Raspberry Pi

https://www.jeffgeerling.com/blog/2024/amd-radeon-pro-w7700-running-on-raspberry-pi

zuerst müssen die Vulkan SDK zum kompilieren des llama Kernels geladen werden.

sudo apt install -y libvulkan-dev glslc cmake

Danach klonen wir llama3.2:3b und wechseln in den llama.cpp Ordner

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

Jetzt erstellen wir den llama-Kernel mit Vulkan Unterstützung

cmake -B build -DGGML_VULKAN=1
cmake --build build --config Release

Jetzt können Sie ein Modell z.B. von HuggingFace herunterladen und zu testen ob llama.cpp die GPU verwendet.

diese spechern wir im llama.cpp Ornder in den Unterordner models

cd models && wget https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF/resolve/main/Llama-3.2-3B-Instruct-Q4_K_M.gguf

Um den llama Server zu starten verwenden sie folgenden Befehl:

~/llama.cpp $ ./build/bin/llama-cli -m "models/Llama-3.2-3B-Instruct-Q4_K_M.gguf" -p "Why is the blue sky blue?" -n 50 -e -ngl 33 -t 4

ein Beispiel für den möglichen Output:

# You should see in the output, ggml_vulkan detected your GPU. For example:
# ggml_vulkan: Found 1 Vulkan devices:
# ggml_vulkan: 0 = AMD Radeon RX 6700 XT (RADV NAVI22) (radv) | uma: 0 | fp16: 1 | warp size: 64

Sie können auch die GPU-Statistik mit Tools wie nvtop oder amdgpu_top nutzen, Details dazu im Abschnitt Tools


Llama.cpp HTTP-Server + Einfache WebUI

Minimalistische Lösung, die direkt mit der Vulkan-kompilierten llama.cpp funktioniert.

Starte den integrierten HTTP-Server:

./build/bin/llama-server -m models/Llama-3.2-3B-Instruct-Q4_K_M.gguf -n 400 -e --n-gpu-layers 20 --host 127.0.0.1 --port 8000

Nutze das llama WebUI im Browser

https://localhost:8000

STOPPE den llama Server mit

~/llama.cpp $pkill -f "llama++.worker*"
~/llama.cpp $ pkill -f "llama++.server"


Hier ist noch die Erklärung des Befehls llama.cpp mit den Parametern (Quelle deepseek):

"./main -m model.gguf -n 512 --temp 0.7 --n-gpu-layers 28 -t 8 --mlock"

Bedeutung der Parameter


  1. -n 512 (Antwortlänge):
  2. Das Modell generiert bis zu 512 Token (≈ 400 Wörter).
  3. Stoppt früher, wenn ein End-of-Sequence-Token (</s>) erscheint.
  4. --temp 0.7 (Kreativität):
  5. 0.7: Ausgewogener Modus (leicht kreativ, aber fokussiert).
  6. Beispiel:
  7. --temp 0.3: Faktenbasierte Antworten (gut für Code/Mathe).
  8. --temp 1.2: Kreative Geschichten/offene Dialoge.
  9. --n-gpu-layers 28 (GPU-Beschleunigung):
  10. Beschleunigt die Berechnung der ersten 28 Schichten auf der GPU.
  11. Wichtig: Die maximale Layer-Anzahl hängt vom VRAM der GPU ab:
  12. RX 580 (8 GB): ~20–25 Layers für ein 7B-Modell.
  13. RTX 4090 (24 GB): 40+ Layers.
  14. -t 8 (CPU-Threads):
  15. Optimal, wenn die CPU 8 physische Kerne hat (z. B. Ryzen 7 5800X).
  16. Auf einem Raspberry Pi 5 (8 Kerne): -t 8 ist sinnvoll.
  17. --mlock (RAM-Optimierung):
  18. Verhindert, dass das Betriebssystem Teile des Modells auf die Festplatte auslagert.
  19. Voraussetzung: Ausreichend RAM (z. B. 16 GB für ein 7B-Modell).

Llm Benchmark Und Einstellungen

erster Test 07.02.2025 (mistral-7b-instruct-v0.1.Q4_K_M)*

'noch mit einem Geekworm X1005 Dual NVMe SSD Shield, Slot1=NVME 1TB, Slot2=PCI-E 1X to 16X VER010-X Riser Card

ENTFERNT wurde "--flash-attn 1 " war die Bremse;). nur für NVIDA GPU, Versuch nach Optimierung mit:

"--threads 4 --n-gpu-layers 31 -b 512 -pg 256,128"

./build/bin/llama-bench --model ./gguf/mistral-7b-instruct-v0.1.Q4_K_M.gguf --threads 4 --n-gpu-layers 31 -b 512 -pg 256,128
ggml_vulkan: Found 1 Vulkan devices:
ggml_vulkan: 0 = AMD Radeon RX 580 Series (RADV POLARIS10) (radv) | uma: 0 | fp16: 1 | warp size: 64 | matrix cores: none
| model | size | params | backend | ngl | n_batch | test | t/s |
| ------------------------------ | ---------: | ---------: | ---------- | --: | ------: | ------------: | -------------------: |
| llama 7B Q4_K - Medium | 4.07 GiB | 7.24 B | Vulkan | 31 | 512 | pp512 | 112.60 ± 3.52 |
| llama 7B Q4_K - Medium | 4.07 GiB | 7.24 B | Vulkan | 31 | 512 | tg128 | 12.13 ± 0.77 |
| llama 7B Q4_K - Medium | 4.07 GiB | 7.24 B | Vulkan | 31 | 512 | pp256+tg128 | 30.42 ± 0.65 |
build: 855cd073 (4658)

Important Tools

neofetch.png
nvtop.png
htop.png

Installing and Using Neofetch

sudo apt install neofetch

Startbefehl im Linux command line Terminal

neofetch

Installing and Using NVTOP

Quelle: https://github.com/Syllo/nvtop

sudo apt install nvtop

Startbefehl im Linux command line Terminal

nvtop


Install and using htop (CPU Auslastung)

Quelle: https://htop.dev/

sudo apt-get install htop

Startbefehl im Linux command line Terminal

htop


Installing and Using RadeonTOP

Quelle: https://github.com/clbr/radeontop

Build options

Build options can be specified to having the following variables being set to "1"

nls enable translations, default on
debug enable debug symbols, default off
nostrip disable stripping, default off
plain apply neither gcc's -g nor -s.
xcb enable libxcb to run unprivileged in Xorg, default on
amdgpu enable amdgpu usage reporting, default auto (requires libdrm >= 2.4.63)


Example:

make amdgpu=1 xcb=1

This will build radeontop with amdgpu reporting and xcb support.

Updates

GeeekPi N07.jpg

update 2025.02.09

das Geekworm X1005 Dual NVMe SSD Shield könnte der Flaschenhals sein, unterstützt nur Gen2, werde einen Versuch mit dem GeeekPi N07 M.2 PCIe to NVMe HAT unternehmen, ein booten ist dann nur noch über den sd slot oder USB 3.0 Port möglich.

update 2025.02.12

der GeeekPi N07 M.2 PCIe to NVMe (Single) HAT brachte keine Verbesserung der t/s Leistung, der PCIe Bus ist es also auch nicht. Der GeeekPi N07 sollte eigentlich den PCIe Bus zur MZHOU PCI-E 1X to 16X Riser nur durchschleifen und das mit PCIe3.0 Geschwindigkeit.

Nach stundenlangen Chats mit ChatGPT und Deepseek brachte der Eintrag in der amdgpu.conf starke Verbesserungen :

echo "options amdgpu gttsize=8192" | sudo tee /etc/modprobe.d/amdgpu.conf
sudo update-initramfs -u
sudo reboot

Und noch die GPU-Power-Tweaks aktiviert:

echo "options amdgpu ppfeaturemask=0xffffffff" | sudo tee /etc/modprobe.d/amdgpu.conf
sudo update-initramfs -u
sudo reboot

Benchmark-Ergebnisse:

TestGeschwindigkeit (Tokens/Sekunde)

pp512 - 145.47 t/s | tg128 - 23.52 t/s | pp256+tg128 - 51.06 t/s

./build/bin/llama-bench --model ./gguf/mistral-7b-instruct-v0.1.Q4_K_M.gguf -b 512 --threads 4 --n-gpu-layers 64 -pg 256,128 ggml_vulkan: Found 1 Vulkan devices: ggml_vulkan: 0 = AMD Radeon RX 580 Series (RADV POLARIS10) (radv) | uma: 0 | fp16: 1 | warp size: 64 | shared memory: 65536 | matrix cores: none | model | size | params | backend | ngl | n_batch | test | t/s | | ------------------------------ | ---------: | ---------: | ---------- | --: | ------: | ------------: | -------------------: | | llama 7B Q4_K - Medium | 4.07 GiB | 7.24 B | Vulkan | 64 | 512 | pp512 | 144.57 ± 0.68 | | llama 7B Q4_K - Medium | 4.07 GiB | 7.24 B | Vulkan | 64 | 512 | tg128 | 23.45 ± 0.16 | | llama 7B Q4_K - Medium | 4.07 GiB | 7.24 B | Vulkan | 64 | 512 | pp256+tg128 | 50.64 ± 0.62 | build: 507f9174 (4684)

nächste Schritte:

Sobald erhältlich der "Seeed Studio PCIe 3.0 to Dual M.2 HAT+".

Quelle:https://www.cnx-software.com/2025/01/21/pcie3-0-to-dual-m-2-hat-for-raspberry-pi-5-features-asmedia-asm2806-pcie-3-0-switch/

(Spezifikationen: Unterstützte SBCs – Raspberry Pi 5 und möglicherweise andere SBCs mit einem PCIe FFC-Anschluss wie das Kakip-Board.

2x M.2 M-PCIe-Steckplätze mit PCIe 3.0 x1, die M.2 2230-, 2242-, 2260-, 2280-Module unterstützen (SSD, KI-Beschleuniger usw.)

PCIe-Switch – ASMedia ASM2806 PCIe 3.0-Switch-Chip mit PCIe Gen3 x2 Upstream (hier nur x1 verwendet) und vier PCIe 3.1-Lanes Downstream (hier nur zwei verwendet) für 8GT/s kombinierte Bandbreite