Utilizzare un vecchio cellulare come SERVER AI

Ecco una guida completa per trasformare il tuo Samsung Galaxy Note 9 in un vero server AI locale con Qwen.


⚠️ Prima cosa: realtà sull’hardware del Note 9

Il Note 9 ha Snapdragon 845 (o Exynos 9810 in Europa), con 6 GB o 8 GB di RAM. Questo significa che puoi girare modelli piccoli e quantizzati (0.6B, 1.7B, max 4B) con prestazioni limitate ma funzionali. Non aspettarti GPT-4, ma per un server AI personale offline funziona.


🛠️ Metodo 1 — Ollama + Termux (più semplice)

1. Installa Termux

La versione di Termux sul Google Play Store è obsoleta — scaricala da F-Droid o direttamente da GitHub (github.com/termux/termux-app/releases).

2. Aggiorna Termux e installa Ollama

pkg update && pkg upgrade -y
pkg install ollama

3. Avvia il server Ollama in background

# In una sessione Termux
ollama serve &

4. Scarica Qwen3 (modelli consigliati per 6/8 GB RAM)

Puoi scegliere la dimensione più adatta: ollama run qwen3:0.6b oppure ollama run qwen3:1.7b

ollama pull qwen3:0.6b    # ~400 MB — veloce
ollama pull qwen3:1.7b    # ~1.1 GB — migliore qualità

Con 8 GB di RAM puoi osare anche il qwen3:4b (~2.5 GB).

5. Ollama è già un server OpenAI-compatibile

Ollama espone automaticamente http://localhost:11434 con endpoint compatibili con OpenAI. Puoi testarlo con:

curl http://localhost:11434/v1/chat/completions 
  -H "Content-Type: application/json" 
  -d '{"model":"qwen3:1.7b","messages":[{"role":"user","content":"Ciao!"}]}'

🛠️ Metodo 2 — llama.cpp diretto (più controllo)

Se vuoi più controllo o usare Qwen3.5:

pkg update && pkg upgrade -y
pkg install git cmake clang
# Clona llama.cpp
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build
cmake --build build --config Release -j4
# Scarica il modello GGUF da HuggingFace
pkg install wget
wget https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/resolve/main/qwen3-1.7b-q4_k_m.gguf

Avvia come server HTTP (API OpenAI-compatibile):

./build/bin/llama-server 
  -m qwen3-1.7b-q4_k_m.gguf 
  --port 8080 
  --ctx-size 4096 
  --host 0.0.0.0

Avviando il server con --host 0.0.0.0, potrai accedere alle sue capacità AI non solo dal telefono stesso ma anche da altri dispositivi sulla stessa rete, come altri app o terminali.


🌐 Renderlo accessibile dalla rete locale

Una volta avviato il server, qualsiasi device sulla stessa Wi-Fi può usarlo come backend AI:

http://IP_DEL_NOTE9:8080/v1/chat/completions

Puoi trovare l’IP del telefono con:

ip addr show wlan0

💡 Trucchi importanti per Android

  • Disabilita l’ottimizzazione batteria per Termux nelle impostazioni Android, altrimenti il processo viene killato
  • Disabilita le restrizioni “phantom process” nelle opzioni sviluppatore del telefono
  • Usa una microSD veloce per salvare i modelli (il Note 9 supporta fino a 1 TB)
  • Tieni il telefono in carica durante l’uso intensivo
  • Con 6 GB di RAM, chiudi tutte le altre app prima di avviare il server

📊 Aspettative realistiche

Modello RAM usata Token/sec (CPU) Qualità
Qwen3-0.6B ~1 GB 8-15 t/s base
Qwen3-1.7B ~2 GB 4-8 t/s buona
Qwen3-4B ~4 GB 2-4 t/s ottima

Per Qwen3.5 (il più recente), il modello da 2B è così compresso da poter girare su smartphone, mentre le varianti più grandi richiedono hardware più potente.

