これは私が直面している問題です。私はマルチプロセスProcess
でモデルを訓練しようとしていますが、親スコープにモデルがすでに存在する場合は、Embedding
レイヤの初期化時にプロセスがフリーズします。親スコープのモデルはサブプロセススコープのモデルを防ぎます
from multiprocessing import Process, Pipe
import numpy as np
from keras.models import Model
from keras.layers import Input, Dense, Embedding
from keras.optimizers import Adam
import tensorflow as tf
def make_model(vecs, weights=None):
inp = Input((5,))
embd = Embedding(len(vecs), 50, weights=[vecs], trainable=False)(inp)
out = Dense(5, activation='softmax')(embd)
model = Model(inp, out)
model.compile(Adam(0.001), 'categorical_crossentropy', metrics=['accuracy'])
return model
def f(vecs, conn):
model = make_model(vecs)
conn.send('done')
conn.close()
if __name__ == '__main__':
vecs = np.random.random((100000, 50))
model1 = make_model(vecs)
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(vecs, child_conn), daemon=True)
p.start()
print('starting model two')
print(parent_conn.recv())
print('completed')
このスクリプトを現在書いているときに実行すると、「完了」というメッセージは表示されません。しかし、私がmodel1 = make_model(vecs)
という行をコメントアウトしてもうまくいくでしょう。
問題はこの方法でなければならないということです。これはサーバー用であり、アクティブなモデルを親プロセスにロードする必要があります。 – v4gil
@haafケラスのモデルは、プロセス間で共有できないステートフルなオブジェクトです。残念ながら、kerasはマルチプロセッシングや分散処理を考慮して設計されていませんでした。 –