Path: blob/master/site/ja/model_optimization/guide/pruning/comprehensive_guide.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
プルーニングの総合ガイド
Keras 重みプルーニングの総合ガイドへようこそ。
このページでは、さまざまなユースケースを示し、それぞれで API を使用する方法を説明します。どの API が必要であるかを特定したら、API ドキュメントでパラメータと詳細を確認してください。
次のユースケースについて説明しています。
プルーニングされたモデルの定義とトレーニング
Sequential と Functional
Keras model.fit とカスタムトレーニングループ
プルーニングされたモデルのチェックポイントと逆シリアル化
プルーニングされたモデルのデプロイと圧縮のメリットの確認
プルーニングアルゴリズムの構成については、tfmot.sparsity.keras.prune_low_magnitude
API ドキュメントをご覧ください。
セットアップ
必要な API の特定と目的の理解については、次を実行できますが、このセクションを読まずに進むことができます。
モデルを定義する
すべてのモデルをプルーニングする(Sequential と Functional)
モデルの精度を高めるためのヒント:
「一部のレイヤーをプルーニングする」を試して、最も精度を低下させるレイヤーのプルーニングを省略します。
一般的に、始めからトレーニングするよりも、プルーニングで微調整する方が優れています。
プルーニングでモデル全体をトレーニングするには、モデルに tfmot.sparsity.keras.prune_low_magnitude
を適用します。
一部のレイヤーをプルーニングする(Sequential と Functional)
モデルのプルーニングによって制度に悪影響が及ぶことがあります。そのため、選択的にモデルのレイヤーをプルーニングすることで、精度、速度、およびモデルサイズ間のトレードオフを探ることができます。
モデルの精度を高めるためのヒント:
一般的に、始めからトレーニングするよりも、プルーニングで微調整する方が優れています。
初期のレイヤーの代わりに後のレイヤーのプルーニングを試します。
クリティカルレイヤー(注意メカニズムなど)のプルーニングを回避します。
その他:
tfmot.sparsity.keras.prune_low_magnitude
API ドキュメントには、レイヤーごとにプルーニング構成を変える方法が示されています。
次の例では、Dense
レイヤーのみをプルーニングしています。
この例ではプルーニングするものを決定するためにレイヤーの種類が使用されていますが、特定のレイヤーをプルーニングする上で最も簡単な方法は、name
プロパティを設定し、clone_function
でその名前を探す方法です。
可読性が高くても、モデルの精度を潜在的に低下させる
これは、プルーニングによる微調整とは使用できません。そのため、微調整をサポートする上記の例よりも制度に劣る可能性があります。
初期のモデルを定義する際に prune_low_magnitude
を適用することも可能ですが、後で重みを読み込む場合、以下の例が機能しません。
Functional の例
Sequential の例
カスタム Keras レイヤーのプルーニングまたはプルーニングするレイヤーの部分の変更
一般的な過ち: バイアスをプルーニングすると通常、モデルの精度を著しく悪化させてしまう。
tfmot.sparsity.keras.PrunableLayer
は、2 つのユースケースに役立ちます。
カスタム Keras レイヤーのプルーニング
プルーニングする組み込み Keras レイヤーの部分の変更
たとえば、API はデフォルトで Dense
レイヤーのカーネルのプルーニングのみを行います。以下の例ではバイアスもプルーニングします。
モデルのトレーニング
Model.fit
トレーニング中に tfmot.sparsity.keras.UpdatePruningStep
コールバックを呼び出します。
トレーニングをデバッグできるようにするには、tfmot.sparsity.keras.PruningSummaries
コールバックを使用します。
Colab を使用していないユーザーは、TensorBoard.dev で、このノートブックの前回の実行結果を閲覧できます。
カスタムトレーニングループ
トレーニング中に tfmot.sparsity.keras.UpdatePruningStep
コールバックを呼び出します。
トレーニングをデバッグできるようにするには、tfmot.sparsity.keras.PruningSummaries
コールバックを使用します。
Colab を使用していないユーザーは、TensorBoard.dev で、このノートブックの前回の実行結果を閲覧できます。
プルーニングされたモデルの精度を改善する
まず、tfmot.sparsity.keras.prune_low_magnitude
API ドキュメントを確認し、プルーニングスケジュールが何か、また各種プルーニングスケジュールの計算について理解してください。
ヒント:
モデルがプルーニングする際に、高すぎず低すぎない学習率を使用します。プルーニングスケジュールをハイパーパラメータとすることを検討してください。
簡易テストとして、トレーニング始めに最終的なスパース性までモデルを実験的にプルーニングします。
tfmot.sparsity.keras.ConstantSparsity
スケジュールでbegin_step
を 0 に設定します。良い結果が得る可能性があります。モデルに回復する時間を与えられうように、あまり頻繁にプルーニングしないようにします。プルーニングスケジュールには十分なデフォルトの頻度が指定されています。
モデルの精度を改善するための一般的なアイデアについては、「モデルを定義する」に記載のケース別のヒントをご覧ください。
チェックポイントと逆シリアル化
チェックポイント作成時には、オプティマイザのステップを保持する必要があります。つまり、チェックポイント作成に Keras HDF5 モデルを使用することはできますが、Keras HDF5 の重みは使用できません。
上記は一般的に適用されます。次のコードは、HDF5 モデル形式のみで必要です(HDF5 重みまたはその他の形式では不要です)。
プルーニングされたモデルをデプロイする
サイズ圧縮によるモデルのエクスポート
一般的な過ち: strip_pruning
と標準圧縮アルゴリズム(gzip など)の適用は、プルーニングの圧縮のメリットを確認する上で必要です。
ハードウェア固有の最適化
異なるバックエンドでプルーニングによるレイテンシの改善が可能になったら、ブロックのスパース性を使用することで、特定のハードウェアのレイテンシを改善することができます。
ブロックサイズを大きくすると、ターゲットモデルの精度を得るために達成可能なピークスパース性が低下します。これにも関わらず、レイテンシは改善されることがあります。
ブロックスパース性のサポート状況に関する詳細は、tfmot.sparsity.keras.prune_low_magnitude
API ドキュメントをご覧ください。