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

tf.keras.mixed_precision.experimental.Policy

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

Keras層のためのDTYPEポリシー。

ノートPCで使用されます

ガイドで使用

DTYPEポリシーは、その計算可変dtypesような層のDTYPE関連態様を決定します。それぞれの層は、ポリシーを持っています。ポリシーをに渡すことができるdtype層のコンストラクタの引数、またはグローバルポリシーがで設定することができますtf.keras.mixed_precision.experimental.set_policy 。ポリシーがそれのコンストラクタに渡されていない場合層は、グローバルポリシーがデフォルトになります。

多くのモデルでは、各レイヤの方針は、通常のfloat32になり、同じ計算DTYPEと変数DTYPEを、持っています。この場合、我々は、プロパティによって照会することができる層のDTYPE、と単数DTYPEを参照してくださいtf.keras.layers.Layer.dtype

混合精度トレーニングを使用した場合、ほとんどの層は、代わりfloat16又はbfloat16計算DTYPEとのfloat32変数DTYPEを持つことになり、したがって層は、単DTYPEを有していません。変数DTYPEが計算DTYPEと一致しない場合は、変数は自動的に回避型のエラーを計算DTYPEにキャストされます。この場合、 tf.keras.layers.Layer.dtype変数DTYPEはなく、計算DTYPEを指します。参照混合精度ガイドを混合精度の使用方法の詳細については。

特定のポリシーも持ってtf.mixed_precision.experimental.LossScaleで使用されている場合、 tf.keras.Model性能低下のスケーリングに秒。損失スケーリングはfloat16勾配における数値アンダーフローを回避するために、混合精度で使用される技術です。損失スケーリングは唯一のモデルによって行われModel.fitModel.train_on_batch 、および同様の方法。モデルではないレイヤーは、損失規模を無視します。

ポリシーは、例えば、コンストラクタに文字列を渡すことによって構築されているtf.keras.mixed_precision.experimental.Policy('float32')文字列は、計算や変数dtypesを決定します。これは、次のいずれかになります。

  • このような「のfloat32」や「のfloat64」などの任意のDTYPE名、。どちらの変数と計算dtypesはそのDTYPEとなります。損失なしスケーリングはデフォルトでは行われません。
  • 'mixed_float16' または 'mixed_bfloat16':変数DTYPEがのfloat32である計算DTYPEは、float16又はbfloat16あります。これらのポリシーは、混合精度の訓練のために使用されています。 「mixed_float16」で、ダイナミックな損失規模がデフォルトで使用されています。損失のスケーリングがbfloat16と不要であるとして「mixed_bfloat16」は、デフォルトでは何の損失スケーリングしません。

Kerasモデルで混合精度を使用する方法

Kerasモデルで混合精度を使用するように、 'mixed_float16'または'mixed_bfloat16'ポリシーを使用することができます。 tf.keras.mixed_precision.experimental.set_policyポリシーがそれらに渡されていない場合層のデフォルトポリシーを設定するために使用することができます。例えば:

tf.keras.mixed_precision.experimental.set_policy('mixed_float16')
model = tf.keras.models.Sequential([
    tf.keras.layers.Input((100,)),
    # Dense layers use global policy of 'mixed_float16', which does
    # computations in float16 while keeping variables in float32.
    tf.keras.layers.Dense(10),
    tf.keras.layers.Dense(10),
    # Softmax should be done in float32 for numeric stability. We pass
    # dtype='float32' to use float32 instead of the global policy.
    tf.keras.layers.Activation('softmax', dtype='float32')
])

代替的に、ポリシーは、代わりとグローバルポリシー設定の個々の層に渡すことができset_policy

policy = tf.keras.mixed_precision.experimental.Policy('mixed_float16')
model = tf.keras.models.Sequential([
    tf.keras.layers.Input((100,)),
    tf.keras.layers.Dense(10, dtype=policy),
    tf.keras.layers.Dense(10, dtype=policy),
    # Softmax should be done in float32 for numeric stability.
    tf.keras.layers.Activation('softmax', dtype='float32')
])

なお、 'mixed_float16'ポリシーは、デフォルトで損失のスケーリングを適用しますModel.fitModel.train_on_batch 、および他のトレーニング方法。そのような方法が使用されていない場合(例えば、カスタムトレーニングループが使用されている)と'mixed_float16'使用され、損失の規模は、手動で適用する必要があります。参照tf.keras.mixed_precision.experimental.LossScaleOptimizer詳細については。 'mixed_bfloat16' 、損失の拡大縮小は行われず、損失の拡大縮小は、決して手動で適用する必要はありません。

参照混合精密ガイド混合精度の使用方法の詳細は、を

Kerasモデルでのfloat64を使用する方法

