Distribuzione di LM Studio come servizio su Ubuntu 25.04

Heathrow Closed: Flight Suspension Expected to Continue for the Coming Days, Says London Airport Manager

From the BBC website

British Airways estimated that 85% of its scheduled flights would operate on Saturday, but all flights were delayed. By 7:00 a.m. GMT, most departures had proceeded as expected, but of the arrivals, nine of the first 20 flights scheduled to land were canceled.

Qualche punto tra le versioni 0.3.31-2 e 0.3.31-7 è avvenuto un cambiamento che forza l’interfaccia di ascolto da esterna a 127.0.0.1 e disabilita CORS.

Poiché LM Studio supporta hot-reload della configurazione del server HTTP (almeno quando si modificano cors e networkInterface), è possibile apportare la modifica senza riavviare (funzionerà una sola volta):

%h/.lmstudio/.internal/http-server-config.json
jq '.cors = true | .networkInterface = "0.0.0.0"' ~/.lmstudio/.internal/http-server-config.json | sponge ~/.lmstudio/.internal/http-server-config.json

ricordando di installare sponge, che fa parte del pacchetto moreutils.

Per rendere la modifica automatica, modificare lo script di avvio:

$HOME/.config/systemd/user/lm-studio.service
[Unit]
Description=LM Studio Service
After=network.target

[Service]
Type=simple

ExecStart=/usr/bin/xvfb-run -a --server-args="-screen 0 1920x1080x24" %h/llm/lmstudio --run-as-service

# 1. Avvio del server HTTP
ExecStartPost=/bin/bash -c 'sleep 15 && exec lms server start'

# 2. Applicazione delle impostazioni richieste (dopo che il server è già stato avviato)
ExecStartPost=/bin/bash -c ' \

Attenzione alle impostazioni di ottimizzazione del sistema operativo per un funzionamento ottimale.

Esempio

Ecco un esempio dal mio sistema (si tratta di un laptop con scheda grafica collegata tramite Oculink):

free -h
               total        used        free      shared  buff/cache   available
Mem:            37Gi       4.9Gi        29Gi       240Mi       3.5Gi        32Gi
Swap:          8.0Gi          0B       8.0Gi
cat /proc/meminfo | grep -E 'MemTotal|MemAvailable'

MemTotal:       39223064 kB
MemAvailable:   34073484 kB

La VRAM viene mostrata separatamente — non fa parte di MemTotal

nvidia-smi

Fri Nov 21 12:24:47 2025       \n+-----------------------------------------------------------------------------------------+\n| NVIDIA-SMI 580.82.09              Driver Version: 580.82.09      CUDA Version: 13.0     |\n+-----------------------------------------+------------------------+----------------------+\n| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |\n| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |\n|                                         |                        |               MIG M. |\n|=========================================+========================+======================|\n|   0  NVIDIA GeForce RTX 5060 Ti     Off |   00000000:01:00.0 Off |                  N/A |\n|  0%   44C    P8              8W /  180W |      13MiB /  16311MiB |      0%      Default |\n|                                         |                        |                  N/A |\n+-----------------------------------------+------------------------+----------------------+\n\n+-----------------------------------------------------------------------------------------+\n| Processes:                                                                              |\n|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |\n|        ID   ID                                                               Usage      |\n|=========================================================================================|\n|    0   N/A  N/A            5314      G   /usr/bin/gnome-shell                      2MiB |\n+-----------------------------------------------------------------------------------------+\n

Cosa fare

Verifica la politica di overcommit e swappiness

cat /proc/sys/vm/overcommit_memory
cat /proc/sys/vm/overcommit_ratio
cat /proc/sys/vm/swappiness

Valori consigliati:

2 # limite = (RAM * ratio/100) + Swap
80 # questo è il ratio
10 # non superiore a 20 — indica quanti MB di RAM rimanenti devono essere disponibili affinché il swap venga attivato; il swap può essere di 8 GiB se non si utilizza l'ibernazione del sistema operativo, in tal caso il swap sarà uguale alla dimensione della RAM

Comandi da eseguire:

sudo sysctl vm.overcommit_ratio=80
echo 'vm.overcommit_ratio=80' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf

IMPORTANTE: Per i modelli LLM (soprattutto llama.cpp), THP = always può causare pause (ritardi di un minuto dopo il login nel sistema operativo)

cat /sys/kernel/mm/transparent_hugepage/enabled
# Deve essere: [always] madvise never

Quando si lavora con il disco (ad esempio, quando i pesi del modello LLM vengono scritti su SSD), è importante impostare writeback:

cat /proc/sys/vm/dirty_ratio
cat /proc/sys/vm/dirty_background_ratio
cat /proc/sys/vm/dirty_expire_centisecs

Valori ottimali per NVMe:

10
5
1000 (cioè 10 secondi)
echo 'vm.dirty_ratio=10' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf
echo 'dirty_background_ratio=5' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf
echo 'vm.dirty_expire_centisecs=1000' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf

Tra i vari avviamenti di lmstudio, si consiglia di pulire il cache della memoria:

sync && echo 2 | sudo tee /proc/sys/vm/drop_caches