confection
? 구성 시스템을 제공하는 가벼운 라이브러리로, 대상의 임의의 트리를 편리하게 설명 할 수 있습니다.
구성은 기계 학습 코드의 큰 과제입니다. 하이퍼 파라미터로서의 기능의 거의 모든 세부 사항을 노출시키기를 원할 수 있기 때문입니다. 노출하려는 설정은 통화 스택에서 임의로 멀리 떨어져있을 수 있으므로 CLI 또는 REST API를 통해 모든 중간 기능을 통해 전달해야 할 수도 있습니다. 그런 다음 해당 설정이 추가되면 나중에 제거하기가 어려워집니다. 기본값도 뒤로 호환되지 않으면 서 변경하기가 어려워집니다.
이 문제를 해결하기 위해 confection
임의의 물체를 쉽게 설명 할 수있는 구성 시스템을 제공합니다. 객체는 간단한 데코레이터 구문을 사용하여 레지스터를 통해 기능 호출을 통해 생성 할 수 있습니다. 당신은 당신이 만든 기능을 버전으로 만들 수 있으므로 거꾸로 호환성을 깨지 않고 개선 할 수 있습니다. 우리가 알고있는 가장 유사한 구성 시스템은 유사한 구문을 사용하는 Gin이며, 구성 시스템을 데코레이터를 사용하여 코드의 함수에 연결할 수 있습니다. confection
의 구성 시스템은 간단하고 Gin 기능의 하위 집합을 통해 다른 워크 플로를 강조합니다.
PIP 설치 과자
Conda Install -C Conda -Forge Confection
구성 시스템은 .cfg
파일을 구문 분석합니다
[훈련] patience = 10dropout = 0.2use_vectors = false [training.logging] level = "info"[nlp]# 이것은 training.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 표기법과 달러 표시와 곱슬 괄호로 표시된 자리 표시자를 사용하여 다른 섹션에서 참조 할 수 있습니다. 예를 들어 ${training.use_vectors}
교육 블록에서 use_vectors의 값을받습니다. 이것은 구성 요소에서 공유되는 설정에 유용합니다.
구성 형식에는 Python의 내장 configparser
과 세 가지 주요 차이점이 있습니다.
JSON 형식 값. confection
json.loads
를 통해 모든 값을 전달하여 해석합니다. 문자열, 부유물, 정수 또는 부울과 같은 원자 값을 사용할 수 있거나 목록이나지도와 같은 복잡한 개체를 사용할 수 있습니다.
구조화 된 섹션. confection
DOT 표기법을 사용하여 중첩 된 섹션을 작성합니다. [section.subsection]
이라는 섹션이있는 경우 confection
중첩 구조로 구문 분석하여 섹션 내에 하위 섹션을 배치합니다.
레지스트리 기능에 대한 참조. 키가 @
로 시작되면 confection
는 값을 함수 레지스트리의 이름으로 해석하고 해당 이름에 등록 된 함수를로드하고 나머지 블록에 인수로 전달됩니다. 함수에서 유형 힌트를 사용할 수 있으면 인수 값 (및 함수의 리턴 값)이 이에 대해 검증됩니다. 이렇게하면 batch_size
부유물을 생산하는 기능으로 채워진 교육 파이프 라인과 같은 복잡한 구성을 표현할 수 있습니다.
당신이 따라야 할 사전 정의 된 체계는 없습니다. 최상위 섹션을 설정하는 방법은 귀하에게 달려 있습니다. 결국, 스크립트에서 사용할 수있는 값 (완전한 초기 기능 또는 기본 설정에 관계없이 스크립트에서 사용할 수있는 사전을받을 수 있습니다.
예를 들어, 새로운 최적화기를 정의하고 싶다고 가정 해 봅시다. config.cfg
에서 인수를 정의합니다.
[Optimizer] @optiMizers = "my_cool_optimizer.v1"learn_rate = 0.001gamma = 1e-8
catalogue
레지스트리를 사용 하여이 구성을로드하고 구문 분석하려면 ( catalogue
별도로 설치) :
가져 오기 수입 유니온을 타이핑하는 데이터 클래스, 반복적 인 임원 촉매 제과 수입 레지스트리, config# 새 레지스트리 레지스트리 생성# catalogue.create ( "제과", "최적화", Entry_points = false)# dataclasses.dataclassclass를 정의합니다. 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)# disk에서 구성 파일을로드합니다. 그것은 인스턴스화 된 Optimizer 객체를 가져 오십시오 .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 = ...
- 오류로 표시됩니다. 초기화 후 새로운 속성이 클래스에 추가되기 때문입니다. typecheckers를 사용하는 경우 이것 (예 :# type: ignore
formypy
무시 함)을 무시하거나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 인스턴스 인 경우 data 에서 읽으십시오. 그렇지 않으면 기본값이 True . |
Config.from_str
문자열에서 구성을로드하십시오.
제과 가져 오기 configconfig_str = "" "[training] patience = 10dropout = 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
문자열에서 구성을로드하십시오.
제과 가져 오기 configconfig = config ({ "training": { "patience": 10, "dropout": 0.2}}) print (config.to_str ()) # '[training] npatience = 10ndropout = 0.2'
논쟁 | 유형 | 설명 |
---|---|---|
interpolate | bool | ${section.key} 와 같은 변수를 보간할지 여부. 기본값은 True . |
보고 | str | 문자열 구성. |
Config.to_bytes
구성을 바이트 문자열로 직렬화하십시오.
제과 가져 오기 configconfig = config ({ "training": { "patience": 10, "dropout": 0.2}}) config_bytes = config.to_bytes () print (config_bytes) # b '[training] npatience = 10ndropout = 0.2'
논쟁 | 유형 | 설명 |
---|---|---|
interpolate | bool | ${section.key} 와 같은 변수를 보간할지 여부. 기본값은 True . |
overrides | Dict[str, Any] | 값과 섹션에 대한 재정의. 키는 도트 표기법 (예 : "training.dropout" 으로 제공됩니다. |
보고 | str | 직렬화 된 구성. |
Config.from_bytes
바이트 문자열에서 구성을로드하십시오.
제과 가져 오기 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
파일에서 구성을로드하십시오.
제과 가져 오기 configconfig = config ({ "training": { "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" 으로 제공됩니다. |
보고 | Config | 로드 된 구성. |
Config.copy
딥 코피 구성.
논쟁 | 유형 | 설명 |
---|---|---|
보고 | Config | 복사 된 구성. |
Config.interpolate
${section.value}
또는 ${section.subsection}
과 같은 변수를 보간하고 보간 된 값과 구성 사본을 반환합니다. 구성이 interpolate=False
, 예를 들어 Config.from_str
통해로드 된 경우 사용할 수 있습니다.
제과 가져 오기 configconfig_str = "" "[hyper_params] 드롭 아웃 = 0.2 [훈련] 드롭 아웃 = $ {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
현재 구성을 기본값으로 사용하여 두 개의 구성 객체를 심화하십시오. 목록과 같은 다른 값이 아닌 섹션 및 사전 만 합병합니다. 업데이트에 제공된 값은 기본 구성에서 덮어 쓰고 새 값 또는 섹션이 추가됩니다. 구성 값이 ${section.key}
와 같은 변수 인 경우 (예 : 구성에 interpolate=False)
업데이트가 다른 값을 제공하더라도 변수를 선호합니다 . 이를 통해 변수 참조가 병합에 의해 파괴되지 않도록합니다.
켈 @
구문을 사용하여 등록 된 기능을 참조하는 블록은 동일한 함수를 참조하는 경우에만 병합됩니다. 그렇지 않으면, 다른 함수는 다른 인수를 취할 수 있기 때문에 병합은 잘못된 구성을 쉽게 생성 할 수 있습니다. 블록이 다른 함수를 지칭하면 덮어 씁니다.
제과 가져 오기 configbase_config_str = "" "[training] patience = 10dropout = 0.2" ""update_config_str = "" "[training] dropout = 0.1max_epochs = 2000" ""base_config = config (). from_str (base_config_str) update_config = 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 로 설정됩니다. |