<a href="https://explosion.ai"><img src="https://yellow-cdn.veclightyear.com/835a84d5/244aa900-bb43-4ca1-bfb7-c5582af01c91.svg" width="125" height="125" align="right" /></a>
confection :candy: 是一个轻量级库,提供了一个配置系统,让你可以方便地描述任意对象树。
配置对于机器学习代码来说是一个巨大的挑战,因为你可能想要将任何函数的几乎所有细节作为超参数暴露出来。你想要暴露的设置可能在调用栈的任意深处,所以它可能需要从 CLI 或 REST API 一直传递下去,通过任意数量的中间函数,影响沿途的所有接口。一旦添加了这些设置,以后就很难删除。默认值也变得难以更改而不破坏向后兼容性。
为了解决这个问题,confection 提供了一个配置系统,让你可以轻松描述任意对象树。可以通过使用简单的装饰器语法注册的函数调用来创建对象。你甚至可以对创建的函数进行版本控制,允许你在不破坏向后兼容性的情况下进行改进。我们所知的最相似的配置系统是 Gin,它使用类似的语法,也允许你使用装饰器将配置系统链接到代码中的函数。confection 的配置系统更简单,通过 Gin 功能的一个子集强调了不同的工作流程。
pip install confection
conda install -c conda-forge confection
配置系统解析一个类似这样的 .cfg 文件:
[training] patience = 10 dropout = 0.2 use_vectors = false [training.logging] level = "INFO" [nlp] # 这里使用 training.use_vectors 的值 use_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]。在各个部分内,可以使用 = 将配置值分配给键。也可以使用点号表示法和由美元符号和大括号指示的占位符从其他部分引用值。例如,${training.use_vectors} 将接收 training 块中 use_vectors 的值。这对于在组件之间共享的设置很有用。
配置格式与 Python 内置的 configparser 有三个主要区别:
confection 将所有值通过 json.loads 传递以解释它们。你可以使用原子值,如字符串、浮点数、整数或布尔值,也可以使用复杂对象,如列表或映射。confection 使用点号表示法来构建嵌套部分。如果你有一个名为 [section.subsection] 的部分,confection 将把它解析成一个嵌套结构,将 subsection 放在 section 内。@ 开头,confection 会将其值解释为函数注册表的名称,加载为该名称注册的函数,并将块的其余部分作为参数传入。如果函数有类型提示,参数值(和函数的返回值)将根据这些提示进行验证。这让你可以表达复杂的配置,比如一个训练流水线,其中 batch_size 由一个产生浮点数的函数填充。没有预定义的方案你必须遵循;如何设置顶级部分由你决定。最后,你将收到一个包含这些值的字典,你可以在脚本中使用 - 无论是完全初始化 的函数,还是只是基本设置。
例如,假设你想定义一个新的优化器。你可以在 config.cfg 中这样定义它的参数:
[optimizer] @optimizers = "my_cool_optimizer.v1" learn_rate = 0.001 gamma = 1e-8
要使用 catalogue 注册表加载和解析这个配置(需要单独安装 catalogue):
import dataclasses from typing import Union, Iterable import catalogue from confection import registry, Config # 创建一个新的注册表 registry.optimizers = catalogue.create("confection", "optimizers", entry_points=False) # 定义一个虚拟优化器类 @dataclasses.dataclass class MyCoolOptimizer: learn_rate: float gamma: float @registry.optimizers.register("my_cool_optimizer.v1") def make_my_optimizer(learn_rate: Union[float, Iterable[float]], gamma: float): return MyCoolOptimizer(learn_rate, gamma) # 从磁盘加载配置文件,解析它并获取实例化的优化器对象 config = Config().from_disk("./config.cfg") resolved = registry.resolve(config) optimizer = resolved["optimizer"] # MyCoolOptimizer(learn_rate=0.001, gamma=1e-08)
⚠️ 注意:类型检查器(如
mypy)会将以这种方式向registry添加新属性(即registry.new_attr = ...)标记为错误。这是因为在初始化后向类添加了新属性。如果你使用类型检查器,你可以忽略这个错误(例如,对于mypy使用# type: ignore),或者使用类型安全的替代方法:不使用registry.new_attr = ...,而使用setattr(registry, "new_attr", ...)。
在内部,confection 将在 "optimizers" 注册表中查找 "my_cool_optimizer.v1" 函数,然后用参数 learn_rate 和 gamma 调用它。如果函数有类型注解,它还会验证输入。例如,如果 learn_rate 被注解为 float,而配置定义了一个字符串,confection 将引发一个错误。
Thinc 文档提供了有关配置系统的更多信息:
Config这个类保存模型和训练配置,可以从/到字符串、文件或字节加载和保存 INI 风格的配置格式。Config 类是 dict 的子类,内部使用 Python 的 ConfigParser。
Config.__init__</sup>用可选数据初始化一个新的 Config 对象。
from confection import Config config = Config({"training": {"patience": 10, "dropout": 0.2}})
| 参数 | 类型 | 描述 |
|---|---|---|
data | Optional[Union[Dict[str, Any], Config]] | 用于初始化配置的可选数据。 |
section_order | Optional[List[str]] | 按顺序排列的顶级部分名称,用于排序保存和加载的配置。所有其他部分将按字母顺序排序。 |
is_interpolated | Optional[bool] | 配置是否已插值或是否包含变量。如果 data 是 Config 实例,则从中读取,否则默认为 True。 |
Config.from_str</sup>从字符串加载配置。
from confection import Config config_str = """ [training] patience = 10 dropout = 0.2 """ config = Config().from_str(config_str) print(config["training"]) # {'patience': 10, 'dropout': 0.2}}
| 参数 | 类型 | 描述 |
|---|---|---|
text | str | 要加载的字符串配置。 |
interpolate | bool | 是否插值类似 ${section.key} 的变量。默认为 True。 |
overrides | Dict[str, Any] | 值和部分的覆盖。键以点号表示法提供,例如 "training.dropout" 映射到值。 |
| 返回 | Config | 加载的配置。 |
Config.to_str</sup>将配置加载为字符串。
from confection import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) print(config.to_str()) # '[training]\npatience = 10\n\ndropout = 0.2'
| 参数 | 类型 | 描述 |
|---|---|---|
interpolate | bool | 是否插值类似 ${section.key} 的变量。默认为 True。 |
| 返回 | str | 字符串配置。 |
Config.to_bytes</sup>将配置序列化为字节字符串。
from confection import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) config_bytes = config.to_bytes() print(config_bytes) # b'[training]\npatience = 10\n\ndropout = 0.2'
| 参数 | 类型 | 描述 |
|---|---|---|
interpolate | bool | 是否插值类似 ${section.key} 的变量。默认为 True。 |
overrides | Dict[str, Any] | 值和部分的覆盖。键以点号表示法提供,例如 "training.dropout" 映射到值。 |
| 返回 | str | 序列化的配置。 |
Config.from_bytes</sup>从字节字符串加载配置。
from confection import Config config = 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</sup>将配置序列化到文件。
from confection import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) config.to_disk("./config.cfg")
| 参数 | 类型 | 描述 |
|---|---|---|
path | Union[Path, str] | 文件路径。 |
interpolate | bool | 是否插值如 ${section.key} 的变量。默认为 True。 |
Config.from_disk</sup>从文件加载配置。
from confection import Config config = Config({"training": {"patience": 10, "dropout": 0.2}}) config.to_disk("./config.cfg") new_config = Config().from_disk("./config.cfg")
| 参数 | 类型 | 描述 |
|---|---|---|
path | Union[Path, str] | 文件路径。 |
interpolate | bool | 是否插值如 ${section.key} 的变量。默认为 True。 |
overrides | Dict[str, Any] | 值和部分的覆盖。键以点号表示法提供,例如 "training.dropout" 映射到相应的值。 |
| 返回值 | Config | 加载的配置。 |
Config.copy</sup>深度复制配置。
| 参数 | 类型 | 描 述 |
|---|---|---|
| 返回值 | Config | 复制的配置。 |
Config.interpolate</sup>插值如 ${section.value} 或 ${section.subsection} 的变量,并返回带有插值后值的配置副本。可用于以 interpolate=False 加载的配置,例如通过 Config.from_str。
from confection import Config config_str = """ [hyper_params] dropout = 0.2 [training] dropout = ${hyper_params.dropout} """ config = Config().from_str(config_str, interpolate=False) print(config["training"]) # {'dropout': '${hyper_params.dropout}'}} config = config.interpolate() print(config["training"]) # {'dropout': 0.2}}
| 参数 | 类型 | 描述 |
|---|---|---|
| 返回值 | Config | 带有插值后值的配置副本。 |
Config.merge</sup>深度合并两个配置对象,使用当前配置作为默认值。只合并部分和字典,不合并其他值如列表。更新中提供的值会覆盖基础配置中的值,任何新的值或部分都会被添加。如果配置值是一个变量,如 ${section.key}(例如,如果配置以 interpolate=False 加载),变量会被优先保留,即使更新提供了不同的值。这确保变量引用不会被合并破坏。
:warning: 注意,使用
@语法引用注册函数的块只有在它们引用相同函数时才会被合并。否则,合并可能会轻易产生无效配置,因为不同的函数可能接受不同的参数。如果一个块引用了不同的函数,它会被覆盖。
from confection import Config base_config_str = """ [training] patience = 10 dropout = 0.2 """ update_config_str = """ [training] dropout = 0.1 max_epochs = 2000 """ base_config = Config().from_str(base_config_str) update_config = Config().from_str(update_config_str) merged = Config(base_config).merge(update_config) print(merged["training"]) # {'patience': 10, 'dropout': 0.1, 'max_epochs': 2000}
| 参数 | 类型 | 描述 |
|---|---|---|
overrides | Union[Dict[str, Any], Config] | 要合并到配置中的更新。 |
| 返回值 | Config | 包含合并后配置的新配置实例。 |
| 参数 | 类型 | 描述 |
|---|---|---|
is_interpolated | bool | 配置值是否已经被插值。默认为 True,如果配置以 interpolate=False 加载(例如使用 Config.from_str),则设置为 False。 |


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以 满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。


选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


最强AI数据分析助手
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。


像人一样思考的AI智能体
imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。


AI数字人视频创作平台
Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。