Luni-4/GPU-Computing

GPU-Computing Project

★ 0Forks 0C++GitHub ↗Compare

README

GPU Computing

Indice

  1. Informazioni
  2. Modalità di lavoro
  3. TODO
  4. Divisione dei compiti
  5. Link Utili
  6. Considerazioni

1. Informazioni

  • Linguaggio di programmazione: Cuda
  • Versione Toolkit: Cuda Toolkit 8.0
  • Cross-compiling da Linux per Windows con NVCC: non fattibile
  • Possibili Librerie
    • NVIDIA cuDNN

2. Modalità di lavoro

2.1 TODO

2.1.1 TODO MIGLIORAMENTI

  • (FATTO) Usare gli stream sulle fasi della rete e non su singole funzioni (caso convoluzionale, lanciare le convoluzioni di forward propagation di un livello in diversi stream) => non porta ad uno speedup in quanto i dati sono tutti in memoria gpu e i kernel così suddivisi impiegano troppo poco tempo per portare ad un vantaggio.
  • (FATTO) guardare l'occupancy e se migliorandola può portare a dei miglioramenti.
  • (FATTO) implementare i livelli batch veri e propri => sono un metodo diverso di fare la convoluzione ma non aumenta la parallelizzazione e quindi non ci porta un vantaggio nell'implementarla.
  • provare ad utilizzare i metodi batched di cublas nella convoluzione
  • provare a ripensare l'algoritmo della convoluzione
  • provare ad utilizzare la libreria di cuda per le reti neurali, CUDNN, in modo integrale o su solo una parte del nostro progetto.
  • implementare le epoche.

2.1.2 TODO TEST

  • Provare ad utilizzare lo stesso tipo di random su entrambe le reti, nei test successivi comunque utilizzare dei pesi fissi.
  • Effettuare più test sulla Educnn usando il livello di batch per confrontare le accuratezze a partire dagli stessi pesi iniziali.
  • Effettuare dei test usando Cifar per valutare l'accuratezza ed i tempi computazionali ottenuti dalla nostra rete.
  • Creare una rete grossa, composta da più livelli e più profondità, e con le epoche e utilizzarla col MNIST per fare un confronto con la educnn. NB: se i pesi iniziali sono gli stessi e usiamo il livello chiamato "batch", il miglior learning rate dovrebbe essere lo stesso per entrambe le reti.
  • Usare la rete precedente su CIFAR e raccogliere dati per il prof senza poter fare un confronto.

2.1.3 TODO ALTRO

  • Usare un approccio mini-batch per ridurre il tempo computazionale
  • Confrontare la nostra rete con un'altra rete implementata in CUDA e vedere se speedup ed accuratezza sono simili tra loro
  • Utilizzare algoritmi di convoluzioni per immagini trovati da Nicholas (bassa priorità, solo nel caso in cui tutti gli altri metodi fallissero)
  • Implementare gli stride per i livelli convoluzionali(facoltativo)

2.2. Divisione dei compiti

NICHOLAS:

  • Testare la EduCnn e la nostra rete con il livello di batch per vedere come cambiano i tempi di esecuzioni e l'accuratezza
  • Aggiungere gli Stream alle varie fasi del livello convoluzionale e non ai singoli kernel che compongono le fasi

MICHELE:

  • Verificare perché con un unico livello fully-connected e pesi iniziali fissati la EduCNN e la nostra rete producono risultati diversi
  • Aggiungere alle varie fasi del livello fully-connected e non ai singoli kernel che compongono le fasi
  • Testare con Cifar la nostra rete

2.3. Link Utili

3. Considerazioni

  • La dnn originale risulta più veloce perché utilizza uno stride pari a 2 nei livelli convoluzionali e non usa le epoche
  • La educnn oltre ai livelli convoluzionali ha i livelli di max_pooling e di average_pooling
  • Definire un intervallo per il learning rate, ad esempio [0.001, 0.8], e campionarlo con diverse frequenze di campionamento (già fatto)
  • Testare i learning rate in maniera decrescente per vedere se l'accuratezza migliora al diminuire dei valori (aumento del tempo di esecuzione)
  • Partire con dei pesi iniziali bassi fissi, non generati casualmente, per poter confrontare le due reti senza dover dipendere dai diversi algoritmi per la generazione di numeri pseudo-casuali
  • Costruire una rete con tanti livelli convoluzionali e fully-connected

Contributors

Luni-4Lemen47Nic

Issues