#!/data/data/com.termux/files/usr/bin/bash
# ╔══════════════════════════════════════════════════════╗
# ║ NOTE 9 AI SERVER — INSTALLER v1.0 ║
# ║ by Claude • Qwen3 su Termux + llama.cpp ║
# ╚══════════════════════════════════════════════════════╝

# ─── Colori ───────────────────────────────────────────
RED=’33[0;31m’
GREEN=’33[0;32m’
YELLOW=’33[1;33m’
CYAN=’33[0;36m’
BOLD=’33[1m’
RESET=’33[0m’

# ─── Variabili configurabili ──────────────────────────
SERVER_PORT=8080
MODEL_DIR=”$HOME/ai_models”
LOG_FILE=”$HOME/ai_server.log”
SERVICE_SCRIPT=”$HOME/start_ai_server.sh”

# ─── Funzioni di stampa ───────────────────────────────
print_banner() {
echo -e “${CYAN}”
echo ” ╔══════════════════════════════════════╗”
echo ” ║ 📱 NOTE 9 — AI SERVER INSTALLER ║”
echo ” ║ Qwen3 • llama.cpp • API ║”
echo ” ╚══════════════════════════════════════╝”
echo -e “${RESET}”
}

step() { echo -e “n${CYAN}${BOLD}[STEP $1]${RESET} $2”; }
ok() { echo -e “${GREEN} ✔ $1${RESET}”; }
warn() { echo -e “${YELLOW} ⚠ $1${RESET}”; }
err() { echo -e “${RED} ✗ $1${RESET}”; }
info() { echo -e ” → $1″; }

# ─── Selezione modello ────────────────────────────────
choose_model() {
echo -e “n${BOLD}Scegli il modello Qwen3 da installare:${RESET}”
echo “”
echo ” [1] Qwen3-0.6B (~400 MB) — Leggero, veloce, RAM < 2 GB”
echo ” [2] Qwen3-1.7B (~1.1 GB) — Bilanciato ★ Consigliato per Note 9″
echo ” [3] Qwen3-4B (~2.5 GB) — Ottima qualità, serve 8 GB RAM”
echo ” [4] Qwen3-8B (~5.0 GB) — Solo con RAM ≥ 8 GB + storage libero”
echo “”
read -p ” Scelta [1-4] (default: 2): ” MODEL_CHOICE
MODEL_CHOICE=${MODEL_CHOICE:-2}

case $MODEL_CHOICE in
1)
MODEL_SIZE=”0.6b”
MODEL_FILE=”qwen3-0.6b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-0.6B-GGUF/resolve/main/qwen3-0.6b-q4_k_m.gguf”
;;
2)
MODEL_SIZE=”1.7b”
MODEL_FILE=”qwen3-1.7b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/resolve/main/qwen3-1.7b-q4_k_m.gguf”
;;
3)
MODEL_SIZE=”4b”
MODEL_FILE=”qwen3-4b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-4B-GGUF/resolve/main/qwen3-4b-q4_k_m.gguf”
;;
4)
MODEL_SIZE=”8b”
MODEL_FILE=”qwen3-8b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-8B-GGUF/resolve/main/qwen3-8b-q4_k_m.gguf”
;;
*)
warn “Scelta non valida. Uso modello 1.7B di default.”
MODEL_SIZE=”1.7b”
MODEL_FILE=”qwen3-1.7b-q4_k_m.gguf”
MODEL_URL=”https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/resolve/main/qwen3-1.7b-q4_k_m.gguf”
;;
esac

ok “Modello selezionato: Qwen3-${MODEL_SIZE}”
}

# ─── Controllo RAM disponibile ────────────────────────
check_ram() {
TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo | awk ‘{print $2}’)
TOTAL_RAM_GB=$(echo “scale=1; $TOTAL_RAM_KB / 1024 / 1024” | bc)
FREE_RAM_KB=$(grep MemAvailable /proc/meminfo | awk ‘{print $2}’)
FREE_RAM_GB=$(echo “scale=1; $FREE_RAM_KB / 1024 / 1024” | bc)

info “RAM totale: ${TOTAL_RAM_GB} GB | RAM libera: ${FREE_RAM_GB} GB”

if [ “$TOTAL_RAM_KB” -lt 4000000 ]; then
warn “Meno di 4 GB RAM! Il modello 0.6B è l’unica opzione sicura.”
fi
}

