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: ignoreformypy무시 함)을 무시하거나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 로 설정됩니다. |