Vorrei un aiuto per capire esattamente cosa ho fatto/perché il mio codice non funziona come mi aspetterei.Python - Ciclo di parallelizzazione con joblib
Ho iniziato a usare joblib per cercare di velocizzare il mio codice eseguendo un (grande) ciclo in parallelo.
Io lo utilizzo in questo modo:
from joblib import Parallel, delayed
def frame(indeces, image_pad, m):
XY_Patches = np.float32(image_pad[indeces[0]:indeces[0]+m, indeces[1]:indeces[1]+m, indeces[2]])
XZ_Patches = np.float32(image_pad[indeces[0]:indeces[0]+m, indeces[1], indeces[2]:indeces[2]+m])
YZ_Patches = np.float32(image_pad[indeces[0], indeces[1]:indeces[1]+m, indeces[2]:indeces[2]+m])
return XY_Patches, XZ_Patches, YZ_Patches
def Patch_triplanar_para(image_path, patch_size):
Image, Label, indeces = Sampling(image_path)
n = (patch_size -1)/2
m = patch_size
image_pad = np.pad(Image, pad_width=n, mode='constant', constant_values = 0)
A = Parallel(n_jobs= 1)(delayed(frame)(i, image_pad, m) for i in indeces)
A = np.array(A)
Label = np.float32(Label.reshape(len(Label), 1))
R, T, Y = np.hsplit(A, 3)
return R, T, Y, Label
ho avuto modo di sperimentare con "n_jobs", in attesa che l'aumento di questo accelererà la mia funzione. Tuttavia, con l'aumento di n_jobs, le cose rallentano in modo significativo. Quando si esegue questo codice senza "Parallelo", le cose sono più lente, finché non aumento il numero di lavori da 1.
Perché è questo il caso? Ho capito che più lavori ho eseguito, più veloce è la sceneggiatura? sto usando questo sbagliato?
Grazie!
Innanzitutto, quante CPU o core hai nel computer che usi? In secondo luogo, 'n_jobs' imposta il numero massimo di lavori in esecuzione contemporaneamente. Hai provato 'n_jobs = -1'? Questo dovrebbe usare tutte le CPU nel tuo computer. In terzo luogo, quanto è grande questo 'indeces' del tuo ciclo for? – fedepad
Ho 24 core e un'enorme quantità di memoria. indeces ha circa 10.000 voci, quindi ho pensato che sarebbe stato un buon parallelismo. Posso provare n_jobs = -1 e riferire. – JB1
Sì. Posso immaginare che se si aumentano n_jobs da 1 a max (n_jobs = 23, njobs = -1), si raggiungerà un punto in cui l'incremento di questo numero comporterà un ulteriore sovraccarico, quindi è necessario trovare un punto debole. Certo se puoi usare il backend = "threading" potrebbe essere forse meglio ma devi sperimentare. – fedepad