The Python code snippet below uses the multiprocessing library to processes a list of tasks in parallel using a pool of 5 threads.
note: Python also has a multithreading library called “threading”, but it is well documented that Python multithreading doesn’t work for CPU-bound tasks due to Python’s Global Interpreter Lock (GIL), for more info google: “python multithreading gil”.
from multiprocessing import Process, Pool
import itertools
import time
def train(opt, delay=2.0):
time.sleep(delay)
return f'Done training {opt}'
# Grid search
grid = {
'batch_size': [32, 64, 128],
'learning_rate': [1E-4, 1E-3, 1E-2]
}
def main():
settings_list = []
for values in itertools.product(*grid.values()):
settings_list.append( dict(zip(grid.keys(), values)) )
with Pool(5) as p:
print(p.map(train, settings_list))
if __name__ == "__main__":
main()
Output
[
"Done training {'batch_size': 32, 'learning_rate': 0.0001}",
"Done training {'batch_size': 32, 'learning_rate': 0.001}",
"Done training {'batch_size': 32, 'learning_rate': 0.01}",
"Done training {'batch_size': 64, 'learning_rate': 0.0001}",
"Done training {'batch_size': 64, 'learning_rate': 0.001}",
"Done training {'batch_size': 64, 'learning_rate': 0.01}",
"Done training {'batch_size': 128, 'learning_rate': 0.0001}",
"Done training {'batch_size': 128, 'learning_rate': 0.001}",
"Done training {'batch_size': 128, 'learning_rate': 0.01}"
]