Come Ollama Gestisce le Richieste Parallele

Configurare ollama per l'esecuzione di richieste parallele.

Indice

Quando il server Ollama riceve due richieste contemporaneamente, il suo comportamento dipende dalla sua configurazione e dalle risorse del sistema disponibili.

cinque fantastiche lontre sono in piedi nel campo

Gestione delle Richieste Concorrenti

  • Elaborazione parallela: Ollama supporta l’elaborazione concorrente delle richieste. Se il sistema ha abbastanza memoria disponibile (RAM per l’inferenza CPU, VRAM per l’inferenza GPU), più modelli possono essere caricati contemporaneamente, e ciascun modello caricato può gestire diverse richieste in parallelo. Questo è controllato dalla variabile di ambiente OLLAMA_NUM_PARALLEL, che imposta il numero massimo di richieste parallele che ciascun modello può elaborare contemporaneamente. Per default, è impostato a 4 (o 1, a seconda della disponibilità di memoria), ma può essere modificato.

  • Batching: Quando arrivano contemporaneamente più richieste per lo stesso modello, Ollama le raggruppa e le elabora insieme. Questo significa che entrambe le richieste vengono gestite in parallelo e gli utenti vedranno le risposte che tornano contemporaneamente. Il server non attende intenzionalmente per riempire un batch; l’elaborazione inizia appena le richieste sono disponibili.

Coda e Limiti

  • Coda: Se il numero di richieste concorrenti supera la parallelità configurata (ad esempio, più di OLLAMA_NUM_PARALLEL richieste per un modello), le richieste aggiuntive vengono inserite in coda. La coda opera in base al principio first-in, first-out (FIFO).

  • Limiti della coda: Il numero massimo di richieste in coda è controllato da OLLAMA_MAX_QUEUE (valore predefinito: 512). Se la coda è piena, le nuove richieste ricevono un errore 503 che indica che il server è sovraccarico.

  • Caricamento dei modelli: Il numero di modelli diversi che possono essere caricati contemporaneamente è controllato da OLLAMA_MAX_LOADED_MODELS. Se una richiesta richiede il caricamento di un nuovo modello e la memoria non è sufficiente, Ollama disattiverà i modelli inattivi per fare spazio, e la richiesta verrà messa in coda fino al caricamento del modello.

Scenario Esempio

Se due richieste per lo stesso modello arrivano nello stesso momento e la parallelità del server è impostata a almeno 2, entrambe le richieste verranno elaborate insieme in un batch, e entrambi gli utenti riceveranno le risposte contemporaneamente. Se la parallelità è impostata a 1, una richiesta verrà elaborata immediatamente, e l’altra verrà messa in coda fino al completamento della prima.

Se le richieste sono per modelli diversi e c’è abbastanza memoria, entrambi i modelli possono essere caricati e le richieste gestite in parallelo. Se non c’è abbastanza memoria, un modello potrebbe dover essere disattivato, e la richiesta verrà messa in coda.

Tabella Riepilogativa

Scenario Risultato
Due richieste, stesso modello, sufficiente parallelità Entrambe elaborate contemporaneamente in parallelo (batch)
Due richieste, stesso modello, parallelità=1 Una elaborata, la seconda messa in coda fino al completamento della prima
Due richieste, modelli diversi, sufficiente memoria Entrambi i modelli caricati, richieste gestite in parallelo
Due richieste, modelli diversi, non sufficiente memoria Una messa in coda fino a quando la memoria è disponibile o un modello è disattivato

In sintesi, Ollama è progettato per gestire efficacemente molte richieste simultanee, purché il server sia configurato per la concorrenza e abbia risorse sufficienti. Altrimenti, le richieste vengono messe in coda e elaborate nell’ordine.

Gestione della Mancanza di Memoria

Quando Ollama incontra una mancanza di memoria per gestire le richieste in arrivo, utilizza una combinazione di meccanismi di coda e strategie di gestione delle risorse per mantenere la stabilità:

Coda delle Richieste

  • Le nuove richieste vengono inserite in una coda FIFO (First-In, First-Out) quando non è immediatamente disponibile la memoria.
  • La dimensione della coda è controllata da OLLAMA_MAX_QUEUE (valore predefinito: 512 richieste).
  • Se la coda raggiunge la capacità, le nuove richieste ricevono un errore 503 “Server Overloaded”.

Gestione dei Modelli

  • I modelli attivi possono essere disattivati dalla memoria quando diventano inattivi per liberare risorse per le richieste in coda.
  • Il numero di modelli caricati contemporaneamente è limitato da OLLAMA_MAX_LOADED_MODELS (valore predefinito: 3×GPU count o 3 per CPU).

