Python 如何正确地使用keras实现多处理?
我试图扩展我的项目以充分利用我的cpu,但我在正确使用keras和多处理方面遇到了困难。我的代码试图并行模拟几个游戏Python 如何正确地使用keras实现多处理?,python,tensorflow,keras,multiprocessing,Python,Tensorflow,Keras,Multiprocessing,我试图扩展我的项目以充分利用我的cpu,但我在正确使用keras和多处理方面遇到了困难。我的代码试图并行模拟几个游戏 def create_model(): #Very simple conv-net import keras from keras.models import Model from keras.layers import Input, Add, Dense, Flatten, Conv2D, Activation from keras.models
def create_model(): #Very simple conv-net
import keras
from keras.models import Model
from keras.layers import Input, Add, Dense, Flatten, Conv2D, Activation
from keras.models import model_from_json
from keras.initializers import glorot_uniform
inputs = Input(shape=(8,8,1))
X = Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), kernel_initializer=glorot_uniform())(inputs)
X = Activation('relu')(X)
X = Flatten()(X)
X = Dense(10, activation='relu', kernel_initializer=glorot_uniform())(X)
output = Dense(1, activation='sigmoid', name='output', kernel_initializer=glorot_uniform())(X)
model = Model(inputs=inputs, outputs=output)
model.compile(optimizer='adam', loss={'output': 'binary_crossentropy'})
return model
def convert(board):
import numpy as np
print("converting")
string_board = str(board)
data_board = string_board.split()
final_data = []
#normalized board values
variance = 14
convert = {'.': 0.0, 'p': -1.0, 'r': -2.0, 'n': -3.0, 'b': -4.0, 'q': -5.0, 'k': -6.0,
'P': 1.0, 'R': 2.0, 'N': 3.0, 'B': 4.0, 'Q': 5.0, 'K': 6.0}
for char in data_board:
final_data.append(convert[char])
final_data = np.asarray(final_data)
final_data /= variance
if not board.turn:
final_data = -final_data
final_data = final_data.reshape(1, 8, 8, 1)
return final_data
return_list = []
model = create_model() #This just creates a conv-net
def board_prediction(board): #Get predictions in parallel
print("predicting")
position = convert(board) #Prep board for CNN
probs, _ = model.predict(position)
return probs
def log_result(result):
return_list.append(results)
def apply_async():
import chess
from multiprocessing import Manager, Process, Pool
pool = Pool()
for i in range(1):
board = chess.Board()
pool.apply_async(board_prediction, args=(board, ), callback=log_result)
pool.close()
pool.join()
print(return_list)
if __name__ == "__main__": #For future multiprocessing
#Remove tensorflow intialization message for a cleaner cmd
import os
import tensorflow as tf
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
tf.logging.set_verbosity(tf.logging.ERROR)
with tf.Session(config=tf.ConfigProto(device_count={'GPU': 0})) as sess:
pass
apply_async()
我的代码打印两行打印,但输出一个空列表。此外,将我调用for循环的次数缩放到3次会消耗我计算机中几乎所有的内存(64gb的RAM)
额外信息:
我使用一个GTX 1080 GPU和一个16核threadripper CPU
谢谢您能将此简化为一个最小的工作示例吗?比如用随机数据建立和训练一个假模型,然后尝试并行预测。如果我们能复制你的代码,然后看看哪里出了问题,那就容易多了。此外,这与您的问题无关,但为什么要多次加载模型?可以!此外,加载模型几次只是为了让它正常工作,我不顾一切的尝试,我编辑了我的帖子来反映你的评论!我可以重现你的错误。不幸的是我没能解决它。这里有一些想法:为什么在调用apply\u async之前打开并关闭tf会话?还有,为什么你想使用multprocessing而不仅仅是批处理呢?谢谢你的尝试,我想使用multprocessing,因为我正在尝试模拟多个随机长度的国际象棋游戏。考虑到这个属性,我不知道如何实现批处理系统。此外,我在应用该方法之前打开该会话并传递它,因为它删除了tensorflow中的初始调试,换句话说,它是不相关的。