# ─── Controllo storage ────────────────────────────────
check_storage() {
FREE_STORAGE=$(df -h “$HOME” | awk ‘NR==2{print $4}’)
info “Storage libero in HOME: $FREE_STORAGE”
}

# ─── Step 1: Aggiornamento pacchetti ──────────────────
step 1 “Aggiornamento repository Termux…”
pkg update -y 2>&1 | tail -3
pkg upgrade -y 2>&1 | tail -3
ok “Repository aggiornato”

# ─── Step 2: Dipendenze base ──────────────────────────
step 2 “Installazione dipendenze (git, cmake, clang, wget, bc)…”
pkg install -y git cmake clang wget bc make 2>&1 | tail -5
ok “Dipendenze installate”

# ─── Step 3: Info sistema ─────────────────────────────
step 3 “Analisi hardware del dispositivo…”
check_ram
check_storage
CPU_CORES=$(nproc)
info “Core CPU disponibili: $CPU_CORES”

# ─── Step 4: Scelta modello ───────────────────────────
step 4 “Selezione modello AI…”
choose_model

# ─── Step 5: Compilazione llama.cpp ───────────────────
step 5 “Download e compilazione llama.cpp…”

if [ -d “$HOME/llama.cpp” ]; then
warn “Cartella llama.cpp già esistente. Aggiornamento…”
cd “$HOME/llama.cpp” && git pull 2>&1 | tail -3
else
info “Clonazione repository llama.cpp…”
git clone https://github.com/ggml-org/llama.cpp “$HOME/llama.cpp” 2>&1 | tail -5
fi

cd “$HOME/llama.cpp”

info “Compilazione in corso (può richiedere 5-10 minuti)…”
cmake -B build -DLLAMA_CURL=OFF 2>&1 | tail -3
cmake –build build –config Release -j”$CPU_CORES” 2>&1 | tail -5

if [ -f “$HOME/llama.cpp/build/bin/llama-server” ]; then
ok “llama.cpp compilato con successo!”
else
err “Compilazione fallita. Controlla il log.”
exit 1
fi

# ─── Step 6: Download modello ─────────────────────────
step 6 “Download modello Qwen3-${MODEL_SIZE}…”

mkdir -p “$MODEL_DIR”
MODEL_PATH=”$MODEL_DIR/$MODEL_FILE”

if [ -f “$MODEL_PATH” ]; then
ok “Modello già presente: $MODEL_PATH”
else
info “Download da HuggingFace… (potrebbe volerci del tempo)”
wget -q –show-progress -O “$MODEL_PATH” “$MODEL_URL”

if [ $? -eq 0 ]; then
ok “Modello scaricato: $MODEL_PATH”
else
err “Download fallito! Verifica connessione internet.”
rm -f “$MODEL_PATH”
exit 1
fi
fi

# ─── Step 7: Generazione script di avvio ──────────────
step 7 “Creazione script di avvio server…”

cat > “$SERVICE_SCRIPT” << STARTSCRIPT
#!/data/data/com.termux/files/usr/bin/bash
# ─── AI SERVER AVVIO RAPIDO ───────────────────────────

MODEL_PATH=”$MODEL_PATH”
SERVER_BIN=”$HOME/llama.cpp/build/bin/llama-server”
PORT=$SERVER_PORT
LOG=”$LOG_FILE”

echo “🤖 Avvio AI Server su porta $PORT…”
echo ” Modello: $(basename $MODEL_PATH)”
echo ” Endpoint: http://$(ip route get 1 | awk ‘{print $7; exit}’):$PORT”
echo ” API: http://localhost:$PORT/v1/chat/completions”
echo “”
echo ” Premi CTRL+C per fermare il server”
echo “”

$SERVER_BIN
–model “$MODEL_PATH”
–port “$PORT”
–host 0.0.0.0
–ctx-size 4096
–n-predict 512
–threads $(nproc)
–log-file “$LOG”
-ngl 0

