Live chat

sabayonino Topic di discussione --> https://www.boincitaly.org/forum/statistiche-sfide-e-traguardi/115347-boinc-pentathlon-2024.html (30.04.24, 00:36)
Spot T adesso speriamo che un po' di utenti si uniscano alla causa (29.04.24, 17:58)
sabayonino https://www.seti-germany.de/boinc_pentathlon/teams.php (29.04.24, 13:43)
sabayonino iscritti (29.04.24, 13:43)
kidkidkid3 (28.04.24, 21:41)
kidkidkid3 Ottimo Saba-Pierre de Coubertin .... l'importante non è vincere ..... (28.04.24, 21:40)
sabayonino Fossimo anche solo in due , BI non è mai mancata , anche nei tempi di crisi (28.04.24, 18:29)
sabayonino Ho chiesto agli Admin Señor di procedere all'iscrizione (28.04.24, 18:28)
corla99 dipende dai progetti, ho poco tempo per stare dietro ad eventuali problemi. Ma se escono progetti che ho già tutto pronto, giro volentieri qualche core (28.04.24, 16:35)
entity I'll participate (28.04.24, 14:49)
zioriga io forse in parte (28.04.24, 14:30)
kidkidkid3 Se dovessimo rimanere in 2 ... direi di non iscriverci ! (28.04.24, 14:12)
Spot T Occorre però iscrivere il team. Di solito lo fa sorcrosc... (28.04.24, 13:21)
kidkidkid3 https://www.seti-germany.de/boinc_pentathlon/ (28.04.24, 12:38)
kidkidkid3 Nulla osta .... poche e vecchie Nvidia, scarsi core di Intel (quad o x5450) ... per quello che può valere io ci sono ! (28.04.24, 12:35)
Spot T Tra 8 giorni inizia il Pentathlon, partecipiamo? (27.04.24, 16:27)
Antonio Cerrato BOINC Workshop 2024 a Ginevra https://indico.cern.ch/event/1379525/overview (23.04.24, 00:31)
astroale ok è tornato (17.04.24, 20:00)
astroale anche a voi boincstats mostra una pagina bianca ? (16.04.24, 23:57)
boboviz Una prece per Higgs (10.04.24, 12:11)
Per usare la chat devi effettuare il login.
Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1

ARGOMENTO:

[bash] Forzare GPUGRID a mandare nuovo lavoro 06/11/2018 16:13 #129474

  • Nubman
  • Avatar di Nubman Autore della discussione
  • Offline
  • RAM 512 KB
  • RAM 512 KB
  • Messaggi: 2304
  • Ringraziamenti ricevuti 279
Già che ci siamo, sulla scia del thread sulla richiesta automatizzata di nuovo lavoro vi fornisco questa "perla".

Adattatelo a vostro uso e consumo. Se avete domande, io sono qui.
Levate quella cacata di xml_grep in favore di sed o awk, ad esempio. :asd:

Codice:
#!/bin/bash

# Usage: /home/luis/script/boinc/forceGPUGRIDSendingWork.sh [interval]


boinc_path="/home/luis/Applicazioni/boinc"
boinccmd="./boinccmd"
gpugrid_url="http://www.gpugrid.net/"

cd $boinc_path
if [[ -z `echo $($boinccmd --get_simple_gui_info)` ]]
then
	echo "BOINC is not running. Exit..."
	exit
fi

start_time=$(date +%s)
iter=0
interval=${1:-3600}