float64を使用して混合精度に類似しています。グローバルポリシーはのfloat64に設定することができ、またはどちらかdtype='float64'個々の層に渡すことができます。たとえば、グローバルポリシーを設定するには:

tf.keras.mixed_precision.experimental.set_policy('float64')
model = tf.keras.models.Sequential([
    tf.keras.layers.Input((100,)),
    # All layers use global policy of 'float64', which does computations
    # and creates variables in float64.
    tf.keras.layers.Dense(10),
    tf.keras.layers.Dense(10),
    tf.keras.layers.Activation('softmax')
])
# Optionaly set policy back to float32 if any other models use float32
tf.keras.mixed_precision.experimental.set_policy('float32')

層は、そのポリシーの計算DTYPEを使用していますどのように

層は、例えばTensorFlow 2にその計算DTYPEにその入力をキャストします。

x = tf.ones((4, 4, 4, 4), dtype='float64')
# `layer`'s policy defaults to float32.
layer = tf.keras.layers.Conv2D(filters=4, kernel_size=2)
# `layer` casts it's inputs to its compute dtype, which is float32, and
# does computations in float32.
y = layer(x)
y.dtype
tf.float32

ベースという注意tf.keras.layers.Layerクラスがキャストを挿入します。独自の層をサブクラス化する場合は、任意のキャストを挿入する必要はありません。

現在、レイヤーの最初の引数でのみテンソルcall方法がキャストされています。例えば:

class MyLayer(tf.keras.layers.Layer):
  # Bug! `b` will not be casted.
  def call(self, a, b):
    return a + 1., b + 1.
a = tf.constant(1., dtype="float32")
b = tf.constant(1., dtype="float32")
layer = MyLayer(dtype="float64")
x, y = layer(a, b)
x.dtype
tf.float64
y.dtype
tf.float32

独自の層を書く場合は、最初の引数だけでテンソルを受け入れることをお勧めします。このように、全てのテンソルは、層の計算DTYPEにキャストされています。 MyLayerそのためのように記述する必要があります。

class MyLayer(tf.keras.layers.Layer):
  # Now, all tensor inputs will be casted.
  def call(self, inputs):
    a, b = inputs
    return a + 1., b + 1.
a = tf.constant(1., dtype="float32")
b = tf.constant(1., dtype="float32")
layer = MyLayer(dtype="float64")
x, y = layer((a, b))
x.dtype
tf.float64
y.dtype
tf.float64

他の引数は自動的に技術的な理由のためにキャストされていないが、これは将来のマイナーリリースで変更されることがあります。

のみTensorFlow 2で発生しますが、あれば有効にすることができる鋳造tf.compat.v1.disable_v2_behavior()と呼ばれているtf.compat.v1.keras.layers.enable_v2_dtype_behavior()

層サブクラスを通過させることによってautocastedされることから、その入力を防止することができるautocast=False層コンストラクタに。例えば:

class NonAutoCastingLayer(tf.keras.layers.Layer):
  def __init__(self, **kwargs):
    kwargs['autocast'] = False
    super(NonAutoCastingLayer, self).__init__(**kwargs)
  def call(self, inp):
    return inp
x = tf.ones((4, 4, 4, 4), dtype='float32')
layer = NonAutoCastingLayer(dtype='float64')
y = layer(x)  # Will not cast inputs to it's compute dtype of float64
y.dtype
tf.float32

層は、その政策の変数DTYPEを使用していますどのように

作成された変数のデフォルトのDTYPE tf.keras.layers.Layer.add_weight層の政策の変数DTYPEです。

層の計算と変数dtypesが異なる場合、 add_weightと呼ばれる特別なラッパーと浮動小数点変数ラップしますAutoCastVariable 。このラッパーは内で使用されるとき、それは層の計算DTYPEに自分自身をキャストを除いて元の変数と同じですLayer.call 。外でLayer.call 、変数がキャストされていません。

でラップされるの変数を防止することができる層の作者AutoCastVariable通過させることによってexperimental_autocast=Falseadd_weight

class MyLayer(tf.keras.layers.Layer):
 def build(self, input_shape):
   self.x = self.add_weight('x')
   self.y = self.add_weight('y', experimental_autocast=False)
policy = tf.keras.mixed_precision.experimental.Policy('mixed_float16')
layer = MyLayer(dtype=policy)
layer.build((2, 2))
layer.x
<AutoCastVariable 'x:0' shape=() dtype=float32 true_dtype=float32, numpy=...>
layer.y
<tf.Variable 'y:0' shape=() dtype=float32, numpy=...>

渡すexperimental_autocast=False 、内部変数DTYPE代わりの計算DTYPEにいくつかの計算を行うことの層のために有用です。たとえば、変数DTYPEでは、このような平均と分散などの変数の統計を計算することを望むかもしれません。

