confection
?是一個輕巧的庫,提供配置系統,可讓您方便地描述對象的任意樹。
對於機器學習代碼,配置是一個巨大的挑戰,因為您可能需要將任何功能的任何細節視為超參數。您要公開的設置可能任意地在您的呼叫堆棧中,因此它可能需要通過任何數量的中間功能一直通過CLI或REST API傳遞,從而影響了沿途所有事物的接口。然後,一旦添加了這些設置,它們就會很難刪除。默認值也很難在不向後兼容的情況下更改。
為了解決此問題, confection
提供了一個配置系統,可讓您輕鬆地描述對象的任意樹。可以通過函數調用您使用簡單的裝飾器語法進行註冊。您甚至可以版本創建的功能,從而可以進行改進而不向後兼容。我們知道的最相似的配置系統是使用類似語法的Gin,還允許您使用裝飾器將配置系統鏈接到代碼中的功能。 confection
的配置系統更簡單,並通過杜松子酒功能的子集強調了不同的工作流程。
PIP安裝糖果
conda安裝-c conda -forge糖果
配置系統.cfg
[訓練]耐心= 10Dropout = 0.2USE_VECTORS = false [triaghting.logging] level =“ info” [nlp]#這使用訓練的值
並將其解析為一個Dict
:
{“訓練”:{“耐心”:10,“輟學”:0.2,“ use_vectors”:false,“登錄”:{“ level”:“ info”} },“ nlp”:{“ use_vectors”:false,“ lang”:“ en” } }
該配置分為各節,並在方括號中使用截面名稱,例如[training]
。在各節中,可以使用=
將配置值分配給密鑰。還可以使用點表示法和占位符以美元符號和捲髮括號指示的佔位符從其他部分中引用值。例如, ${training.use_vectors}
將在培訓塊中接收use_vectors的值。這對於跨組件共享的設置很有用。
配置格式與Python的內置configparser
有三個主要區別:
JSON形式的值。 confection
通過json.loads
負載通過所有值來解釋它們。您可以使用字符串,浮點,整數或布爾值等原子值,也可以使用列表或地圖之類的複雜對象。
結構化部分。 confection
使用點符號來構建嵌套部分。如果您有一個名為[section.subsection]
的部分, confection
將將其分解為嵌套結構,將小節放置在章節中。
參考註冊表功能。如果密鑰以@
開頭, confection
將其值解釋為函數註冊表的名稱,請加載為該名稱註冊的函數,然後將其作為參數中的其餘部分傳遞。如果類型提示在函數上可用,則將對其進行驗證參數值(以及函數的返回值)。這使您可以表達複雜的配置,例如訓練管道,該管道將batch_size
由產生浮子的函數填充。
您沒有必須遵循預定義的計劃;您如何設置頂級部分取決於您。最後,您將收到一個具有腳本中可以使用的值的字典 - 無論是完整的初始化函數還是基本的設置。
例如,假設您要定義一個新的優化器。您會在config.cfg
中定義其參數:
[優化器] @optimizers =“ my_cool_optimizer.v1” learn_rate = 0.001gamma = 1e-8
使用catalogue
註冊表加載和解析此配置(單獨安裝catalogue
):
從輸入導入聯合,iToshimport catalogue frof catalogue intum incort註冊表,config#創建新的registry.registry.optimizers = catalogue.create(“糖果”,“優化_points”,entry_points = false)#定義一個dummy optimizer類。 MyCoolOptimizer:learn_rate: floatgamma: [email protected]("my_cool_optimizer.v1")def make_my_optimizer(learn_rate: Union[float, Iterable[float]], gamma: float):return MyCoolOptimizer(learn_rate, gamma)# Load the來自磁盤的config file,解決並獲取實例化的優化object.config = config()。from_disk(“ ./ ./ config.cfg”)resolved = gungistry.reslove.resolve(config)optimaver(inform)optimizer = resolved [oferved = rowed ['ipportizer'#myCoolOptimizer(learned_rate) = 0.001,伽馬= 1E-08)
配x 注意:類型檢查器(例如mypy
將標記以這種方式向registry
中添加新屬性-IEregistry.new_attr = ...
作為錯誤。這是因為初始化後,將新屬性添加到類中。如果您使用的是Typecheckers,則可以忽略此(例如使用# type: ignore
mypy
)或使用typeafe替代方案:而不是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
對象。
來自糖果import import configconfig = config({“訓練”:{“耐心”:10,“ dropot”:0.2}})
爭論 | 類型 | 描述 |
---|---|---|
data | Optional[Union[Dict[str, Any], Config]] | 可選數據以初始化配置。 |
section_order | Optional[List[str]] | 頂級截面名稱,按順序排序保存和加載的配置。所有其他部分將按字母順序排序。 |
is_interpolated | Optional[bool] | 是配置是插值還是包含變量。從data 中讀取是否是Config 的實例,否則默認為True 。 |
Config.from_str
從字符串加載配置。
從糖果導入confimconconfig_str =“”“” [訓練] patience = 10dropout = 0.2“” config = config()。from_str(config_str)print(config [config [“ triaght'triaght'])#{'耐心':10, 'droppout': 0.2}}}
爭論 | 類型 | 描述 |
---|---|---|
text | str | 字符串配置要加載。 |
interpolate | bool | 是否要插入${section.key} 之類的變量。默認為True 。 |
overrides | Dict[str, Any] | 覆蓋值和部分。鍵以DOT表示法提供,例如"training.dropout" 映射到該值。 |
返回 | Config | 加載配置。 |
Config.to_str
從字符串加載配置。
來自糖果import import configconfig = config({“ triagh”:{“耐心”:10,“ dropout”:0.2}})print(config.to_to str())#'[triending] npatience = 10nnDropout = 0.2'
爭論 | 類型 | 描述 |
---|---|---|
interpolate | bool | 是否要插入${section.key} 之類的變量。默認為True 。 |
返回 | str | 字符串配置。 |
Config.to_bytes
將配置序列化為字節字符串。
來自糖果import import configconfig = config({“培訓”:{“耐心”:10,“ dropt”:0.2}})config_bytes = config.to_to_bytes()print(config_bytes)#b'[triaght triending]
爭論 | 類型 | 描述 |
---|---|---|
interpolate | bool | 是否要插入${section.key} 之類的變量。默認為True 。 |
overrides | Dict[str, Any] | 覆蓋值和部分。鍵以DOT表示法提供,例如"training.dropout" 映射到該值。 |
返回 | str | 序列化配置。 |
Config.from_bytes
從字節字符串加載配置。
來自糖果import import configconfig = config({“培訓”:{“耐心”:10,“ dropout”:0.2}})config_bytes = config.to_bytes()new_config = config()。
爭論 | 類型 | 描述 |
---|---|---|
bytes_data | bool | 加載的數據。 |
interpolate | bool | 是否要插入${section.key} 之類的變量。默認為True 。 |
返回 | Config | 加載配置。 |
Config.to_disk
將配置序列化為文件。
來自糖果import import configconfig = config({“訓練”:{“耐心”:10,“ dropot”:0.2}})config.to_disk(“ ./ config.cfg”)
爭論 | 類型 | 描述 |
---|---|---|
path | Union[Path, str] | 文件路徑。 |
interpolate | bool | 是否要插入${section.key} 之類的變量。默認為True 。 |
Config.from_disk
從文件加載配置。
來自糖果import import configconfig = config({“培訓”:{“耐心”:10,“ dropt”: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] | 覆蓋值和部分。鍵以DOT表示法提供,例如"training.dropout" 映射到該值。 |
返回 | Config | 加載配置。 |
Config.copy
深拷貝配置。
爭論 | 類型 | 描述 |
---|---|---|
返回 | Config | 複製的配置。 |
Config.interpolate
插值變量,例如${section.value}
或${section.subsection}
,並返回帶有插值值的配置副本。如果配置加載了interpolate=False
,例如Config.from_str
,則可以使用。
從糖果導入confimconconfig_str =“”“ [hyper_params]輟學= 0.2 [訓練]輟學= $ {hyper_params.dropout}“”“ config = config()。config()。 )#{'dropout':'$ {hyper_params. dropout}'}}}} config = config.interpalle()print(config [“ triending”])#{'dropfout':0.2}}}
爭論 | 類型 | 描述 |
---|---|---|
返回 | Config | 帶有插值值的配置副本。 |
Config.merge
Deep-Merge兩個配置對象,使用當前配置作為默認值。僅合併部分和詞典,而不是其他值等值。更新中提供的值在基本配置中被覆蓋,並添加任何新值或部分。如果配置值是一個變量,例如${section.key}
(例如,如果配置加載了interpolate=False)
,則首選該變量,即使更新提供了不同的值。這樣可以確保變量引用不會被合併破壞。
配x 請注意,僅當使用@
語法引用註冊函數的塊僅在提到相同功能時才合併。否則,合併很容易產生無效的配置,因為不同的功能可以採用不同的參數。如果一個塊是指其他功能,則覆蓋它。
來自糖果導入import confimbase_config_str =“”“ [訓練]耐心= 10dropout = 0.2“”“ update_config_str =”“” [訓練] droppout = 0.1max_epochs = 2000“ base_config = config()。 ).from_str(update_config_str)erged = config =(base_config).merge(update_config)print(merged [“ triending”])#{'耐心':10,'droppout':0.1,'max_epochs':2000}
爭論 | 類型 | 描述 |
---|---|---|
overrides | Union[Dict[str, Any], Config] | 合併到配置中的更新。 |
返回 | Config | 一個包含合併配置的新配置實例。 |
爭論 | 類型 | 描述 |
---|---|---|
is_interpolated | bool | 配置值是否已插值。默認為True ,並設置為False 如果配置加載了interpolate=False ,例如使用Config.from_str 。 |