STARTSCRIPT

chmod +x “$SERVICE_SCRIPT”
ok “Script di avvio creato: $SERVICE_SCRIPT”

# ─── Step 8: Script di test ───────────────────────────
step 8 “Creazione script di test API…”

cat > “$HOME/test_ai.sh” << ‘TESTSCRIPT’
#!/data/data/com.termux/files/usr/bin/bash
PORT=8080
echo “🧪 Test chiamata API al server locale…”
curl -s http://localhost:$PORT/v1/chat/completions
-H “Content-Type: application/json”
-d ‘{
“model”: “qwen3”,
“messages”: [{“role”:”user”,”content”:”Rispondi in italiano: chi sei e cosa puoi fare?”}],
“max_tokens”: 200
}’ | python3 -c ”
import sys, json
try:
data = json.load(sys.stdin)
msg = data[‘choices’][0][‘message’][‘content’] print(‘n✅ Risposta AI:n’)
print(msg)
except Exception as e:
print(‘❌ Errore:’, e)
print(‘Raw:’, sys.stdin.read())

TESTSCRIPT

chmod +x “$HOME/test_ai.sh”
ok “Script di test creato: ~/test_ai.sh”

# ─── Step 9: Alias utili ──────────────────────────────
step 9 “Configurazione alias rapidi in ~/.bashrc…”

grep -q “# AI Server aliases” “$HOME/.bashrc” 2>/dev/null || cat >> “$HOME/.bashrc” << ‘ALIASES’

# AI Server aliases
alias ai-start=’bash ~/start_ai_server.sh’
alias ai-test=’bash ~/test_ai.sh’
alias ai-log=’tail -f ~/ai_server.log’
alias ai-ip=’ip route get 1 | awk “{print $7; exit}”‘
ALIASES

ok “Alias aggiunti: ai-start, ai-test, ai-log, ai-ip”

# ─── Riepilogo finale ─────────────────────────────────
echo “”
echo -e “${GREEN}${BOLD}”
echo ” ╔═══════════════════════════════════════════╗”
echo ” ║ ✅ INSTALLAZIONE COMPLETATA! ║”
echo ” ╚═══════════════════════════════════════════╝”
echo -e “${RESET}”
echo “”
echo -e ” ${BOLD}COMANDI DISPONIBILI:${RESET}”
echo “”
echo -e ” ${CYAN}ai-start${RESET} → Avvia il server AI”
echo -e ” ${CYAN}ai-test${RESET} → Testa che il server risponda”
echo -e ” ${CYAN}ai-log${RESET} → Mostra i log in tempo reale”
echo -e ” ${CYAN}ai-ip${RESET} → Mostra l’IP del telefono”
echo “”
echo -e ” ${BOLD}ENDPOINT API (OpenAI-compatibile):${RESET}”
echo -e ” ${YELLOW}http://localhost:$SERVER_PORT/v1/chat/completions${RESET}”
echo -e ” ${YELLOW}http://$(ip route get 1 2>/dev/null | awk ‘{print $7; exit}’ || echo ‘IP_TELEFONO’):$SERVER_PORT/v1/chat/completions${RESET}”
echo “”
echo -e ” ${BOLD}AVVIO RAPIDO:${RESET}”
echo -e ” ${GREEN}source ~/.bashrc && ai-start${RESET}”
echo “”
echo -e ” ${BOLD}⚠ IMPORTANTE:${RESET}”
echo -e ” Vai in Impostazioni Android → App → Termux”
echo -e ” → Batteria → disabilita ‘Ottimizzazione batteria’”
echo “”

Ecco i due file creati:

note9_ai_server_install.sh — Lo script bash completo che fa tutto automaticamente:

  • Aggiorna i pacchetti Termux
  • Installa tutte le dipendenze (git, cmake, clang, ecc.)
  • Controlla la RAM disponibile
  • Ti fa scegliere il modello Qwen3 (0.6B / 1.7B / 4B / 8B)
  • Compila llama.cpp direttamente sul telefono
  • Scarica il modello da HuggingFace
  • Crea start_ai_server.sh e test_ai.sh
  • Aggiunge gli alias ai-start, ai-test, ai-log, ai-ip

 

