Come Ollama gestisce le richieste parallele
Configurare ollama per l'esecuzione di richieste parallele.
Quando il server Ollama riceve due richieste contemporaneamente, il suo comportamento dipende dalla sua configurazione e dalle risorse del sistema disponibili.
Per ulteriori informazioni su throughput, latenza, VRAM e benchmark tra diversi runtimes e hardware, consulta LLM Performance: Benchmarks, Bottlenecks & Optimization.

Gestione delle richieste concorrenti
-
Elaborazione parallela: Ollama supporta l’elaborazione parallela delle richieste. Se il sistema ha abbastanza memoria disponibile (RAM per l’inferenza su CPU, VRAM per l’inferenza su 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 ogni modello può elaborare contemporaneamente. Per default, è impostato su 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 non 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_PARALLELrichieste 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(impostazione predefinita: 512). Se la coda è piena, le nuove richieste ricevono un errore 503 che indica che il server è sovraccarico. -
Caricamento del modello: 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 di 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 viene elaborata immediatamente, e l’altra viene 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 riassuntiva
| Scenario | Risultato |
|---|---|
| Due richieste, stesso modello, parallelismo sufficiente | Entrambe elaborate insieme in parallelo (batch) |
| Due richieste, stesso modello, parallelismo=1 | Una elaborata, la seconda messa in coda fino al completamento della prima |
| Due richieste, modelli diversi, memoria sufficiente | Entrambi i modelli caricati, richieste gestite in parallelo |
| Due richieste, modelli diversi, memoria insufficiente | Una messa in coda fino a quando la memoria è disponibile o un modello è disattivato |
In sintesi, Ollama è progettato per gestire efficacemente diverse 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 (impostazione predefinita: 512 richieste).
- Se la coda raggiunge la capacità massima, le nuove richieste ricevono un errore 503 “Server Overloaded”.
Gestione dei modelli
- I modelli attivi possono essere disattivati dalla memoria quando diventano inattivi, liberando risorse per le richieste in coda.
- Il numero di modelli caricati contemporaneamente è limitato da OLLAMA_MAX_LOADED_MODELS (impostazione predefinita: 3×GPU 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 su GPU, è richiesta un’allocazione completa della VRAM per modello; non sono supportati caricamenti parziali.
Scenari di fallimento
Esaurimento critico della memoria: Quando anche le richieste in coda superano le risorse disponibili, Ollama potrebbe:
- Paginare su disco (deteriorando gravemente le prestazioni)
- Restituire errori “out of memory”
- In casi estremi, crashare l’istanza del modello
| Impostazione di controllo della configurazione | Scopo | Valore predefinito |
|---|---|---|
| OLLAMA_MAX_QUEUE | Numero massimo di richieste in coda | 512 |
| OLLAMA_NUM_PARALLEL | Numero di richieste parallele per modello caricato | 4 (o 1 se limitato) |
| OLLAMA_MAX_LOADED_MODELS | Numero massimo di modelli caricati contemporaneamente | 3×GPU o 3 per CPU |
Gli amministratori dovrebbero monitorare l’utilizzo della memoria e regolare questi parametri in base alle capacità hardware. La gestione della memoria insufficiente diventa cruciale quando si eseguono modelli più grandi (7B+ parametri) o si elaborano diverse richieste contemporanee.
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 più veloci dei modelli
- GPU: NVIDIA RTX 3080/4090 con 16GB+ VRAM per modelli più grandi
Strategie operative
- Elaborazione in batch: Processa diverse query contemporaneamente per distribuire l’overhead di memoria
- Disattivazione automatica dei modelli: Consente a Ollama di eliminare i modelli inattivi dalla memoria
- Caching dei modelli frequentemente utilizzati: Mantieni i modelli comuni in memoria
Monitoraggio e risoluzione dei problemi
- Utilizza
nvidia-smi(GPU) ehtop(CPU/RAM) per identificare i collo di bottiglia - Per gli errori di memoria:
- Passa a modelli quantizzati
- Riduci il numero di richieste parallele
- Aumenta lo spazio di swap
Esempio di flusso di ottimizzazione:
# Utilizza 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 vantaggiosi 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 più richieste in arrivo e processarle come unità. Questo permette un utilizzo più efficiente delle risorse computazionali, specialmente quando si opera su hardware che trae vantaggio da operazioni parallele (come le GPU).
Quando arrivano contemporaneamente diverse 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é questo 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 diversi modelli: Se è disponibile abbastanza memoria, diversi modelli possono essere caricati e servire richieste contemporaneamente.
- Richieste parallele per modello: Ogni modello caricato può processare diverse richieste in parallelo, controllato dall’impostazione OLLAMA_NUM_PARALLEL (impostazione predefinita è 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.
Conclusioni
Ollama sfrutta sia l’elaborazione in batch che l’esecuzione parallela per processare diverse richieste in modo efficiente. L’elaborazione in batch raggruppa le richieste per un’elaborazione simultanea, mentre l’esecuzione parallela permette che diverse richieste (o modelli) vengano eseguite contemporaneamente. Entrambi metodi dipendono dalla memoria del sistema e sono configurabili per ottenere prestazioni ottimali.
Per ulteriori benchmark, regolazione della concorrenza e linee guida sulle prestazioni, consulta il nostro LLM Performance: Benchmarks, Bottlenecks & Optimization hub.