Python - DEAP & SCOOP: разные результаты / Зал славы для каждого узла? - PullRequest
0 голосов
/ 26 июня 2018

Я использую

  • 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 различным залам славы и так далее. Таким образом, каждый узел имеет свой собственный зал славы.

Как я могу получить один зал славы, содержащий результаты со всех узлов?

Любое понимание было бы очень полезно ...

1 Ответ

0 голосов
/ 28 июня 2018

ОП также поставил этот вопрос по поводу проблем с github в DEAP. Как разработчик DEAP, я думаю, что это больше подходит там, и вот ссылка на разговор.

https://github.com/DEAP/deap/issues/285

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...