Come usarlo sul Note 9:

  1. Copia lo script .sh sul telefono via USB o cloud
  2. Apri Termux (da F-Droid, non Play Store!)
  3. Esegui:

bash

   bash /sdcard/Download/note9_ai_server_install.sh
  1. Segui le istruzioni a schermo (~10-15 min per la compilazione)
  2. Poi basta digitare ai-start per avviare il server ogni volta

Guida interattiva da aprire nel browser del Note 9, con tutti i comandi da copiare con un tap.

🤖

Note 9 AI Server

Qwen3 • llama.cpp • OpenAI API

Installa Termux da F-Droid per iniziare

① Scegli il modello ⚡ Qwen3-0.6B ~400 MB · 8-15 token/sec · RAM min 2 GB Veloce ⭐ Qwen3-1.7B ~1.1 GB · 4-8 token/sec · RAM min 3 GB Consigliato 🔥 Qwen3-4B ~2.5 GB · 2-4 token/sec · RAM min 6 GB 6 GB RAM 💎 Qwen3-8B ~5.0 GB · 1-2 token/sec · RAM 8 GB Solo 8 GB

② Segui i passaggi

1 Installa Termux ▼ ⚠ NON usare la versione del Play Store (obsoleta). Scarica da F-Droid. 🌐 Link download

https://f-droid.org/packages/com.termux/

Apri il link nel browser, scarica e installa l’APK. Abilita “Sorgenti sconosciute” se richiesto.

2 Scarica lo script installer ▼

Apri Termux e incolla questo comando:

💻 Termux

wget -O install_ai.sh "https://tuo-server/note9_ai_server_install.sh" && bash install_ai.sh

✓ In alternativa: copia lo script sul telefono via USB e salvalo come ~/install_ai.sh

3 Installa manualmente (opzione alternativa) ▼ 💻 1 — Aggiorna e installa dipendenze

pkg update -y && pkg upgrade -y
pkg install -y git cmake clang wget bc make

💻 2 — Compila llama.cpp

git clone https://github.com/ggml-org/llama.cpp ~/llama.cpp
cd ~/llama.cpp
cmake -B build -DLLAMA_CURL=OFF
cmake --build build --config Release -j$(nproc)

💻 3 — Scarica Qwen3-1.7B

mkdir -p ~/ai_models
wget -O ~/ai_models/qwen3-1.7b-q4_k_m.gguf 
  "https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/resolve/main/qwen3-1.7b-q4_k_m.gguf"

💻 4 — Avvia il server

~/llama.cpp/build/bin/llama-server 
  --model ~/ai_models/qwen3-1.7b-q4_k_m.gguf 
  --port 8080 
  --host 0.0.0.0 
  --ctx-size 4096 
  --threads $(nproc)

4 Disabilita ottimizzazione batteria ▼ ⚠ Android può killare Termux in background. Questo step è fondamentale!

Impostazioni → App → Termux → Batteria
→ seleziona “Nessuna restrizione”

Anche: Impostazioni Sviluppatore → disabilita “Limit phantom processes”

5 Testa il server ▼ 💻 Test API

curl http://localhost:8080/v1/chat/completions 
  -H "Content-Type: application/json" 
  -d '{"model":"qwen3","messages":[{"role":"user","content":"Ciao!"}],"max_tokens":100}'

✓ Se vedi una risposta JSON con “choices”, il server funziona! 🎉

Comandi rapidi (dopo installazione)

Endpoint API (OpenAI-compatibile)

http://localhost:8080/v1/chat/completions
http://IP_TELEFONO:8080/v1/chat/completions

Usa questo endpoint come “base URL” in qualsiasi app compatibile con OpenAI API (OpenWebUI, Obsidian, ecc.)

✓ Copiato!

[/fsn_text][/fsn_column][/fsn_row]

Share This Story, Choose Your Platform!

About the author : admin

Leave A Comment