Керас работает с несколькими моделями одновременно - PullRequest
1 голос
/ 29 октября 2019

Я тренирую модели с помощью генетического алгоритма, и функция пригодности сначала строит модель с определенными параметрами, а затем выполняет вывод набора данных с этой моделью.

Очевидно, что генетические алгоритмы очень распараллеливаемы, но я сталкиваюсь с проблемами при загрузке и запуске нескольких моделей одновременно. Я использую многопроцессорную библиотеку Python и запускаю функцию, которая загружает модель и выполняет вывод, используя метод Pool. При этом я получаю сообщение об ошибке:

Не удалось запустить Blas GEMM: a.shape = (32, 50), b.shape = (50, 200), m = 32, n = 200,k = 50 [[{{node lstm_1 / while / body / _1 / MatMul_1}}]] [Op: __inference_keras_scratch_graph_494]

Стек вызовов функций: keras_scratch_graph

Не уверен, что происходитздесь, но ошибка не выдается, когда модели не распараллелены. Любая помощь очень важна.

Вот код:

import tensorflow as tf
from keras import regularizers
from keras.optimizers import SGD
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Flatten, ELU, LSTM, PReLU, GRU, CuDNNGRU, CuDNNLSTM
from keras.callbacks import EarlyStopping, ModelCheckpoint
import numpy as np
from sklearn import preprocessing
from sklearn.preprocessing import minmax_scale
import matplotlib.pyplot as plt
import math, random, copy, pickle, time, statistics
import pandas as pd
import multiprocessing as mp

def buildModel(windowSize):
    #model to use
    sample_model = Sequential()
    sample_model.add(CuDNNLSTM(50, input_shape = (windowSize, 5), return_sequences=False))
    sample_model.add(Dense(50, activation="relu"))
    sample_model.add(Dense(3, activation="softmax"))
    sample_model.compile(optimizer="adam", loss="categorical_crossentropy")
    sample_model.build()
    #record weight and bias shape
    modelShape = []
    for i in range(len(sample_model.layers)):
      layerShape = []
      for x in range(len(sample_model.layers[i].get_weights())):
        layerShape.append(sample_model.layers[i].get_weights()[x].shape)
      modelShape.append(layerShape)
    return(sample_model, modelShape)

model = BuildModel(120)
pool = mp.Pool(mp.cpu_count())
results = [pool.apply(model.predict, args=(np.array(features[x]), batch_size=len(features[i]))) for x in range(len(features))]
pool.close()

Функции, которые я использую, не важны, все они могут быть списками из 120 случайных чисел или чем-то еще. На самом деле я не добавил функции, которые я использую, потому что они огромные и из действительно большого файла.

Я просто хочу иметь возможность запускать model.predict в многопроцессорной функции pool.apply [], чтобы я мог запускать несколько прогнозов одновременно.

...