Я использую
- Python 3.6.4 / Anaconda custom (64-bit) [GCC 7.2.0] в linux
- SCOOP 0.7.2.0
- DEAP 1.2.2
для запуска примера генетического алгоритма scoop / examples / deap_ga_onemax.py из https://github.com/soravux/scoop/blob/master/examples/deap_ga_onemax.py
в кластере HPC с использованием скрипта SLURM, см. Код, размещенный ниже.
Обратите внимание, что строка № 71 в файле deap_ga_onemax.py прокомментирована: #random.seed(64)
Код Python:
"""
Code from the deap framework, available at:
https://code.google.com/p/deap/source/browse/examples/ga/onemax_short.py
Conversion to its parallel form took two lines:
from scoop import futures
toolbox.register("map", futures.map)
"""
import array
import random
import numpy
from deap import algorithms
from deap import base
from deap import creator
from deap import tools
from scoop import futures
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", array.array, typecode='b',
fitness=creator.FitnessMax)
toolbox = base.Toolbox()
# Attribute generator
toolbox.register("attr_bool", random.randint, 0, 100)
# Structure initializers
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_bool, 100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
def evalOneMax(individual):
return sum(individual),
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=3)
toolbox.register("map", futures.map)
def main():
#random.seed(64)
pop = toolbox.population(n=100)
hof = tools.HallOfFame(1)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", numpy.mean)
stats.register("std", numpy.std)
stats.register("min", numpy.min)
stats.register("max", numpy.max)
pop, log = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=10,stats=stats, halloffame=hof, verbose=True)
return pop, log, hof
if __name__ == "__main__":
pop, log, hof = main()
print(hof)
Скрипт SLURM:
#!/bin/bash
#SBATCH -J xxx
#SBATCH -A xxx
#SBATCH -N 4
#SBATCH -n 4
#SBATCH --time=00:03:00
#SBATCH --mem-per-cpu=1024M
#echo "ERROR"
hosts=$(srun bash -c hostname)
srun /projects/p_thermo_dat/software/python36/bin/python -m scoop --host $hosts -v scoop_deap_test.py > $(date +"%Y%m%d_%I%M%p")_log_scoop_deap_test.txt
exit
Проблема:
Параллельное выполнение deap_ga_onemax.py на 4 узлах с 4 процессорами в каждом приводит к 4 различным залам славы. Работа на 3 узлах приводит к 3 различным залам славы и так далее. Таким образом, каждый узел имеет свой собственный зал славы.
Как я могу получить один зал славы, содержащий результаты со всех узлов?
Любое понимание было бы очень полезно ...