Definire l'unità di lavoro che si può separare
Scrivi che cosa costituisce un risultato accettato: un'immagine, un documento elaborato, un insieme di simulazioni o uno stato finale di addestramento. Chiediti poi se un'unità può essere calcolata senza attendere le altre. Due documenti possono essere indipendenti durante l'elaborazione, per poi dipendere da una fase comune di costruzione dell'indice. La suddivisione deve descrivere questa seconda fase invece di dimenticarla in una promessa di parallelismo.
Distingui l'indipendenza informatica dall'indipendenza operativa. Un output può essere prodotto senza scambi tecnici e restare inutilizzabile prima della validazione del lotto completo. Individua quindi l'unità di calcolo, l'unità di consegna e la regola di assemblaggio. Questo vocabolario comune evita che gli acquisti contino le schede mentre il team applicativo conta istanze o frammenti di uno stesso modello.
Scegliere tra lavori indipendenti e cooperazione stretta
Per le attività indipendenti, ogni processo riceve i propri input e produce un output identificabile. Un'altra scheda può eseguire un'altra attività senza sincronizzazione a ogni fase. Questa modalità è interessante quando l'obiettivo riguarda la quantità completata in una finestra. Non accelera automaticamente un'attività isolata e occorre comunque verificare la contesa su dati, storage o licenze.
Per un lavoro cooperativo, i dispositivi scambiano dati o attendono un risultato intermedio. Il programma deve gestire questa ripartizione. La guida CUDA spiega che sfruttare più GPU implica contesti, distribuzione dei dati, avvii e comunicazioni. Sono proprietà del percorso software e del sistema osservato; il nome di una scheda del catalogo non prova che questo percorso esista già.
| Domanda | Lavori indipendenti | Lavoro cooperativo |
|---|---|---|
| Che cosa riceve una scheda? | Un'attività completa distinta | Una parte o una replica del lavoro |
| Che cosa occorre coordinare? | Assegnazione degli input e raccolta degli output | Scambi, ordine e sincronizzazioni |
| Quale beneficio verificare? | Numero di risultati accettati per finestra | Risultato identico con durata o capacità adattata |
| Quale fallimento prevedere? | Un'attività o una pubblicazione isolata | L'effetto di un partecipante non disponibile sul gruppo |
Non confondere replica e ripartizione della memoria
Più copie di un modello non significano che i suoi parametri siano divisi tra le schede. PyTorch DistributedDataParallel sincronizza i gradienti tra processi che addestrano i propri modelli locali. Questo approccio non permette quindi di concludere, dal solo nome, che un modello troppo voluminoso per una scheda entrerà su più schede. Un meccanismo di partizionamento richiede una propria documentazione e una propria validazione.
La memoria di ogni scheda deve coprire ciò che il software vi colloca effettivamente: dati, stato del modello, spazi temporanei ed eventuali scambi. Il picco può variare con le impostazioni e la fase di elaborazione. Rilevalo per dispositivo. Una somma di capacità nominali maschera uno squilibrio in cui una scheda manca di memoria mentre le altre ne conservano. La capacità totale del lotto non basta ad accettare lo scenario.
Esempio fittizio: ripartire otto conversioni indipendenti
Il team fittizio «Indice delle opere» prepara otto conversioni di documenti. Nella sua ipotesi di lavoro, ogni conversione occupa una scheda per dodici minuti, caricamento e output inclusi. Un'attività sta da sola sulla scheda e nessuno scambio è necessario prima dell'assemblaggio finale. Queste durate servono unicamente a costruire il ragionamento: non descrivono alcuna esecuzione né prestazione di GPU proposta da Capordia.
Con una scheda, otto attività successive rappresentano 8 × 12 = 96 minuti. Con due schede e una ripartizione equilibrata di quattro attività ciascuna, la parte parallelizzabile rappresenta teoricamente 48 minuti. Se l'assemblaggio finale richiede dieci minuti su un postazione distinta, il percorso completo diventa rispettivamente 106 o 58 minuti, esclusa l'attesa prima della partenza. Questo calcolo presuppone che le due schede non rallentino i rispettivi caricamenti.
| Organizzazione | Parte parallelizzabile | Assemblaggio | Durata calcolata |
|---|---|---|---|
| Una scheda, otto attività | 96 min | 10 min | 106 min |
| Due schede, quattro attività ciascuna | 48 min | 10 min | 58 min |
Far emergere ciò che può annullare questo guadagno teorico
Nello stesso esempio, i documenti potrebbero non essere di uguale dimensione. Assegnare i quattro più lunghi a una scheda lascia l'altra in attesa al termine del percorso. Una distribuzione in base alle disponibilità può migliorare l'equilibrio, ma richiede un meccanismo di assegnazione affidabile e una politica di ammissione. La guida sulla coda tratta questa organizzazione; il presente calcolo non attesta che sia già installata.
Anche lo storage può diventare la risorsa comune dominante. Due processi che leggono gli stessi dati o scrivono simultaneamente risultati di grandi dimensioni non dispongono necessariamente del doppio della velocità. Verifica anche i limiti di concorrenza degli strumenti e delle licenze. Se la parte non parallelizzabile aumenta, rifai il calendario completo. Il tempo guadagnato su una fase non deve mascherare un ritardo aggiunto altrove.
Per un lavoro ripartito, ricevere la topologia reale
Chiedi quali schede sono visibili, come comunicano e quali risorse host condividono i loro processi. Verifica i dispositivi accessibili dall'ambiente utilizzato, non solo da una console amministratore. CUDA precisa che l'accesso alla memoria di un altro GPU dipende in particolare dalla topologia e dalle capacità del sistema. Il supporto di una funzione da parte di un modello non dimostra la presenza del collegamento atteso sulla macchina.
Mantieni uno schema semplice della circolazione dei dati: input, scheda o processo interessato, scambi, raccolta finale e output. Per ogni freccia, identifica se attraversa la memoria host, un collegamento tra GPU o la rete. Questa vista serve a scegliere i controlli di ricezione. Non impone una tecnologia specifica e non trasforma una richiesta multi-GPU in una promessa di topologia particolare.
Confrontare due organizzazioni senza spostare il risultato atteso
Prepara un piccolo corpus rappresentativo ed esegui, sulla tua destinazione autorizzata, un'organizzazione di riferimento e poi l'organizzazione candidata. Mantieni versioni, impostazioni, qualità attesa e regole di assemblaggio. Confronta il tempo fino al risultato accettato, il picco di memoria di ogni scheda, gli errori e il consumo delle risorse comuni. Separa le osservazioni dalle stime; un comando proposto non equivale a un risultato già ottenuto.
Verifica in particolare che il numero di output accettati resti lo stesso e che nessun input venga omesso. Per un calcolo sensibile all'ordine delle operazioni, scegli una tolleranza giustificata anziché un'uguaglianza arbitraria. Un'organizzazione che termina più velocemente con una qualità diversa risponde a un altro problema. Conserva anche un caso in cui la condivisione non è vantaggiosa: questo limite spiega meglio la scelta di una classificazione delle schede senza carico comune.
Tradurre la scelta in capacità richiesta
Scrivi infine il numero di attività simultanee, le schede necessarie a ciascuna e le condizioni indispensabili. Un'attività ripartita su due schede e due attività su una scheda rappresentano due organizzazioni diverse, anche se il totale delle schede è uguale. La configurazione scelta deve consentire l'organizzazione richiesta; non partire dal totale nominale per inventargli poi un utilizzo.
Il catalogo indica lotti di schede. Un lot B200 contiene due GPU da 180 GB ciascuna; questa composizione non garantisce che un software le sfrutti come un'unica memoria. Il passo successivo è far corrispondere l'esigenza al lotto e poi verificare le proprietà effettivamente necessarie. Il calendario, il costo e la decisione restano provvisori finché le condizioni decisive non sono verificate.
Domande per decidere
Due GPU sono sempre più veloci di una sola?
No. Il guadagno dipende dalla frazione parallelizzabile, dagli scambi e dalle risorse condivise. Per un compito isolato non ripartibile, una seconda scheda può restare inutilizzata. Confronta il tempo fino allo stesso risultato accettato, su un protocollo esplicito.
Un lotto di due schede raddoppia la memoria disponibile per il mio programma?
Non automaticamente. Ogni dispositivo possiede la propria memoria e il programma deve ripartire il suo stato o i suoi dati. La replica di un modello può al contrario duplicare gran parte di questo stato. Verifica il meccanismo software e il picco per scheda.
Quando conviene iniziare con compiti indipendenti?
Quando ogni unità può essere calcolata separatamente e il beneficio ricercato è completare più unità. Occorre comunque validare l'assegnazione, l'equilibrio dei carichi e l'assemblaggio finale, senza supporre che archiviazione e licenze seguano automaticamente.