confection
? это легкая библиотека, которая предлагает систему конфигурации , позволяющая вам удобно описать произвольные деревья объектов.
Конфигурация является огромной задачей для кода машинного обучения, потому что вы можете разоблачить практически любую деталь любой функции в качестве гиперпараметра. Настройка, которую вы хотите разоблачить, может быть произвольно далеко в вашем стеке вызовов, поэтому ему может потребоваться пройти весь путь через API CLI или REST через любое количество промежуточных функций, влияя на интерфейс всего на этом пути. И после того, как эти настройки будут добавлены, их становятся трудно удалить позже. Значения по умолчанию также становятся трудными в изменении, не ломаясь назад.
Чтобы решить эту проблему, confection
предлагает систему конфигурации, которая позволяет легко описать произвольные деревья объектов. Объекты могут быть созданы с помощью вызовов функций, которые вы регистрируете, используя простой синтаксис декоратора. Вы можете даже вернуть функции, которые вы создаете, позволяя вам вносить улучшения, не ломаясь назад. Самая похожая конфигурационная система, о которой мы знаем, - это GIN, который использует аналогичный синтаксис, а также позволяет вам связывать систему конфигурации с функциями в вашем коде с помощью декоратора. Конфигурационная система confection
конфигурации проще и подчеркивает другой рабочий процесс с помощью подмножества функциональности джина.
PIP установить кондитерское изделие
Установка Conda -c кондиционирование Conda -Forge
Система конфигурации анализирует файл .cfg
как
[Обучение] Терпение = 10Dropout = 0.2USE_VECTORS = false [training.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 в учебном блоке. Это полезно для настройки, которые разделены по компонентам.
Формат конфигурации имеет три основных отличия от встроенного configparser
Python:
Json-форматированные значения. confection
пропускает все значения через json.loads
, чтобы интерпретировать их. Вы можете использовать атомные значения, такие как строки, поплавки, целые числа или логические, или вы можете использовать сложные объекты, такие как списки или карты.
Структурированные секции. confection
использует точечную нотацию для строительства вложенных секций. Если у вас есть раздел под названием [section.subsection]
, confection
проведет это в вложенную структуру, размещая подраздел в разделе.
Ссылки на функции реестра. Если ключ начинается с @
, confection
будет интерпретировать его значение как имя реестра функций, загрузите функцию, зарегистрированную для этого имени, и пройти в остальную часть блока в качестве аргументов. Если подсказки типа доступны на функции, против них будут подтверждены значения аргумента (и возвращаемое значение функции). Это позволяет выражать сложные конфигурации, например, тренировочный трубопровод, где batch_size
заполняется функцией, которая дает плавание.
Там нет заранее определенной схемы, которую вы должны следовать; Как вы настроили разделы верхнего уровня, зависит от вас. В конце концов вы получите словарь со значениями, которые вы можете использовать в своем сценарии - будь то полные инициализированные функции или просто основные настройки.
Например, допустим, вы хотите определить новый оптимизатор. Вы определите его аргументы в config.cfg
, как SO:
[Optimizer] @Optimizers = "my_cool_optimizer.v1" uep_rate = 0,001gamma = 1e-8
Для загрузки и разбора эту конфигурацию с помощью реестра catalogue
(установить catalogue
отдельно):
Импорт DataClasses из типирования импорта, профсоюза, iteerableImport Catoguefrom Import Registry, config# создать новый реестр.gregistry.optimizers = catogue.create («Кондитерский контакт», «Оптимизаторы», intrint_points = false)# определить фиктивное оптимизатор. MyCooloPtimizer: Learn_Rate: Floatgamma: [email protected] ("my_cool_optimizer.v1") def make_my_optimizer (Learn_Rate: Union [float, итератный [float]], гамма: float): вернуть myCooloPtimiz он и принесите создание Optimizer Object.config = Config (). From_disk ("./ config.cfg") Resolved = registry.resolve (config) Optimizer = Resolved ["Optimizer"] # mycooloptimizer (expect_rate = 0,001, гамма = 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's ConfigParser
под капюшоном.
Config.__init__
Инициализируйте новый объект Config
с дополнительными данными.
от кондитерского импорта configConfig = config ({"training": {"терпение": 10, "Drovout": 0.2}})
Аргумент | Тип | Описание |
---|---|---|
data | Optional[Union[Dict[str, Any], Config]] | Дополнительные данные для инициализации конфигурации с. |
section_order | Optional[List[str]] | Имена разделов верхнего уровня, используемые для сортировки сохраненной и загруженной конфигурации. Все остальные разделы будут отсортированы в алфавитном порядке. |
is_interpolated | Optional[bool] | Независимо от того, интерполирована или содержит ли она переменные. Прочитайте из data , если это экземпляр Config и в противном случае по умолчанию к True . |
Config.from_str
Загрузите конфигурацию из строки.
Из кондитерского импорта configConfig_str = "" "[training] tpient = 10dropout = 0.2" "" config = config (). from_str (config_str) print (config ["training"]) # {'Tapent': 10, 'Drovout': 0,2}}
Аргумент | Тип | Описание |
---|---|---|
text | str | Строка конфигурации для загрузки. |
interpolate | bool | Чтобы интерполировать переменные, как ${section.key} . По умолчанию к True . |
overrides | Dict[str, Any] | Переопределения для значений и разделов. Ключи представлены в точечной нотации, например "training.dropout" . |
Возврат | Config | Загруженная конфигурация. |
Config.to_str
Загрузите конфигурацию из строки.
Из кондитерского импорта ConfigConfig = config ({"Training": {"терпение": 10, "Dropout": 0.2}}) print (config.to_str ()) # '[training] npatience = 10nddropout = 0,2'
Аргумент | Тип | Описание |
---|---|---|
interpolate | bool | Чтобы интерполировать переменные, как ${section.key} . По умолчанию к True . |
Возврат | str | Строка конфигурации. |
Config.to_bytes
Сериализуйте конфигурацию на строку байта.
Из кондитерского Import ConfigCOnfig = config ({"Training": {"терпение": 10, "Dropout": 0.2}}) config_bytes = config.to_bytes () print (config_bytes) # b '[training] npatience = 10nndropout = 0,2'
Аргумент | Тип | Описание |
---|---|---|
interpolate | bool | Чтобы интерполировать переменные, как ${section.key} . По умолчанию к True . |
overrides | Dict[str, Any] | Переопределения для значений и разделов. Ключи представлены в точечной нотации, например "training.dropout" . |
Возврат | str | Сериализованная конфигурация. |
Config.from_bytes
Загрузите конфигурацию из строки байта.
Из кондитерского Import ConfigCOnfig = config ({"Training": {"терпение": 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": {"терпение": 10, "Dropout": 0.2}}) config.to_disk ("./ config.cfg")
Аргумент | Тип | Описание |
---|---|---|
path | Union[Path, str] | Путь файла. |
interpolate | bool | Чтобы интерполировать переменные, как ${section.key} . По умолчанию к True . |
Config.from_disk
Загрузите конфигурацию из файла.
Из кондитерского Import ConfigCOnfig = config ({"Training": {"терпение": 10, "Drovout": 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
Глубокая копия конфигурации.
Аргумент | Тип | Описание |
---|---|---|
Возврат | Config | Скопированная конфигурация. |
Config.interpolate
Интерполировать переменные, такие как ${section.value}
или ${section.subsection}
и вернуть копию конфигурации с интерполированными значениями. Можно использовать, если конфигурация загружена с помощью interpolate=False
, например, через Config.from_str
.
Из кондитерского импорта ConfigConfig_str = "" "[hiper_params] DROPOUT = 0.2 [Training] DROPOUT = $ {Hyper_Params.dropout}" "" config = config (). from_str (config_str, interpolate = false) print (config ["training"] ). config.interpolate () print (config ["training"]) # {'Drodout': 0.2}}
Аргумент | Тип | Описание |
---|---|---|
Возврат | Config | Копия конфигурации с интерполированными значениями. |
Config.merge
Deep-Merge два объекта конфигурации, используя текущую конфигурацию в качестве по умолчанию. Только объединяет разделы и словари, а не другие значения, такие как списки. Значения, которые приведены в обновлениях, перезаписаны в базовой конфигурации, и добавляются любые новые значения или разделы. Если значение конфигурации представляет собой переменную, такую как ${section.key}
(например, если конфигурация была загружена с помощью interpolate=False)
, переменная предпочтительнее , даже если обновления дают другое значение. Это гарантирует, что переменные ссылки не разрушены слиянием.
️ Обратите внимание, что блоки, которые относятся к зарегистрированным функциям с использованием синтаксиса@
, объединяются только в том случае, если они ссылаются на одни и те же функции. В противном случае слияние может легко создать недопустимые конфигурации, поскольку различные функции могут принимать разные аргументы. Если блок относится к другой функции, он перезаписан.
Из кондитерского импорта configbase_config_str = "" "[[обучение] терпение = 10dropout = 0,2" "" Update_Config_str = "" "[Training] Dropout = 0.1max_epochs = 2000" "base_config = config (). From_str (base_config_str) ) .from_str (update_config_str) mersed = Config (base_config) .merge (update_config) print (merged ["training"]) # {'tpient': 10, 'выбросьт': 0,1, 'max_epochs': 2000}
Аргумент | Тип | Описание |
---|---|---|
overrides | Union[Dict[str, Any], Config] | Обновления для слияния в конфигурацию. |
Возврат | Config | Новый экземпляр конфигурации, содержащий объединенную конфигурацию. |
Аргумент | Тип | Описание |
---|---|---|
is_interpolated | bool | Были ли значения конфигурации интерполированы. По умолчанию True и устанавливается на False если конфигурация загружается с помощью interpolate=False , например, с использованием Config.from_str . |