while true; do
	# Time vars
	time=$(date +%H':'%M':'%S)
	now_time=$(date +%s)
	script_time=$(echo "$now_time - $start_time" | bc)
	script_time_str=$(printf '%03dd:%02dh:%02dm:%02ds\n' $(($script_time/86400)) $(($script_time%86400/3600)) $(($script_time%3600/60)) $(($script_time%60)))
	iter=$((iter+1))
	reset
	echo -e "Time: ${time} | Execution time: ${script_time_str} | Iteration N.${iter}\n" # "| Interval: ${interval}s\n"
	###

	# BOINC vars
	project_url=(`echo $($boinccmd --get_tasks | grep 'project URL' | awk '{print $3}') | cut -d " " -f 1-`)
	fraction_done=(`echo $($boinccmd --get_tasks | grep 'fraction done' | awk '{print $3}') | cut -d " " -f 1-`)
	#current_cpu_time=(`echo $($boinccmd --get_tasks | grep 'current CPU time' | awk '{print $4}') | cut -d " " -f 1-`)
	state=(`echo $($boinccmd --get_tasks | grep -v 'active_task_state' | grep -v 'scheduler state' | grep 'state' | awk '{print $2}') | cut -d " " -f 1-`)
	###

	# Loop vars
	ntasks=${#project_url[@]}
	task_not_found=1
	###

	# Loop
	for (( i = 0; i < ntasks; i++ )) do
		if [ ${project_url[$i]} == $gpugrid_url ]; then
			
			if [ ${state[$i]} == "uploading" ]; then # Caso: task in upload

				interval=60
				echo -e "GPUGRID: \e[1;33m1 uploading task found\e[0m. Setting interval=${interval}s. Continuing loop."
				continue

			else

				#total_cpu_time=$(echo "${current_cpu_time[$i]} / ${fraction_done[$i]}" | bc)
				#remaining_cpu_time=$(echo "$total_cpu_time - ${current_cpu_time[$i]}" | bc)

				active_task_url=($(xml_grep '//active_task/project_master_url' "$boinc_path/client_state.xml" --text_only))
				active_task_slot=($(xml_grep '//active_task/slot' "$boinc_path/client_state.xml" --text_only))
				for (( j = 0; j < ${#active_task_url[@]}; j++ )) do
					if [ ${active_task_url[$j]} = $gpugrid_url ]; then
						gpugrid_slot=${active_task_slot[$j]}
						break
					fi
				done

				current_gpu_time=$(xml_grep 'checkpoint_elapsed_time' "$boinc_path/slots/$gpugrid_slot/boinc_task_state.xml" --text_only)
				total_gpu_time=$(echo "scale=6; $current_gpu_time / ${fraction_done[$i]}" | bc)
				remaining_gpu_time=$(echo "$total_gpu_time - $current_gpu_time" | bc)

				if [ $(echo "${fraction_done[$i]} >= 0" | bc) -eq 1 -a $(echo "${fraction_done[$i]} < 0.1" | bc) -eq 1 ]; then # Casi: non iniziato o errore di calcolo precoce; miglior stima tempo totale
					interval=1800
				elif [ $(echo "${fraction_done[$i]} >= 0.1" | bc) -eq 1 -a $(echo "$remaining_gpu_time > 600" | bc) -eq 1 ]; then
					interval=$(echo "$remaining_gpu_time / 2" | bc)
				else
					interval=300
				fi

	 			task_not_found=0
				echo -e "GPUGRID: \e[1;32m1 running task found\e[0m. Setting interval=${interval}s. Breaking loop."
				# DEBUG
				#	echo "fd=${fraction_done[$i]}; cct=$current_gpu_time; tct=$total_gpu_time; rct=$remaining_gpu_time"
				###
				break
			fi
		fi
	done
	###

	# Work request
	if [ "$task_not_found" == "1" ]; then
		interval=60
		# /home/luis/script/boinc/refreshBoincProject.sh $gpugrid_url $interval # Looping work request
		$boinccmd --project $gpugrid_url update
		echo -e "GPUGRID: \e[1;31mNo running tasks found\e[0m. Setting interval=${interval}s. Requesting new work."
	fi
	###

	sleep $interval
done

Esempio di output:


Il codice gira ciclicamente, per interromperlo basta il solito Ctrl+C.
COVID-19

Si prega Accedi o Crea un account a partecipare alla conversazione.

[bash] Forzare GPUGRID a mandare nuovo lavoro 06/11/2018 20:26 #129478

  • sabayonino
  • Avatar di sabayonino
  • Offline
  • Administrator
  • Administrator
  • Gentoo||KDE
  • Messaggi: 5724
  • Ringraziamenti ricevuti 338
Io ottengo URL doppi
~ $ project_url=($(echo $(boinccmd --get_tasks | grep 'project URL' | awk '{print $3}' )))
~ $ echo ${project_url[@]}
http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://universeathome.pl/universe/ http://wuprop.boinc-af.org/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://setiathome.berkeley.edu/ http://universeathome.pl/universe/ http://setiathome.berkeley.edu/


Aggiungici un "uniq -u" per scrupolo
project_url=($(echo $(boinccmd --get_tasks | grep 'project URL' | uniq -u | awk '{print $3}')))

il "cut" puoi ometterlo dato che la variabile è all'interno di una matrice e viene salvata solo la stringa (in pratica non tiene conto dello spazio o del "carridge" se c'è)
~ $ echo ${project_url[@]}
http://wuprop.boinc-af.org/ http://universeathome.pl/universe/ http://setiathome.berkeley.edu/
$ echo "#### ${project_url[1]} ####"
#### http://universeathome.pl/universe/ ####
~ $ echo ${project_url[0]}
http://wuprop.boinc-af.org/
~ $ echo ${project_url[1]}
http://universeathome.pl/universe/
~ $ echo ${project_url[2]}
http://setiathome.berkeley.edu/

I cicli "for" in bash possono essere scritti anche con la sintassi del C , ma puoi utilizzare quella sua... utilizzando l'intera ampiezza della matrice
for i in "${URL[@]}"  ; do 
<codice>
done

E i doppi apici nelle variabili sono sempre ben accetti in caso nella variabile ci siano parole divise dallo spazio
A="Oh My Boinc ! "
echo "${A}"

anche nel paragone delle stringhe...

echo $($boinccmd --get_simple_gui_info)`
potrebbe restituire un "Can't connect to localhost" se cerca un servizio ... anche se poi riporta un eventuale status "1"

Devia lo standard error ...
echo $($boinccmd --get_simple_gui_info 2>/dev/null)


Nell' elenco progetti , se devi utilizzare uno o "N" progetti specifici puoi utilizzare "case" "in un ciclo degli URL trovati
Quindi puoi adattarlo per uno o più progetti
for URL in ${project_url[@]}" ; do
case "${URL}" in 
"${gpugrid_url}" ) <codice per questo url>
;;
"${opzionale_altro_URL}") <codice>
;;
[...]
;;
*) < altro codice per tutti gli altri URL non interessati>
;;
esac
done

se i codici sono uguali per tutti si può creare una funzione generale da richiamare ,
funzione1 () {
<codice funzione1 >
}

se "case" richiede prj1+proj2 con funzione1 e prj3 con funzione2
[...]
case "${URL}" in
"${URL1}"|"${URL2}") funzione1
;;
"${URL3}")funzione2
;;
*) <tutto il resto altro codice o funzione >
;;
esac
[...]
Sostieni BOINC.Italy con una donazione.



Folding@Home

Ringraziano per il messaggio: Nubman

Si prega Accedi o Crea un account a partecipare alla conversazione.

Ultima Modifica: da sabayonino.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 10:18 #129486

  • Nubman
  • Avatar di Nubman Autore della discussione
  • Offline
  • RAM 512 KB
  • RAM 512 KB
  • Messaggi: 2304
  • Ringraziamenti ricevuti 279
Grazie saba, quando posso ci do un occhio.

Segnalo un baco, indicatomi da StefanR5R/xii5ku di AnandTech, che non ho ancora corretto nello script, ma che per fortuna non crea problemi nell'esecuzione vista la rarità della sua occorrenza.
Praticamente all'inizio dello script richiamo "boinccmd --get_tasks" 3 volte. C'è la remota possibilità che la lista dei task cambi in quegli instanti. In tal caso gli elementi degli array project_url, fraction_done e state non corrisponderebbero. La soluzione ovviamente è di eseguirlo una sola volta e poi creare gli array.
COVID-19

Si prega Accedi o Crea un account a partecipare alla conversazione.

Ultima Modifica: da Nubman.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 12:15 #129487

  • sabayonino
  • Avatar di sabayonino
  • Offline
  • Administrator
  • Administrator
  • Gentoo||KDE
  • Messaggi: 5724
  • Ringraziamenti ricevuti 338
Senza che mi metta ad interpretare lo script , puoi farmi un riassunto di cosa fa , magari provo a mettere del mio :asd: vediam che ne esce...
Sostieni BOINC.Italy con una donazione.



Folding@Home

Si prega Accedi o Crea un account a partecipare alla conversazione.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 12:41 #129488

  • Nubman
  • Avatar di Nubman Autore della discussione
  • Offline
  • RAM 512 KB
  • RAM 512 KB
  • Messaggi: 2304
  • Ringraziamenti ricevuti 279
Certamente.

Problema: per GPU come la 750Ti o più lente è fondamentale mantenere la riserva minima/massima di lavoro a valori pressoché nulli. Questo comporta che quando consegni una wu, non è detto che ne ricevi subito un'altra. BOINC in automatico ritenta la richiesta di nuovo lavoro con intervalli di tempo, a mio avviso, troppo larghi. Si finisce per ritrovarsi con la GPU in idle per mezza giornata o più. Come dicevo, è meglio non avere una riserva elevata perché poi perdi facilmente i bonus delle 24h/48h. L'obiettivo che si pone lo script è di prendere anche quelli delle 24h.

Soluzione: uno script che martella il server di richieste in maniera intelligente, cioè quando non ha più task. La ragionevolezza di questa insistenza è soggettiva. :asd:

Il codice fa questo:
-se trova un task di GPUGRID in stato "uploading", setta l'intervallo a 60s
-altrimenti:
*se trova task di GPUGRID già cominciato con percentuale di completamento tra 0 e 10%, setta l'intervallo a 1800s (per beccare task che sono andati in errore di calcolo nel giro di qualche ora sostanzialmente)
*se la percentuale di completamento è maggiore o uguale a 10% oppure il tempo di elaborazione rimanente stimato è maggiore di 10 minuti, setta l'intervallo a un valore pari alla metà del tempo rimanente (per i task in corso da 2-3 ore sino a poche decine di minuti dal completamento);
*altrimenti setta l'intervallo a 300s (per i task prossimi al completamento).

Poi c'è anche una variabile che indica se occorre chiedere al server nuovo lavoro oppure no. Se il client è senza lavoro, chiede nuovo lavoro ogni minuto.

P.S.1 codice è fatto per un client dedicato a GPUGRID, per quanto riguarda la GPU e ci si aspetta che ci sia un solo task di GPUGRID alla volta (riserva di lavoro nulla o quasi).
P.S.2 i tempi degli intervalli sono tarati per la mia 750Ti.
COVID-19

Si prega Accedi o Crea un account a partecipare alla conversazione.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 19:31 #129496

  • sabayonino
  • Avatar di sabayonino
  • Offline
  • Administrator
  • Administrator
  • Gentoo||KDE
  • Messaggi: 5724
  • Ringraziamenti ricevuti 338
facevo prima a leggere il codice :asd:

ok. provo a buttare giù qualcosa appena posso

Ho pure io delle 750ti (2 x 3 mobo)
Sostieni BOINC.Italy con una donazione.



Folding@Home

Si prega Accedi o Crea un account a partecipare alla conversazione.

Ultima Modifica: da sabayonino.

[bash] Forzare GPUGRID a mandare nuovo lavoro 08/11/2018 19:37 #129497

  • sabayonino
  • Avatar di sabayonino
  • Offline
  • Administrator
  • Administrator
  • Gentoo||KDE
  • Messaggi: 5724
  • Ringraziamenti ricevuti 338

Grazie saba, quando posso ci do un occhio.

Segnalo un baco, indicatomi da StefanR5R/xii5ku di AnandTech, che non ho ancora corretto nello script, ma che per fortuna non crea problemi nell'esecuzione vista la rarità della sua occorrenza.
Praticamente all'inizio dello script richiamo "boinccmd --get_tasks" 3 volte. C'è la remota possibilità che la lista dei task cambi in quegli instanti. In tal caso gli elementi degli array project_url, fraction_done e state non corrisponderebbero. La soluzione ovviamente è di eseguirlo una sola volta e poi creare gli array.



Riguardo a questo :

semplicemente puoi provare a salvare tutto l'output in una variabile (richiamando --get_tasks una sola volta) nuda e cruda (non in una matrice) e poi filtrare la variabile come indicato provando a fare dei controlli per vedere se c'è qualche carattere/spazio o altro che possa creare intralcio)

I comandi sono molto vicini , ma nella remota possibilità che uno (o tutti) di questi comandi ci impieghi molo tempo allora si , l'analisi può essere sfalsata.
Sostieni BOINC.Italy con una donazione.



Folding@Home

Si prega Accedi o Crea un account a partecipare alla conversazione.

Ultima Modifica: da sabayonino.
  • Pagina:
  • 1
Tempo creazione pagina: 0.151 secondi
Powered by Forum Kunena