Ottimizzazione della Memoria

  • Si tenta di elaborare in batch le richieste per lo stesso modello per massimizzare l’efficienza della memoria.
  • Per l’inferenza GPU, richiede un’allocazione completa di VRAM per modello - non sono supportati caricamenti parziali.

Scenario di Fallimento

Esaurimento Critico della Memoria: Quando anche le richieste in coda superano le risorse disponibili, Ollama potrebbe:

  • Scrivere su disco (riducendo drasticamente le prestazioni)
  • Restituire errori “out of memory”
  • In casi estremi, crashare l’istanza del modello
Configurazione Controls Setting Scopo Valore Predefinito
OLLAMA_MAX_QUEUE Richieste in coda massime 512
OLLAMA_NUM_PARALLEL Parallel requests per modello caricato 4 (o 1 se limitato)
OLLAMA_MAX_LOADED_MODELS Modelli caricati contemporaneamente 3×GPU count o 3

Gli amministratori dovrebbero monitorare l’utilizzo della memoria e regolare questi parametri in base alle capacità del loro hardware. La gestione della memoria insufficiente diventa cruciale quando si eseguono modelli più grandi (7B+ parametri) o si elaborano molte richieste concorrenti.

Strategie di Ottimizzazione di Ollama

Abilita l’accelerazione GPU con export OLLAMA_CUDA=1 e imposta i thread CPU con export OLLAMA_NUM_THREADS=84. Miglioramenti Hardware

  • RAM: 32GB+ per modelli 13B, 64GB+ per modelli 70B
  • Storage: SSD NVMe per un caricamento e uno scambio dei modelli più veloci
  • GPU: NVIDIA RTX 3080/4090 con 16GB+ VRAM per modelli più grandi

Strategie Operative

  • Elaborazione in Batch: Elabora più query contemporaneamente per distribuire l’overhead della memoria
  • Disattivazione Automatica dei Modelli: Permette a Ollama di eliminare i modelli inattivi dalla memoria
  • Caching dei Modelli Usati di Frequente: Mantieni i modelli comuni residenti in memoria

Monitoraggio e Risoluzione dei Problemi

  • Usa nvidia-smi (GPU) e htop (CPU/RAM) per identificare i collo di bottiglia
  • Per gli errori di memoria:
  • Passa a modelli quantizzati
  • Riduci le richieste concorrenti
  • Aumenta lo spazio di swap

Esempio di workflow di ottimizzazione:

# Usa un modello quantizzato con accelerazione GPU
export OLLAMA_CUDA=1
ollama run llama2:7b-q4_0 --context-size 2048

# Limita i modelli caricati e le richieste parallele
export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_NUM_PARALLEL=4

Questi aggiustamenti possono ridurre l’utilizzo della memoria del 30-60% mantenendo la qualità delle risposte, particolarmente vantaggioso quando si eseguono diversi modelli o si gestiscono volumi elevati di richieste.

Ollama: Elaborazione in Batch vs Esecuzione Parallela

Elaborazione in Batch in Ollama si riferisce alla pratica di raggruppare diverse richieste in arrivo e processarle come unità. Questo permette un uso più efficiente delle risorse computazionali, specialmente quando si opera su hardware che trae vantaggio da operazioni parallele (come le GPU).

Quando arrivano contemporaneamente più richieste per lo stesso modello, Ollama può processarle insieme in un batch se la memoria lo permette. Questo aumenta il throughput e può ridurre la latenza per ciascuna richiesta, poiché il modello può sfruttare operazioni matriciali ottimizzate sul batch.

L’elaborazione in batch è particolarmente efficace quando le richieste sono simili per dimensione e complessità, poiché permette un utilizzo migliore dell’hardware.

Esecuzione parallela in Ollama significa gestire diverse richieste contemporaneamente, sia per lo stesso modello che per modelli diversi, a seconda della memoria disponibile e della configurazione.

Ollama supporta due livelli di parallelismo:

  • Caricamento di Più Modelli: Se disponibile abbastanza memoria, diversi modelli possono essere caricati e servire richieste contemporaneamente.
  • Richieste Parallele per Modello: Ogni modello caricato può elaborare diverse richieste in parallelo, controllato da OLLAMA_NUM_PARALLEL (valore predefinito è 1 o 4, a seconda della memoria).

Quando le richieste superano il limite di parallelismo, vengono inserite in coda (FIFO) fino a OLLAMA_MAX_QUEUE.

Ollama sfrutta sia l’elaborazione in batch che l’esecuzione parallela per processare efficacemente diverse richieste. L’elaborazione in batch raggruppa le richieste per un’elaborazione simultanea, mentre l’esecuzione parallela permette a diverse richieste (o modelli) di eseguirsi contemporaneamente. Entrambi metodi dipendono dalla memoria del sistema e sono configurabili per ottenere le prestazioni ottimali.