混合精度とのfloat64をサポート層の書き方。

ほとんどの部分については、層が自動的に追加の作業をせずに混合精度とのfloat64をサポートする、事実のために、ベース層は、自動的に入力をキャストし、正しい型の変数を作成し、混合精度の場合には、の変数ラップAutoCastVariables

たとえば、この単純な密な層は、混合精度やのfloat64をサポートするために、任意の追加作業を必要としません。 Kerasは、自動的に適切なDTYPEへの入力と変数をキャストします。

class MyDense(tf.keras.layers.Layer):
  def build(self, input_shape):
    self.kernel = self.add_weight('kernel', (input_shape[-1], 10))
  def call(self, inputs):
    return tf.matmul(inputs, self.kernel)
policy = tf.keras.mixed_precision.experimental.Policy('mixed_float16')
layer = MyDense(dtype=policy)
x = np.random.rand(10, 10)
y = layer(x)
y.dtype
tf.float16

このような場合と同様に、新しいテンソルを作成するときに混合精度やのfloat64をサポートするために余分な作業を必要とする主なケースがあるtf.onesまたはtf.constant 。このような場合には、あなたは正しいDTYPEのテンソルを作成する必要があります。たとえば、あなたが変更と仮定MyDense使用して出力に乱数を追加する層をtf.random.normal 。あなたはに入力DTYPEを渡す必要がありtf.random.normal dtypesの一致を保証するために。

class MyDense(tf.keras.layers.Layer):
  def build(self, input_shape):
    self.kernel = self.add_weight('kernel', (input_shape[-1], 10))
  def call(self, inputs):
    rand = tf.random.normal(shape=inputs.shape, dtype=inputs.dtype)
    return tf.matmul(inputs, self.kernel) + rand

layer = MyDense(dtype=policy)
y = layer(x)
y.dtype
tf.float16

あなたが通過しなかった場合はdtype=inputs.dtypeするtf.random.normalTypeError発生しているだろう。 DTYPEのデフォルトためです"float32"入力がのfloat32をした場合、層にのみ動作しますので。

name 文字列。次の値のいずれかになります。

  • このような「のfloat32」や「のfloat64」などの任意のDTYPE名、。どちらの変数と計算dtypesはそのDTYPEとなります。
  • 'mixed_float16' または 'mixed_bfloat16':変数DTYPEがのfloat32である計算DTYPEは、float16又はbfloat16あります。 「mixed_float16」で、ダイナミックな損失規模が使用されています。これらのポリシーは、混合精度の訓練のために使用されています。
loss_scale A tf.mixed_precision.experimental.LossScale (使用、INT FixedLossScale (使用する)、または文字列"動的" DynamicLossScale )。ない限り損失のスケーリングを使用していないデフォルトname 「ダイナミック」にいる場合、このデフォルト設定では、「mixed_float16」です。唯一tf.keras.Modelのではなく、層は、損失のスケールを使用し、それだけの間に使用されるModel.fitModel.train_on_batch 、及び他の同様の方法。

compute_dtype このポリシーの計算DTYPE。

これは、層がで彼らの計算を行いますDTYPEです。

計算DTYPEがfloat16またはbfloat16場合でも、ハードウェアデバイスは、個々のない場合がありますが、[B] float16に、乗算、およびその他の基本的な操作が追加されますが、その代わり、数値安定性のためのfloat32でそれらのいくつかを行うことができます。計算DTYPEは、層実行するTensorFlowオプスの入力と出力のDTYPEあります。内部的には、多くのTensorFlowオプスは、数値安定性を高めるために、のfloat32に一定の内部計算を行う、または[B] float16よりも高い精度を有する他のデバイス内部の中間フォーマットであろう。

例えば、 tf.keras.layers.Dense層は、float16計算DTYPEとGPU上で実行すると、tf.matmulにfloat16入力を渡します。しかし、tf.matmulは使用が中間の数学をFLOAT32行います。 float16のパフォーマンス上の利点は、増加メモリ帯域幅と現代のGPUはまだのfloat32に中間計算を維持しながら、float16にmatmulsを計算するためのハードウェアを専門にしているという事実には、まだ明らかです。

loss_scale このポリシーの損失規模を返します。
name このポリシーの名前を返します。
should_cast_variables 変数をキャストする必要がある場合はTrueを返します。

変数DTYPEが計算DTYPEと同じではない場合、これは本当です。

variable_dtype この方針の変数DTYPE。

これは、層が明確に異なるDTYPEを選択しない限り、DTYPE層は、自分の中で変数を作成しますです。これが異なる場合Policy.compute_dtype 、レイヤーは型エラーを回避するために、計算DTYPEに変数をキャストします。

メソッド

from_config

ソースを表示

get_config

ソースを表示