2017-06-22 2 views
0

これは私が直面している問題です。私はマルチプロセス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)という行をコメントアウトしてもうまくいくでしょう。

答えて

0

カラスは本当に素晴らしく、ユーザーフレンドリーでかなり素晴らしいです。しかし...それはあなたが "非標準"な何かをしたいと思えば、それが働きにくくなる "マジック"をたくさんします。

親プロセスから子プロセスをフォークすると、元のプロセスには当てはまりますが、子プロセスには当てはまらないいくつかの前提が保持されます。これらの仮定が何であるか把握するためにコードを掘り下げることができます。

p.start()の後に移動すると、すべてが機能することに注意してください。その理由は、子プロセスがケラを「クリーン」状態(何かが実行される前)でコピーするからです。この状態は子プロセスで変更されますが、親プロセスには影響しません。

kerasのすべてのインポートをターゲット関数に移動し、親プロセスでケラスをインポートしないようにすると、安全に多くの子を必要なだけ起動できます。

+0

問題はこの方法でなければならないということです。これはサーバー用であり、アクティブなモデルを親プロセスにロードする必要があります。 – v4gil

+0

@haafケラスのモデルは、プロセス間で共有できないステートフルなオブジェクトです。残念ながら、kerasはマルチプロセッシングや分散処理を考慮して設計されていませんでした。 –

関連する問題