Esecuzione programma java su server

di il
9 risposte

Esecuzione programma java su server

Ciao a tutti sono nuovo del forum, spero che la domanda che sto per fare non sia assurda

Ho creato un programma java che mi aiuta tramite simulazione a calcolare alcune quantità di interesse, replicando un esperimento per un numero altissimo di volte. Il problema è che per ottenere risultati molto accurati ho bisogno di tantissime ripetizioni, circa nell'ordine del miliardo.

Questo comporta che il tempo di esecuzione del programma cresca di molto: con circa 500 milioni di prove ottengo il risultato dopo circa 2 ore e mezza, quindi mi aspetto un tempo totale di almeno 5 ore.

Ho pensato che sarebbe molto comodo poter lanciare il programma su un server remoto, per poi leggere i risultati, ho sentito parlare di Cloud Computing e ho fatto qualche ricerca di piattaforme (GRATIS!) che consentano di fare quello che cerco.
Ho trovato ad esempio Oracle Cloud.

Nel link ci sono vari punti da seguire, ad ora mi pare un po' complicato da seguire,si parla di installare maven, fare il deploy dell'applicazione etc.

Qualcuno che ha mai fatto qualcosa del genere mi può consigliare una soluzione alternativa, o confermare la bontà di questa?

Io cercherei qualcosa di più semplice possibile, il mio programma è composto da pochi file .class e mi piacerebbe poter direttamente modificare il file/compilare/eseguire da una specie di terminale, senza passare per programmi esterni, ma mi intendo proprio zero di java lato web o esecuzione di programmi in remoto, quindi non so se ciò sia possibile.

E poi mi chiedo: come potrei leggere il risultato finale? Che voi sappiate c'è un modo per monitorare un processo lanciato quando faccio il login (sperabilmente accendendo il pc la mattina dopo) o dovrei scrivere (sempre che sia permesso!) un file per salvare il risultato?

Accetto volentieri qualsiasi consiglio e spiegazione, grazie del tempo dedicatomi!

