# KI-Server

PING hat 2025 einen KI-Server angeschafft. Er heißt **cogito.ping.de** und befindet sich im Rechnerraum des Gebäudes in der Joseph-von-Fraunhofer-Straße. <span class="anchor" id="bkmrk-"></span><span class="anchor" id="bkmrk--1"></span>

## Technische Daten

<span class="anchor" id="bkmrk--3"></span>

- CPU AMD Threadripper Pro 5955WX 16 cores 32 threads 4.5Ghz, Zen 3, 64MB L3, 128 PCIe 4.0 lanes <span class="anchor" id="bkmrk--4"></span>
- Mainboard Asus Pro WS WRX80E Sage SE Wifi (7x PCIe 4.0 x16, 8x DDR4 DIMM, 3x M.2, …) <span class="anchor" id="bkmrk--5"></span>
- 2x RAM Corsair Dominator Platinum RGB White UDIMM 64GB **Kit** DDR4-3600 CL18-19-19-39 (128GB gesamt) <span class="anchor" id="bkmrk--6"></span>
- GPU NVIDIA [GeForce](https://techdoc.ping.de/GeForce) RTX 3090 Founders Edition 24 GB <span class="anchor" id="bkmrk--7"></span>
- GPU Zotac Gaming [GeForce](https://techdoc.ping.de/GeForce) RTX 3090 Trinity OC 24 GB mit Noctua Lüftern <span class="anchor" id="bkmrk--8"></span>
- Fractal Design Define 7 XL Black TG Dark Tint schallgedämmt Big-Tower (12 PCI Steckplätze) <span class="anchor" id="bkmrk--9"></span>
- Enermax [LiqTech](https://techdoc.ping.de/LiqTech) TR4 II 280 CPU-Wasserkühlung <span class="anchor" id="bkmrk--10"></span>
- Antec Neo Eco Gold Modular NE1300G m 1300W ATX 3.0 Netzteil <span class="anchor" id="bkmrk--11"></span>
- 4x SSD Lexar NM790 1TB M.2 NVMe PCIe 4.0 in Asus Hyper M.2 X16 Gen 4 Card (RAID 0) <span class="anchor" id="bkmrk--12"></span>
- SSD Samsung PM951 512GB M.2 NVMe (boot) <span class="anchor" id="bkmrk--13"></span>
- SSD Samsung EVO 850 500GB S-ATA <span class="anchor" id="bkmrk--14"></span>
- 4x Noctua NF-P12 redux-1700 PWM 120mm Lüfter <span class="anchor" id="bkmrk--15"></span><span class="anchor" id="bkmrk--16"></span>

siehe auch [https://geizhals.de/wishlists/3870524](https://geizhals.de/wishlists/3870524) <span class="anchor" id="bkmrk--17"></span><span class="anchor" id="bkmrk--18"></span>

Zu dem Mainboard gehört auch eine PCIe 4.0 x16 Karte um vier PCIe 4.0 x4 NVMe SSDs anzuschließen. Dort befinden sich die 4 Lexar SSDs. <span class="anchor" id="bkmrk--19"></span><span class="anchor" id="bkmrk--20"></span>

Durch die 2 GPUs stehen derzeit 48GB schnelles VRAM zur Verfügung, eine Erweiterung ist möglich. Ins Gehäuse passen maximal fünf 2-slot GPUs. <span class="anchor" id="bkmrk--21"></span><span class="anchor" id="bkmrk--22"></span>

Der Hauptspeicher ist auf acht 16GB-Module verteilt und nutzt so die 8 Speicherkanäle der AMD Threadripper Pro Architektur. <span class="anchor" id="bkmrk--23"></span><span class="anchor" id="bkmrk--24"></span>

Der Platz im Gehäuse und das Mainboard mit vielen PCIe-Lanes ermöglichen es uns, bei Bedarf noch mehr GPUs einzubauen.

## Software

<span class="anchor" id="bkmrk--26"></span>

Auf dem Rechner läuft derzeit Ubuntu 24.04 LTS. <span class="anchor" id="bkmrk--27"></span><span class="anchor" id="bkmrk--28"></span>

Das Konzept sieht vor, die Dienste als Docker Container laufen zu lassen. Die compose Dateien liegen in Unterverzeichnissen unter `/opt`. <span class="anchor" id="bkmrk--29"></span><span class="anchor" id="bkmrk--30"></span>

Mit `nvtop` kann der Status der GPUs angezeigt werden. <span class="anchor" id="bkmrk--31"></span><span class="anchor" id="bkmrk--32"></span>

Über das Script `/usr/local/bin/set-gpu-power.sh` sind die GPUs aktuell auf 280W gedrosselt. Das führt zu nur sehr geringen Leistungseinbußen. <span class="anchor" id="bkmrk--33"></span><span class="anchor" id="bkmrk--34"></span>

## Storage

<span class="anchor" id="bkmrk--36"></span>

Die 4 Lexar NMVe SSDs bilden ein RAID0 das unter `/opt` eingehängt ist. Dadurch können große LLMs schnell in den Speicher geladen werden. <span class="anchor" id="bkmrk--37"></span><span class="anchor" id="bkmrk--38"></span>

Die S-ATA SSD ist unter `/var/local` eingehängt. <span class="anchor" id="bkmrk--39"></span><span class="anchor" id="bkmrk--40"></span>

Die PM951 NVMe SSD dient als Bootlaufwerk und enthält auch das OS. <span class="anchor" id="bkmrk--41"></span><span class="anchor" id="bkmrk--42"></span>

<span class="anchor" id="bkmrk--44"></span><span class="anchor" id="bkmrk--45"></span><span class="anchor" id="bkmrk--46"></span><span class="anchor" id="bkmrk--47"></span><span class="anchor" id="bkmrk--48"></span><span class="anchor" id="bkmrk--49"></span><span class="anchor" id="bkmrk--50"></span><span class="anchor" id="bkmrk--51"></span><span class="anchor" id="bkmrk--52"></span><span class="anchor" id="bkmrk--53"></span><span class="anchor" id="bkmrk--54"></span><span class="anchor" id="bkmrk--55"></span><span class="anchor" id="bkmrk--56"></span><span class="anchor" id="bkmrk--57"></span><span class="anchor" id="bkmrk--58"></span><span class="anchor" id="bkmrk--59"></span><span class="anchor" id="bkmrk--60"></span><span class="anchor" id="bkmrk--61"></span><span class="anchor" id="bkmrk--62"></span><span class="anchor" id="bkmrk--63"></span><span class="anchor" id="bkmrk--64"></span><span class="anchor" id="bkmrk--65"></span><span class="anchor" id="bkmrk--66"></span><span class="anchor" id="bkmrk--67"></span><span class="anchor" id="bkmrk--68"></span><span class="anchor" id="bkmrk--69"></span><span class="anchor" id="bkmrk--70"></span><span class="anchor" id="bkmrk--71"></span><span class="anchor" id="bkmrk--72"></span><span class="anchor" id="bkmrk--73"></span><span class="anchor" id="bkmrk--74"></span><span class="anchor" id="bkmrk--75"></span><span class="anchor" id="bkmrk--76"></span><span class="anchor" id="bkmrk--77"></span><span class="anchor" id="bkmrk--78"></span><span class="anchor" id="bkmrk--79"></span><span class="anchor" id="bkmrk--80"></span>

```
$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda                         8:0    0 465.8G  0 disk
└─sda1                      8:1    0 465.8G  0 part  /var/local
nvme0n1                   259:0    0 953.9G  0 disk
└─md0                       9:0    0   3.7T  0 raid0 /opt
nvme1n1                   259:1    0 953.9G  0 disk
└─md0                       9:0    0   3.7T  0 raid0 /opt
nvme3n1                   259:2    0 953.9G  0 disk
└─md0                       9:0    0   3.7T  0 raid0 /opt
nvme2n1                   259:3    0 953.9G  0 disk
└─md0                       9:0    0   3.7T  0 raid0 /opt
nvme4n1                   259:8    0 476.9G  0 disk
├─nvme4n1p1               259:9    0     1G  0 part  /boot/efi
├─nvme4n1p2               259:10   0     2G  0 part  /boot
└─nvme4n1p3               259:11   0 473.9G  0 part
  └─ubuntu--vg-ubuntu--lv 252:0    0   445G  0 lvm   /

$ blkid
/dev/nvme0n1: UUID="ebe75b1c-af8f-5e3a-aa0f-9464c3951451" UUID_SUB="1d5de863-0634-7dd3-0e97-7dec7f076aea" LABEL="cogito:0" TYPE="linux_raid_member"
/dev/nvme3n1: UUID="ebe75b1c-af8f-5e3a-aa0f-9464c3951451" UUID_SUB="440d89df-a9d1-bfc9-3634-e57bd579023e" LABEL="cogito:0" TYPE="linux_raid_member"
/dev/md0: LABEL="RAID" UUID="f57d1a53-8b0c-4119-a02b-e06632c7933d" BLOCK_SIZE="4096" TYPE="ext4"
/dev/nvme2n1: UUID="ebe75b1c-af8f-5e3a-aa0f-9464c3951451" UUID_SUB="eb15293d-d63b-c940-841d-a918a0ea0cba" LABEL="cogito:0" TYPE="linux_raid_member"
/dev/mapper/ubuntu--vg-ubuntu--lv: UUID="98bd9894-3827-42bb-a0f4-d92931530cab" BLOCK_SIZE="4096" TYPE="ext4"
/dev/nvme1n1: UUID="ebe75b1c-af8f-5e3a-aa0f-9464c3951451" UUID_SUB="797f9137-3a34-2689-5d0b-a294ee05c9e4" LABEL="cogito:0" TYPE="linux_raid_member"
/dev/sda1: LABEL="ssd500" UUID="c57d324d-3c4f-4f5d-90ca-3859ca87f550" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="ssd500" PARTUUID="48cd0c6a-827f-4882-ad1a-74e38e473d6b"
/dev/nvme4n1p3: UUID="XbVKNc-zwqt-qe2c-fj2e-8MRA-p8e0-XDQdsz" TYPE="LVM2_member" PARTUUID="5f6534ab-7909-40c3-b0b3-4865c7f90e5b"
/dev/nvme4n1p1: UUID="7006-F657" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="f57a2cbc-da3a-4322-8921-42b86e1fc564"
/dev/nvme4n1p2: UUID="8256bdab-088d-437e-a82b-b94470729f4c" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="6a4a7fc5-0f1a-4c23-8591-414239e1ebd8"

$ cat /proc/mdstat
Personalities : [raid0] [linear] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid0 nvme3n1[3] nvme2n1[2] nvme0n1[0] nvme1n1[1]
      4000288768 blocks super 1.2 512k chunks

unused devices: <none>
```

<span class="anchor" id="bkmrk--82"></span>

### vLLM mit Open-WebUI

Für Inferenz läuft i.d.R ein vLLM Server. Als WebUI gibt es dafür ein [open-webui](https://docs.openwebui.com/).

Für das Umwandeln von Office Dokumenten (zum Beispiel ODT) läuft Apache Tika.

Das Docker compose file liegt unter `/opt/vllm/`

Auf milla.ping.de (aka buero) läuft ein nginx der open-webui unter [https://ki.ping.de](https://buero.ping.de) erreichbar macht. Für den Login nutzt bitte unser [Single Sign-On](https://techdoc.ping.de/Anleitungen/Single%20Sign-On).

Der vLLM bietet auch direk auf Port 8000 unter [https://ki.ping.de:8000/v1](https://ki.ping.de:8000/v1) eine OpenAI-kompatible API. Ihr benötigt das Bearer Token, ihr erhaltet es unter [https://ki.ping.de:9443/protected/](https://ki.ping.de:9443/protected/).

### Ollama mit Open-WebUI

<span class="anchor" id="bkmrk--84"></span>

Alternativ können wir den [Ollama](https://ollama.com/) Server starten. Der ist aber nicht mehr der bevorzugte Dienst, u.a. weil die Performance mit mehreren Usern schlecht ist.<span class="anchor" id="bkmrk--87"></span>

Das Docker compose file liegt unter `/opt/ollama/` <span class="anchor" id="bkmrk--89"></span><span class="anchor" id="bkmrk--90"></span>

Beim Einsatz von Ollama erscheint im Model-Selektor von Open-WebUI ein grüner Punkt neben den LLMs, die derzeit im GPU Speicher sind. <span class="anchor" id="bkmrk--93"></span><span class="anchor" id="bkmrk--94"></span>

Das Script `/usr/local/bin/ollama-nogpu.sh` ist dafür da, den Ollama Container neu zu starten, falls dieser mal wieder die GPUs nicht erkennt. <span class="anchor" id="bkmrk--97"></span><span class="anchor" id="bkmrk--98"></span>

## ComfyUI

<span class="anchor" id="bkmrk--100"></span>

[ComfyUI](https://www.comfy.org/) (primär für KI-Bildergenerierung) ist noch nicht fertig installiert, es liegt unter `/opt/comfyui` und kann bei Bedarf gestartet werden. Vorher sollte ollama gestoppt werden, weil nicht genügend GPU VRAM für beide Dienste gleichzeitig vorhanden ist.