confection
?オブジェクトの任意の木を便利に説明できる構成システムを提供する軽量ライブラリです。
構成は、ハイパーパラメーターとしての機能のほぼすべての詳細を公開することができるため、機械学習コードにとって大きな課題です。露出したい設定は、コールスタック内ではるかに下に任意になっている可能性があるため、CLIまたはREST APIを途中で通過する必要がある場合があります。そして、それらの設定が追加されると、後で削除するのが難しくなります。また、デフォルト値は、逆方向の互換性を壊すことなく変更するのが難しくなります。
この問題を解決するために、 confection
オブジェクトの任意の木を簡単に説明できる構成システムを提供します。オブジェクトは、単純なデコレーターの構文を使用して登録する関数呼び出しを介して作成できます。作成した機能にバージョンすることもできます。これにより、逆方向の互換性を破らずに改善を行うことができます。私たちが知っている最も類似した構成システムは、同様の構文を使用するGINであり、デコレータを使用してコード内の機能に構成システムをリンクすることもできます。 confection
の構成システムはよりシンプルで、Ginの機能のサブセットを介して異なるワークフローを強調しています。
ピップインストール菓子
Conda Install -C Conda -Forge Confection
構成システムは、ような.cfg
ファイルを解析します
[トレーニング] Patience = 10Dropout = 0.2use_vectors = false [training.logging] level = "info" [nlp]#これはトレーニングの値を使用します。use_vectorsuse_vectors= {training.use_vectors} lang = "en"
そして、それをDict
に解決します:
{"Training":{"Patience":10、 "Dropout":0.2、 "use_vectors":false、 "logging":{"level": "info"} }、 "nlp":{"use_vectors":false、 "lang": "en" } }
構成はセクションに分割され、セクション名は正方形のブラケットにあります。たとえば、 [training]
。セクション内では、 =
を使用してキーに設定値を割り当てることができます。値は、Dot表記法とプレースホルダーを使用して、Dot SignとCurly Bracesで示されるプレースホルダーを使用して、他のセクションから参照することもできます。たとえば、 ${training.use_vectors}
トレーニングブロックでuse_vectorsの値を受信します。これは、コンポーネント間で共有される設定に役立ちます。
構成形式には、Pythonの組み込みconfigparser
との3つの主な違いがあります。
JSON形式の値。 confection
json.loads
を介してすべての値を渡してそれらを解釈します。文字列、フロート、整数、ブーチャンなどの原子値を使用することも、リストやマップなどの複雑なオブジェクトを使用することもできます。
構造化されたセクション。 confection
ドット表記を使用して、ネストされたセクションを構築します。 [section.subsection]
という名前のセクションがある場合、 confection
それをネストされた構造に解析し、セクション内にサブセクションを配置します。
レジストリ関数への参照。キーが@
で始まる場合、 confection
その値を関数レジストリの名前として解釈し、その名前に登録されている関数をロードし、ブロックの残りの部分に引数として渡します。関数でタイプのヒントが利用可能な場合、引数値(および関数の戻り値)がそれらに対して検証されます。これにより、 batch_size
にフロートを生成する関数が入力されるトレーニングパイプラインなど、複雑な構成を表現できます。
あなたが従わなければならない事前に定義されたスキームはありません。トップレベルのセクションのセットアップ方法はあなた次第です。最後に、スクリプトで使用できる値を備えた辞書を受け取ります。完全な初期化された関数であろうと、基本設定のみです。
たとえば、新しいオプティマイザーを定義したいとします。 config.cfg
でその引数を次のように定義します。
[optimizer] @optimizers = "my_cool_optimizer.v1" Learn_rate = 0.001Gamma = 1E-8
catalogue
レジストリを使用してこの構成をロードして解析するには( catalogue
を個別にインストールします)。
Import Import Union、IterableImport Cataloguefrom Comatogefrom Import Registry、Config#config#comed new registry.optimizers = catalogue.create.create.create( "confection"、 "optimizers"、entry_points = false)#ダミーオプティマイザークラスを定義します。 myCooloptimizer:Learn_rate:Floatgamma: [email protected]( "my_cool_optimizer.v1")def make_my_optimizer(learn_my_optimizer:union [float、iterable [float]]、gamma:float):mycooloptimizer(Learn_rate、Gamma)#return configファイルをDiskからロードし、解決します。 ITとInstantiated Optimizer object.config =を取得しますconfig()。from_disk( "./ config.cfg")resolved = registry.resolve(config)optimizer = resolved ["optimizer"] #myCooloptimizer(Learn_rate = 0.001、Gamma = 1E-08)
ショ和 注意:mypy
などのタイプチェッカーは、この方法でregistry
に新しい属性を追加することをマークします-IEregistry.new_attr = ...
- エラーとして。これは、初期化後に新しい属性がクラスに追加されるためです。 TypeCheckersを使用している場合、これを無視するか(# type: ignore
無視:mypy
の場合は無視)、TypeSafeの代替手段を使用できます。registry.new_attr = ...
、setattr(registry, "new_attr", ...)
。
ボンネットの下で、 confection
"my_cool_optimizer.v1"
関数を「オプティマイザー」レジストリで検索し、それを引数learn_rate
とgamma
で呼び出します。関数にタイプの注釈がある場合、入力も検証します。たとえば、 learn_rate
がフロートとして注釈され、構成が文字列を定義する場合、 confection
エラーを上げます。
THINCドキュメントは、構成システムに関する詳細情報を提供します。
再帰ブロック
可変位置引数の定義
補間を使用します
カスタムレジストリを使用します
Pydanticによる高度なタイプの注釈
ベーススキーマを使用します
デフォルトで構成を入力します
Config
このクラスはモデルとトレーニングの構成を保持し、文字列、ファイル、またはバイトからINIスタイルの構成形式をロードおよび保存できます。 Config
クラスはdict
のサブクラスであり、PythonのConfigParser
フードの下に使用します。
Config.__init__
オプションのデータを使用して新しいConfig
オブジェクトを初期化します。
菓子の輸入configconfig = config({"Training":{"Patience":10、 "Dropout":0.2}})
口論 | タイプ | 説明 |
---|---|---|
data | Optional[Union[Dict[str, Any], Config]] | 設定を初期化するオプションのデータ。 |
section_order | Optional[List[str]] | 保存されてロードされた構成をソートするために使用される上位レベルのセクション名。他のすべてのセクションは、アルファベット順にソートされます。 |
is_interpolated | Optional[bool] | 構成が補間されているかどうか、または変数が含まれているかどうか。 Config のインスタンスであり、その他のデフォルトがTrue である場合は、 data から読み取ります。 |
Config.from_str
文字列から構成をロードします。
菓子の輸入configconfig_str = "" "[training] patience = 10dropout = 0.2" "" config = config()。 0.2}}
口論 | タイプ | 説明 |
---|---|---|
text | str | ロードする文字列構成。 |
interpolate | bool | ${section.key} のような変数を補間するかどうか。デフォルトはTrue です。 |
overrides | Dict[str, Any] | 値とセクションのオーバーライド。キーは、値にマッピングされた"training.dropout" などのDOT表記で提供されます。 |
返品 | Config | ロードされた構成。 |
Config.to_str
文字列から構成をロードします。
confection configconfig = config({"Training":{"Patience":10、 "Dropout":0.2}})print(config.to_str())# '[Training] npatience = 10nndropout = 0.2'
口論 | タイプ | 説明 |
---|---|---|
interpolate | bool | ${section.key} のような変数を補間するかどうか。デフォルトはTrue です。 |
返品 | str | 文字列構成。 |
Config.to_bytes
構成をバイト文字列にシリアル化します。
confection configconfig = config({"Training":{"Patience":10、 "Dropout":0.2}})config_bytes = config.to_bytes()print(config_bytes)#b '[トレーニング] npatience = 10nndropout = 0.2'
口論 | タイプ | 説明 |
---|---|---|
interpolate | bool | ${section.key} のような変数を補間するかどうか。デフォルトはTrue です。 |
overrides | Dict[str, Any] | 値とセクションのオーバーライド。キーは、値にマッピングされた"training.dropout" などのDOT表記で提供されます。 |
返品 | str | シリアル化された構成。 |
Config.from_bytes
バイト文字列から構成をロードします。
confection configconfig = config({"Training":{"Patience":10、 "Dropout":0.2}})config_bytes = config.to_bytes()new_config = config()。from_bytes(config_bytes)
口論 | タイプ | 説明 |
---|---|---|
bytes_data | bool | ロードするデータ。 |
interpolate | bool | ${section.key} のような変数を補間するかどうか。デフォルトはTrue です。 |
返品 | Config | ロードされた構成。 |
Config.to_disk
構成をファイルにシリアル化します。
菓子の輸入configconfig = config({"Training":{"Patience":10、 "Dropout":0.2}})config.to_disk( "./ config.cfg")
口論 | タイプ | 説明 |
---|---|---|
path | Union[Path, str] | ファイルパス。 |
interpolate | bool | ${section.key} のような変数を補間するかどうか。デフォルトはTrue です。 |
Config.from_disk
ファイルから構成をロードします。
confection configconfig = config({"トレーニング":{"Patience":10、 "Dropout":0.2}})config.to_disk( "./ config.cfg")new_config = config()。 config.cfg ")
口論 | タイプ | 説明 |
---|---|---|
path | Union[Path, str] | ファイルパス。 |
interpolate | bool | ${section.key} のような変数を補間するかどうか。デフォルトはTrue です。 |
overrides | Dict[str, Any] | 値とセクションのオーバーライド。キーは、値にマッピングされた"training.dropout" などのDOT表記で提供されます。 |
返品 | Config | ロードされた構成。 |
Config.copy
configをディープコピー。
口論 | タイプ | 説明 |
---|---|---|
返品 | Config | コピーされた構成。 |
Config.interpolate
${section.value}
または${section.subsection}
などの変数を補間し、補間値を持つ構成のコピーを返します。 configがinterpolate=False
、たとえばConfig.from_str
でロードされている場合は使用できます。
菓子の輸入configconfig_str = "" "[hyper_params] dropout = 0.2 [トレーニング] dropout = $ {hyper_params.dropout}" "" config = config()。 )#{'Dropout': '$ {hyper_params.dropout}'}} config = config.interpolate()print(config ["Training"])#{'Dropout':0.2}}}
口論 | タイプ | 説明 |
---|---|---|
返品 | Config | 補間値を持つ構成のコピー。 |
Config.merge
現在の構成をデフォルトとして使用して、ディープマージ2つの構成オブジェクト。セクションと辞書のみをマージし、リストのような他の値ではありません。更新で提供される値は、ベース設定で上書きされ、新しい値またはセクションが追加されます。 config値が${section.key}
のような変数である場合(たとえば、configがinterpolate=False)
、更新が異なる値を提供している場合でも、変数が推奨されます。これにより、変数参照がマージによって破壊されないことが保証されます。
ショ和 @
syntaxを使用して登録された関数を参照するブロックは、同じ関数を参照している場合にのみマージされることに注意してください。それ以外の場合、異なる関数は異なる引数を取得できるため、マージは無効な構成を簡単に生成できます。ブロックが異なる関数を指す場合、上書きされます。
菓子の輸入からConfigbase_config_str = "" "" [Training] Patience = 0.2 "" "" update_config_str = "" "[Training] dropout = 0.1max_epochs = 2000" "" base_config = config()。 ).from_str(update_config_str)merged = config(base_config).merge(update_config)print(合併["トレーニング"])
口論 | タイプ | 説明 |
---|---|---|
overrides | Union[Dict[str, Any], Config] | configにマージするための更新。 |
返品 | Config | マージされた構成を含む新しい構成インスタンス。 |
口論 | タイプ | 説明 |
---|---|---|
is_interpolated | bool | 構成値が補間されているかどうか。デフォルトはTrue になり、configがinterpolate=False で読み込まれている場合、 False に設定されます。たとえば、 Config.from_str を使用します。 |