Алгоритм работает для сетей с числом до 6 входы. Я пытался запустить его в сетях с 8 входами, но возникло неожиданное исключение.
Вот код, который я использую для распараллеливания вычислений:
Код: Выделить всё
def select_best(self, population: list)
start_time = time.time()
ns = [self.inputs for _ in range(len(population))]
# ----
with ProcessPoolExecutor(cpus) as executor:
fitness_list = list(executor.map(compute_fitness, population, ns))
# ----
individuals_and_fitness = sorted(
zip(population, fitness_list), key=lambda x: x[1], reverse=True)
best_individuals = [individual for individual,
_ in individuals_and_fitness[:self.population_size]]
best_fitness_scores = [
fitness for _, fitness in individuals_and_fitness[:self.population_size]]
self.fitness_history.append(best_fitness_scores[0])
return best_individuals, best_fitness_scores
Код: Выделить всё
def compute_fitness(individual, n=2):
p = Phenotype(individual)
nn = NNFromGraph(p, inputs=n, outputs=1)
if nn.r == 0:
return 0
outputs = []
targets = []
# Generate all possible combinations of n binary inputs
for combination in itertools.product([0, 1], repeat=n):
input_data = torch.tensor(combination, dtype=torch.float32)
# Get the output from the neural network
output = nn(input_data)
outputs.append(output.item())
# Compute the expected parity of the input combination
expected_parity = sum(combination) % 2
targets.append(expected_parity)
return normalized_mutual_info_score(outputs, targets)
Код: Выделить всё
Exception in thread QueueManagerThread:
Traceback (most recent call last):
File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
self.run()
File "/usr/lib/python3.8/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3.8/concurrent/futures/process.py", line 394, in _queue_management_worker
work_item.future.set_exception(bpe)
File "/usr/lib/python3.8/concurrent/futures/_base.py", line 547, in set_exception
raise InvalidStateError('{}: {!r}'.format(self._state, self))
concurrent.futures._base.InvalidStateError: CANCELLED:
Killed
Еще одна деталь, которая может быть важна, заключается в том, что я заметил странное поведение программа: запуск одного и того же кода на моем ноутбуке (Mac Book Pro M3, 12 ядер) или на удаленном компьютере требует одинакового времени для оценки, даже если можно использовать более 10 ядер.
Используя htop, я вижу, что все ядра используются в течение короткого времени, а затем выполнение возвращается к одному ядру.
Я также попробовал проверить наличие узкого места это действительно оценка, а не эволюционный алгоритм. Можно с уверенностью сказать, что оценка занимает почти в 10 раз больше времени, чем эволюция.
Более того, замена фитнес-функции фиктивной, которая выводит случайные значения приспособленности без оценки, по-видимому, увеличивает время почти в 4 раза.
Знаете, как решить проблему?
Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/791 ... nt-futures