このページは Cloud Translation API によって翻訳されました。
Switch to English

tf.CriticalSection

TensorFlow 1つのバージョン GitHubの上のソースを表示

クリティカルセクション。

CriticalSectionオブジェクトは、 シリアルためにサブグラフを実行グラフ内のリソースです。 1が排他的に実行することを望むかもしれない部分グラフの一般的な例は、以下の関数によって与えられたものです。

 v = resource_variable_ops.ResourceVariable(0.0, name="v")

def count():
  value = v.read_value()
  with tf.control_dependencies([value]):
    with tf.control_dependencies([v.assign_add(1)]):
      return tf.identity(value)
 

ここで、スナップショットのvでキャプチャされvalue 。その後、 v更新されます。スナップショットの値が返されます。

複数の労働者やスレッドがすべて実行した場合count並行して、変数へのアクセスという保証はありませんv任意のスレッドの計算内の任意の点でアトミックであるcount 。実際には、さえ保証ユーザーは、それぞれの値が表示されますことを、原子カウンター実装0, 1, ...,現在は不可能です。

解決策は、基礎となるリソースへのアクセスを確実にするためであるv唯一のクリティカルセクションを介して処理されます。

 cs = CriticalSection()
f1 = cs.execute(count)
f2 = cs.execute(count)
output = f1 + f2
session.run(output)
 

関数f1f2逐次実行され、への更新vアトミックになります。

ノート

クリティカルセクションとそのクリティカルセクションの実行される機能の任意の捕捉変数を含むすべてのリソース・オブジェクトは、同じデバイス(ホストとCPU / GPU)と同じ場所に配置されます。

同じリソース上の複数のクリティカルセクションを使用する場合は、それらのリソースへの排他的アクセスの保証はありません。この動作は、デフォルトでは許可されていない(ただし、kwargの参照されexclusive_resource_access )。

例えば、二つの別々のクリティカルセクションに同じ機能を実行すると、シリアル実行を保証しません。

 v = tf.compat.v1.get_variable("v", initializer=0.0, use_resource=True)
def accumulate(up):
  x = v.read_value()
  with tf.control_dependencies([x]):
    with tf.control_dependencies([v.assign_add(up)]):
      return tf.identity(x)
ex1 = CriticalSection().execute(
  accumulate, 1.0, exclusive_resource_access=False)
ex2 = CriticalSection().execute(
  accumulate, 1.0, exclusive_resource_access=False)
bad_sum = ex1 + ex2
sess.run(v.initializer)
sess.run(bad_sum)  # May return 0.0
 

name

メソッド

execute

ソースを表示

関数の実行fn()クリティカルセクション内。

fn任意の引数を受け入れるべきではありません。呼び出すときに追加の引数を追加するにはfnクリティカルセクションで、ラムダを作成します。

 critical_section.execute(lambda: fn(*my_args, **my_kwargs))
 

引数
fn 実行する機能。少なくとも一つのテンソルを返す必要があります。
exclusive_resource_access かどうかによって、必要なリソースfnこれに排他的であるべきCriticalSection 。デフォルト: True 。あなたはこれを設定することをお勧めしますFalse使用すると、2つの異なるCriticalSectionsに読み取り専用モードでのリソースにアクセスする場合。
name 実行操作を作成するときに使用する名前。

戻り値
返されたテンソルfn()

発生させます
ValueError もしfn試みは、このロックするCriticalSectionデッドロックを引き起こす可能性が任意のネストされたか、怠惰な方法で。
ValueError 場合exclusive_resource_access == Trueと別のCriticalSection同じリソースを要求実行持っているfn . Note, even if exclusive_resource_accessがis, if another execution in anotherクリティカルセクションをwas created without exclusive_resource_access =真, a ValueError`を送出が発生します。