Chainerの設定

Chainerはいくつかの機能の挙動に影響を与えるグローバル設定を提供しています。このような設定は、一元的な設定システムを利用して、設定することが可能です。このシステムは各プロセス、各スレッドに対して透明性のある方法を提供します。

 

この設定はchainer.global_configchainer.config という2つのグローバル・オブジェクトで構成されています。

 

  • global_configオブジェクトは、Pythonの処理に共有された設定を保持します。 これは、GlobalConfig クラスのインスタンスで、シンプルなオブジェクトとして用いられます。ユーザは 自由にその属性を設定できます。
  • configオブジェクトは現在のスレッドのための設定を保持します。これはLocalConfigクラスのインスタンスです。このクラスはスレッドローカルのオブジェクトのように振る舞います。どの属性への変更も、カレントスレッドから必ず可視になります。

与えられたキーにどんな値も設定されていない場合は、global_configがそのまま参照されます。この、透明性のある参照方法のおかげで、スレッドローカルのconfig設定を用いるか、そうでなければデフォルトのglobal_configの設定を利用出来るので、ユーザはどんな設定項目も常に読み込んで使用することが出来ます。

下記の設定項目が、現在Chainerによって提供されています。幾つかの項目は、デフォルト値が設定された環境変数によってサポートされています。デフォルト値はglobal_configに設定されることにご注意ください。

chainer.config.cudnn_deterministic
cuDNN APIsにおける決定的な計算を行うかどうか設定するフラグ。 Trueが設定されている場合、決定的モードのcuDNNを使用した畳み込み演算を行う。(つまり、演算結果に再現性がある)。True以外が設定されている場合、パフォーマンスと引き換えに、cuDNNを使用した畳込み演算の結果は非決定的なものになる可能性がある。デフォルト値は False
chainer.config.debug
デバッグモード・フラグ。 Trueが設定されている場合、Chainerはデバッグモードで動作する。デバッグモードについての詳細は、 Debug mode 参照。 デフォルト値は、環境変数 CHAINER_DEBUG が0か1で設定されてる場合それに従い、設定がない場合は False
chainer.config.enable_backprop
バックプロパゲーション(誤差逆伝播法)のサポートを有効にするフラグ。 Trueが設定されている場合、 Function は Variable のバックプロパゲーション用の計算グラフを作成する。それ以外では、計算グラフは作成されない。そのため、ユーザは backward() メソッドを呼び出すことができない。 デフォルト値は True
chainer.config.keep_graph_on_report
report() に計算グラフを保持させるかどうかを設定するフラグ。 Falseが設定されている場合、 report() は Variable オブジェクトがリポートされた時、計算グラフを保持しない。 つまり、 report() は計算グラフから切り離した Variable オブジェクトのコピーを格納する。 Trueが設定されている場合、 report() は計算グラフが付属したまま Variable オブジェクトを格納する。デフォルト値は False
chainer.config.train
訓練モードフラグ。Trueが設定されている場合、 Chainerは訓練モードで動作する。 それ以外の場合は、テスト(評価)モードで動作する。デフォルト値は True
chainer.config.type_check
型チェックモードフラグ。 Trueが設定されている場合、 Function アプリケーションに対する入力値のデータの種類と型について、Chainerは型チェックを行う。 それ以外の場合では、型チェックはスキップされる。環境変数のCHAINER_TYPE_CHECK に0か1が設定されている場合は、それがデフォルト値になり、設定されていない場合は True
chainer.config.use_cudnn
cuDNNを使用するかどうかのフラグ。 'always'、 'auto'、 'never'の3つのフラグ値から選択する。各フラグの意味は下記の通り。
'always'が設定されている場合、Chainer は cuDNN を可能な限り使用するよう試みる。 'auto'が設定されている場合、Chainerはパフォーマンスが落ちない限り、 cuDNNを使用する。 'never'が設定されている場合、Chainer は cuDNN を使用しない。 デフォルト値は 'auto'

 

 

ユーザは、2つの方法でユーザ用の設定を定義出来ます。

  • Chainerの configuration オブジェクトを使用する方法。この場合、Chainerに将来的に導入される設定項目との名前の競合を避けるため、プレフィックスに"user_"と付けることを強く推奨します。
  • ユーザが作成したconfigurationオブジェクトを使用する方法。ユーザは、 chainer.configuration.GlobalConfigchainer.configuration.LocalConfigを利用して、自分自身のconfigurationオブジェクトを定義可能です。この場合、名前の競合について考える必要はありません。

★ Example

この設定をプロセス内で共有したい場合、global_configの属性を設定します。

>>> chainer.global_config.user_my_setting = 123

 

この値は自動的にローカルのconfigを参照して抽出されます。

>>> chainer.config.user_my_setting
123

 

この属性がローカルに設定してある場合、カレントスレッドからのみ参照可能です。

>>> chainer.config.user_my_setting = 123

 

ときには、カレントスレッドの設定を一時的に変更したい場合があるでしょう。 その場合、 using_config()を使用します。例えば、コードのある一部分においては、デバッグモードを有効にしたいという場合、下記のようにします。

>>> with chainer.using_config('debug', True):
... pass # code running in the debug mode

 

また、評価のためにテストモードにスイッチしたいことがありますが、これも同様に書くことが出来ます。

>>> with chainer.using_config('train', False):
... pass # code running in the test mode

 

Evaluator は自動的にテストモードにスイッチするので、評価のための損失関数において、手作業でスイッチする必要はないことに注意してください。 また、下記のようにコーディングすることで、訓練モードとテストモードで違う挙動をさせることも可能です。

if chainer.config.train: pass # code only running in the training mode
else: pass # code only running in the test mode

 

chainer.global_config Chainerのグローバル設定となるプレーンなオブジェクト
chainer.config Chainerのスレッドローカル設定
chainer.using_config スレッドローカル設定を一時的に変更するためのコンテクストマネージャ
chainer.configuration.GlobalConfig Chainerのグローバル設定となるプレーンなオブジェクト
chainer.configuration.LocalConfig Chainerのスレッドローカル設定