9 Risposte

  • Re: Esecuzione programma java su server

    AeternaAedes ha scritto:


    Ho creato un programma java che mi aiuta tramite simulazione a calcolare alcune quantità di interesse, replicando un esperimento per un numero altissimo di volte. Il problema è che per ottenere risultati molto accurati ho bisogno di tantissime ripetizioni, circa nell'ordine del miliardo.
    [...]
    il mio programma è composto da pochi file .class
    Domanda: hai innanzitutto sfruttato opportunamente il multi-threading (con tutto quello che comporta)? Perché se il tuo programmino gira solo a thread singolo ... non è certo il Cloud Computing che ti "salva" ..
  • Re: Esecuzione programma java su server

    Ciao e grazie per la risposta.

    No, in realtà il mio programma non usa il multi-threading, ammetto che l'argomento lo conosco molto poco e avrei sicuramente tanto da imparare e da approfondire.
    E' anche vero che, essendo le varie prove indipendenti, potrei parallelizzare i calcoli su più thread e ottenere un considerevole risparmio di tempo.

    Mi piacerebbe comunque sapere se è possibile fare quello che cerco su un pc remoto, anche perché le combinazioni di parametri che dovrei testare sono quasi infinite (anche ammettendo di ridurre il tempo di esecuzione da molte ore a una due ore, potrei comunque riparametrizzare meglio il programma per eseguire insieme più combinazioni di parametri, e "lanciare" quello che prima avrei fatto in esecuzioni differenti "tutto assieme"), quindi l'idea di utilizzare una macchina esterna rimane comunque la mia preferita.

    Per caso conosci/hai già usato una soluzione come quella del link di sopra (o più semplice) ?

    Altrimenti hai qualche consiglio da darmi (oltre a quello di ottimizzare il mio programma, per il quale ti ringrazio e che dovrò assolutamente imparare a fare, ma come detto mi risparmierebbe solo parte dell'enorme mole di calcoli che vorrei fare ...)?

    Grazie!
  • Re: Esecuzione programma java su server

    Cloud Computing e' il termine maggggggico usato dal maketttting, ma alla fin fine non e' niente di strano.

    Nel tuo caso, il Clound Computing non e' altro che uno (o piu') PC remoti, raggiungibili mediante ssh o Remote Desktop: nulla che potresti fare con un paio di PC in rete.

    Poiche' tu non accedi a PC fisici, ma SOLO a Virtual Machine (a meno di non pagare un botto), il PC di casa e' decisamente piu' performante della VM nell'infrastruttura del fornitore che vorresti usare (Oracle, Microsoft, Google, Amazon, ...).

    Questa NON E' la strada! Almeno non nel tuo caso.

    Ci sono una serie di direzioni che puoi seguire, e che fornirebbero risultati decisamente piu' utili:

    1) ASSOLUTAMENTE sfruttare al meglio il parallelismo del tuo PC. Questo passo e' FONDAMENTALE. Anzi, per essere sicuro, parti dall'idea che il tuo PC ha un certo numero di thread, ma potresti far girare la tua applicazione su un PC con un numero DOPPIO di thead. DEVI SFRUTTARLI TUTTI!!!!
    Una scheda Intel Xeon Phi, che la puoi pensare come un PC Linux in rete, puo' arrivare fino a 250 thread!!
    Uno Xeon di ultima generazione arriva fino a 36 thread (18 core + HT).
    MA ATTENTO: devi utilizzare SOLO i thread EFFETTIVAMENTE presenti, NON DI PIU', ma, eventualmente qualcuno di meno, giusto per assicurarti che la macchia comunque continui a rispondere.

    2) usare un cluster di computer. Generalmente l'Universita' ha un qualche piccolo cluster per uso interno. Probabilmente la facolta' di Fisica o di Chmica. In ogni caso, per sfruttare al meglio il cluster, DEVI aver gia' implementato il punto 1)

    3) se hai un PC di ultima generazione (portatile o desktop) con una scheda grafica DECENTE (NVIDIA), usare il parallelismo fornito dalla scheda grafica. Una scheda grafica NVIDIA di ultima generazione puo' avere dai 1000 ai 5000 thread. Potersti avere uno speedup anche di 20 volte (cioe' stai un ventesimo del tempo utilizzato usando solo la CPU per eseguire il programma)

    Se hai un desktop decente, potrebbe aver senso acquistare una scheda grafica di ultima generazione ragionevolmente potente (tendenzialmente una top di gamma)

    L'uso di un PC remoto (una VM in Cloud) ha senso SOLO nel caso in cui hai la necessita' di tenerlo acceso in continuazione per N-mila ore.
    Ma ATTENTO: i PC forniti in Cloud hanno un numero massimo di tempo di CPU gratuito, poi PAGHI. Anche se, generalmente, non costa molto.

    E si ritorna la punto di partenza: se vuoi pagare il meno possibile, COMUNQUE, devi aver risolto il punto 1)!!!

    Ma a parte questo, in ogni caso un'OCCULATA scelta dei parametri E' FONDAMENTALE, per ridurre il numero delle simulazioni. Qui serve fare unACCURATA ANALISI.

    Non ha molto senso fare N simulazioni con parametri che sono tra di loro interpolazioni lineari, ed avere dei risultati che possono essere ottenuti mediante banale interpolazione, invece che mediante simulazione.
  • Re: Esecuzione programma java su server

    Io invece sono più curioso riguarda agli aspetti scientifici.
    una simulazione alla montecarlo? utilizzi un qualche generatore pseudorandom?
    dettaglia, su
  • Re: Esecuzione programma java su server

    Prima di tutto, grazie @migliorabile per la dettagliata spiegazione, hai toccato molto punti interessati di cui non ero al corrente.

    Purtroppo non penso di avere quel gran numero di thread a disposizione (ho un Intel i7-6500U), per quanto riguarda la scheda grafica forse sono messo un po' meglio, ho una NVIDIA GeForce GTX 950 M (DDR5, 2GB).
    Se hai voglia di darmi un'idea di quanto potrei risparmiare usando bene il multithreading/parallelismo della scheda grafica mi fai un gran favore, anche se penso che ci sia tantissimo da studiare e onestamente non penso che in questo momento ne valga la pena.

    Visto che @+m2+ lo richiede, e che sono stato molto povero di dettagli, cerco di spiegare meglio il mio obiettivo.
    Sto creando una specie di intelligenza artificiale per un gioco di carte, il mio programma quindi di scientifico ha ben poco, utilizzo solo la simulazione per calcolare la probabilità di vittoria dell'AI, testando la bontà dei vari metodi di gioco contro un'altra intelligenza artificiale che fa mosse del tutto casuali.
    Essendo quasi impossibile calcolare la probabilità di vittoria/sconfitta di ogni AI, l'idea è quella di fare giocare parecchi milioni di partite al computer (mi piacerebbe arrivare a un miliardo di partite per avere una precisione al quarto decimale sulla probabilità di vittoria).

    Il programma è quindi del tutto "hobbistico", lo sviluppo nel tempo libero e non potrei (né vorrei consumare) risorse dell'università, né vorrei acquistare componenti più performanti.
    Non ho neanche particolari esigenze di tempo, il lavoro va avanti da parecchio nel tempo libero e quindi sono più che disposto ad attendere un giorno per il risultato piuttosto che a "spremere" al massimo il mio pc per averlo in qualche ora (sono di un'ignoranza totale in materia, non ho idea se usare al massimo le risorse del pc per giorni e giorni possa in qualche modo logorarlo o diminuirne la vita, ma vorrei anche evitare di lasciarlo sempre acceso per un compito del genere).

    Non avevo idea di quanto poco possa essere performante una Virtual Machine, e del fatto che si potesse pagare a tempo la CPU nel cloud più che per la potenza/disponibilità di risorse.
    Diciamo comunque che preferirei al massimo pagare un po' per avere le "N-mila ore" (anche un po' di meno) di cloud, piuttosto che impiegare troppo tempo e risorse sull'ottimizzazione massima.

    Grazie comunque per il tempo e le utili indicazioni, cercherò di usare il parallelismo per quanto riesco, anzi se conoscete qualche buona guida, o più probabilmente testo su cui studiare lo prenderò sicuramente in considerazione, anche per il futuro.

    Se avete altri consigli li accetto più che volentieri!
  • Re: Esecuzione programma java su server

    Per quanto riguarda quanto si puo' migliorare con il parallellismo (USANDO la CPU), il calcolo e' semplice:

    NELLE MIGLIORI CONDIZIONI POSSIBILI (che capitano MOOOLTO raramente, ma il tuo e' uno di questi casi) il tempo e' inversamente proporzionale al numero di thread:

    se con 1 thread stai T, con 2 thread stai T/2 e con N thread stai T/N

    OVVIAMENTE per ottenere questi speedup ci vuole quello che tecnicamente si chimama manico (alias per saperci fare ).
    Non e' difficile, ma non e' nemmeno banale.

    Tempo speso per imparare a usare il parallelismo e' tempo ESTREMAMENTE BEN SPESO.

    Effettivamente il i7-6500U e ' un dualcore senza HT, quindi, al meglio delle possibilita', potresti dimezzare i tempi (sempre detto io che PIU' core ci sono e meglio e' )

    La GTX 950M ha 640 CUDA core (questo NON IMPLICA che i tempi si riducono ad T/640 !!!!!!!!). Probabilmente potresti ottenere uno speedup di 5 o 10 (tempo di esecuzione: T/5, T/10).

    Comunque programmate in CUDA non e' una passeggiata.

    Per quanto riguarda quanto si paga su Cloud, tu paghi, OVVIAMENTE, per

    1) tempo CPU PIU'
    2) potenza (numero di core, velocita' CPU) PIU'
    3) risorse (memoria VM, storage VM, eventuale I/O, etc...)

    Se non altro perche' quando allochi le risorse, in qualche modo il sistema te le deve assicurare nel momento in cui le vuoi usare.
  • Re: Esecuzione programma java su server

    Grazie ancora una volta per la dettagliata spiegazione!

    Quindi mi pare di capire che per il mio caso non riuscirei a ridurre di molto il tempo di esecuzione (non che dimezzarlo sarebbe così malvagio ), escludendo di programmare in CUDA.

    Mi avete comunque fatto capire l'importanza di usare il parallelismo, mi butterò presto sull'argomento.

    Sei stato molto chiaro riguardo al Cloud, dubito di riuscire a trovare qualcosa che risponda ai requisiti e che costi poco, dovessi riuscirci scriverò qui, se per caso possa essere di interesse per altri.

    Grazie!
  • Re: Esecuzione programma java su server

    AeternaAedes ha scritto:


    Quindi mi pare di capire che per il mio caso non riuscirei a ridurre di molto il tempo di esecuzione (non che dimezzarlo sarebbe così malvagio ), escludendo di programmare in CUDA.
    Dipende .... bisogna anche vedere cosa hai fatto esattamente come codice. Hai usato molti oggetti? Usi molte concatenazioni di stringhe? Che tipi di dati e/o strutture dati usi? Prova a postare un pezzetto di codice (se puoi/vuoi) per far capire la logica che stai applicando.

    AeternaAedes ha scritto:


    Mi avete comunque fatto capire l'importanza di usare il parallelismo, mi butterò presto sull'argomento.
    Sì assolutamente, acquisisci conoscenze su multi-threading/concorrenza in Java. Ti ci vorranno mesi solo per questo.
  • Re: Esecuzione programma java su server

    andbin ha scritto:


    Dipende .... bisogna anche vedere cosa hai fatto esattamente come codice. Hai usato molti oggetti? Usi molte concatenazioni di stringhe? Che tipi di dati e/o strutture dati usi? Prova a postare un pezzetto di codice (se puoi/vuoi) per far capire la logica che stai applicando.
    Ho paura che per dare un'idea dovrei postare troppo codice, la classe dell'AI è molto intorcolata e all'interno dei vari casi ci sono alcune inefficienze, con molti oggetti che vengono creati per aiutarmi a scrivere relativamente poco codice per ogni casistica.
    Il ciclo di gioco è invece abbastanza fluido, le strutture dati molto semplici (pochi array e liste) e una singola simulazione di partita non dura più di un centesimo di millisecondo.
    E' solo il voler replicare troppe volte l'esperimento che allunga di molto il tempo totale, dovrò lavorare su questo.

    andbin ha scritto:


    Sì assolutamente, acquisisci conoscenze su multi-threading/concorrenza in Java. Ti ci vorranno mesi solo per questo.
    E' come immaginavo, leggere "mesi" spaventa un po', ma ne capisco l'importanza.

    Grazie anche a te!
Devi accedere o registrarti per scrivere nel forum
9 risposte