confection ? เป็นไลบรารีที่มีน้ำหนักเบาที่มี ระบบการกำหนดค่า ให้คุณอธิบายต้นไม้ของวัตถุโดยพลการได้อย่างสะดวก
การกำหนดค่าเป็นความท้าทายที่ยิ่งใหญ่สำหรับรหัสการเรียนรู้ของเครื่องเพราะคุณอาจต้องการเปิดเผยรายละเอียดเกือบทุกอย่างของฟังก์ชั่นใด ๆ ในฐานะพารามิเตอร์ การตั้งค่าที่คุณต้องการเปิดเผยอาจอยู่ไกลในสแต็กการโทรของคุณโดยพลการดังนั้นจึงอาจต้องผ่านไปตลอดทางผ่าน CLI หรือ REST API ผ่านฟังก์ชั่นกลางจำนวนใด ๆ ที่ส่งผลกระทบต่ออินเทอร์เฟซของทุกสิ่งตลอดทาง และเมื่อเพิ่มการตั้งค่าเหล่านั้นพวกเขาจะลบออกได้ยากในภายหลัง ค่าเริ่มต้นยังยากที่จะเปลี่ยนแปลงโดยไม่ทำลายความเข้ากันได้ย้อนหลัง
ในการแก้ปัญหานี้ confection เสนอระบบกำหนดค่าที่ช่วยให้คุณอธิบายต้นไม้วัตถุโดยพลการได้อย่างง่ายดาย วัตถุสามารถสร้างได้ผ่านการเรียกใช้ฟังก์ชั่นที่คุณลงทะเบียนโดยใช้ไวยากรณ์มัณฑนากรที่เรียบง่าย คุณสามารถเวอร์ชันฟังก์ชั่นที่คุณสร้างได้ช่วยให้คุณสามารถทำการปรับปรุงได้โดยไม่ทำลายความเข้ากันได้ย้อนหลัง ระบบกำหนดค่าที่คล้ายกันมากที่สุดที่เราทราบคือจินซึ่งใช้ไวยากรณ์ที่คล้ายกันและยังช่วยให้คุณเชื่อมโยงระบบการกำหนดค่ากับฟังก์ชั่นในรหัสของคุณโดยใช้มัณฑนากร ระบบกำหนดค่าของ confection เป็นเรื่องง่ายและเน้นเวิร์กโฟลว์ที่แตกต่างกันผ่านชุดย่อยของฟังก์ชั่นของจิน
PIP ติดตั้งขนม
Conda Install -C Conda -Forge Confection
ระบบกำหนดค่าวิเคราะห์ไฟล์ .cfg เช่น
[การฝึกอบรม] ความอดทน = 10dropout = 0.2use_vectors = false [training.logging] ระดับ = "info" [nlp]# สิ่งนี้ใช้ค่าของการฝึกอบรม use_vectorsuse_vectors = $ {training.use_vectors} lang = "en" และแก้ไขให้เป็น Dict :
{"การฝึกอบรม": {"ความอดทน": 10, "Dropout": 0.2, "use_vectors": false, "การบันทึก": {"ระดับ": "info"}
}, "nlp": {"use_vectors": false, "lang": "en"
-
- การกำหนดค่าแบ่งออกเป็นส่วน ๆ โดยมีชื่อส่วนในวงเล็บเหลี่ยม - ตัวอย่างเช่น [training] ภายในส่วนนั้นค่าการกำหนดค่าสามารถกำหนดให้กับคีย์โดยใช้ = ค่ายังสามารถอ้างอิงจากส่วนอื่น ๆ โดยใช้สัญลักษณ์ DOT และตัวยึดตำแหน่งที่ระบุโดยเครื่องหมายดอลลาร์และการจัดฟันแบบหยิก ตัวอย่างเช่น ${training.use_vectors} จะได้รับค่าของ use_vectors ในบล็อกการฝึกอบรม สิ่งนี้มีประโยชน์สำหรับการตั้งค่าที่ใช้ร่วมกันในส่วนประกอบต่างๆ
รูปแบบการกำหนดค่ามีความแตกต่างหลักสามประการจาก configparser ในตัวของ Python:
ค่า json-formatted confection ผ่านค่าทั้งหมดผ่าน json.loads เพื่อตีความพวกเขา คุณสามารถใช้ค่าอะตอมเช่นสตริงลอยน้ำจำนวนเต็มหรือบูลีนหรือคุณสามารถใช้วัตถุที่ซับซ้อนเช่นรายการหรือแผนที่
ส่วนที่มีโครงสร้าง confection ใช้สัญลักษณ์จุดเพื่อสร้างส่วนซ้อนกัน หากคุณมีส่วนที่ชื่อ [section.subsection] confection จะแยกวิเคราะห์สิ่งนั้นลงในโครงสร้างที่ซ้อนกันวางส่วนย่อยภายในส่วน
การอ้างอิงถึงฟังก์ชั่นรีจิสทรี หากคีย์เริ่มต้นด้วย @ confection จะตีความค่าเป็นชื่อของรีจิสทรีฟังก์ชั่นให้โหลดฟังก์ชั่นที่ลงทะเบียนสำหรับชื่อนั้นและส่งผ่านส่วนที่เหลือของบล็อกเป็นอาร์กิวเมนต์ หากคำแนะนำประเภทมีอยู่ในฟังก์ชันค่าอาร์กิวเมนต์ (และค่าส่งคืนของฟังก์ชัน) จะได้รับการตรวจสอบกับพวกเขา สิ่งนี้จะช่วยให้คุณแสดงการกำหนดค่าที่ซับซ้อนเช่นไปป์ไลน์การฝึกอบรมที่ batch_size ถูกเติมโดยฟังก์ชั่นที่ให้ลอย
ไม่มีโครงการที่กำหนดไว้ล่วงหน้าที่คุณต้องทำตาม วิธีการตั้งค่าส่วนบนสุดขึ้นอยู่กับคุณ ในตอนท้ายคุณจะได้รับพจนานุกรมที่มีค่าที่คุณสามารถใช้ในสคริปต์ของคุณไม่ว่าจะเป็นฟังก์ชั่นที่เริ่มต้นอย่างสมบูรณ์หรือเพียงแค่การตั้งค่าพื้นฐาน
ตัวอย่างเช่นสมมติว่าคุณต้องการกำหนดเครื่องมือเพิ่มประสิทธิภาพใหม่ คุณจะกำหนดอาร์กิวเมนต์ใน config.cfg เช่นนี้:
[optimizer] @optimizers = "my_cool_optimizer.v1" learn_rate = 0.001gamma = 1e-8
ในการโหลดและแยกวิเคราะห์การกำหนดค่านี้โดยใช้รีจิสทรี catalogue (ติดตั้ง catalogue แยกกัน):
นำเข้า dataclassesesfrom การพิมพ์ import union, iterableimport cataloguefrom registry นำเข้ารีจิสทรี, config# สร้างรีจิสทรีใหม่ registry.optimizers = catalogue.create ("ขนม", "optimizers", entry_points = false)# define ชั้นเรียน MyCooloptimizer: Learn_rate: Floatgamma: [email protected] ("my_cool_optimizer.v1") def make_my_optimizer (learn_rate: union [float, iterable [float]], gamma: float): กลับ mycooloptimizer มันและดึงวัตถุเครื่องมือเพิ่มประสิทธิภาพแบบอินสแตนซ์ config = config (). from_disk ("./ config.cfg") แก้ไข = registry.resolve (config) optimizer = แก้ไข ["optimizer"] # mycooloptimizer (learn_rate = 0.001, gamma = 1e-08)
ข้อควรระวัง: ผู้ตรวจสอบประเภทเช่น mypyจะทำเครื่องหมายการเพิ่มแอตทริบิวต์ใหม่ลงในregistryด้วยวิธีนี้ - เช่นregistry.new_attr = ...- เป็นข้อผิดพลาด นี่เป็นเพราะแอตทริบิวต์ใหม่ถูกเพิ่มลงในคลาสหลังจากเริ่มต้น หากคุณใช้ typeCheckers คุณสามารถเพิกเฉยต่อสิ่งนี้ (เช่น# type: ignoreสำหรับmypy) หรือใช้ทางเลือก typesafe: แทนที่จะเป็นregistry.new_attr = ..., ใช้setattr(registry, "new_attr", ...).
ภายใต้ประทุน confection จะค้นหาฟังก์ชั่น "my_cool_optimizer.v1" ในรีจิสทรี "Optimizers" จากนั้นเรียกมันด้วยข้อโต้แย้ง learn_rate และ gamma หากฟังก์ชั่นมีคำอธิบายประกอบประเภทมันจะตรวจสอบอินพุตด้วย ตัวอย่างเช่นหาก learn_rate มีคำอธิบายประกอบเป็นลอยและการกำหนดค่ากำหนดสตริง confection จะทำให้เกิดข้อผิดพลาด
เอกสาร THINC เสนอข้อมูลเพิ่มเติมเกี่ยวกับระบบการกำหนดค่า:
บล็อกซ้ำ
การกำหนดอาร์กิวเมนต์ตำแหน่งตัวแปร
ใช้การแก้ไข
ใช้การลงทะเบียนที่กำหนดเอง
คำอธิบายประกอบประเภทขั้นสูงด้วย pydantic
ใช้สกีมาฐาน
การกรอกการกำหนดค่าที่มีค่าเริ่มต้น
Config คลาส คลาสนี้ถือโมเดลและการกำหนดค่าการฝึกอบรมและสามารถโหลดและบันทึกรูปแบบการกำหนดค่าสไตล์ ini-style จาก/ถึงสตริงไฟล์หรือไบต์ คลาส Config เป็นคลาสย่อยของ dict และใช้ ConfigParser ของ Python ภายใต้ประทุน
Config.__init__ เริ่มต้นวัตถุ Config ใหม่ด้วยข้อมูลเสริม
จาก conpection import confignfig = config ({"การฝึกอบรม": {"ความอดทน": 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โหลดการกำหนดค่าจากสตริง
จากการนำเข้านำเข้า configConfig_str = "" "[การฝึกอบรม] ความอดทน = 10dropout = 0.2" "" config = config (). from_str (config_str) พิมพ์ (config ["การฝึกอบรม"]) # {'ความอดทน': 10, 'dropout': 0.2}}| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
text | str | การกำหนดค่าสตริงเพื่อโหลด |
interpolate | bool | ไม่ว่าจะเป็นการแทรกตัวแปรเช่น ${section.key} ค่าเริ่มต้นเป็น True |
overrides | Dict[str, Any] | แทนที่สำหรับค่าและส่วนต่างๆ คีย์มีให้ในสัญกรณ์ DOT เช่น "training.dropout" แมปกับค่า |
| ผลตอบแทน | Config | การกำหนดค่าที่โหลด |
Config.to_strโหลดการกำหนดค่าจากสตริง
จาก conpection import confignfig = config ({"การฝึกอบรม": {"ความอดทน": 10, "Dropout": 0.2}}) พิมพ์ (config.to_str ()) # '[การฝึกอบรม] npatience = 10nndropout = 0.2'| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
interpolate | bool | ไม่ว่าจะเป็นการแทรกตัวแปรเช่น ${section.key} ค่าเริ่มต้นเป็น True |
| ผลตอบแทน | str | การกำหนดค่าสตริง |
Config.to_bytesทำให้เป็นอนุกรมการกำหนดค่าเป็นสตริงไบต์
จาก Conpection Import configConfig = config ({"การฝึกอบรม": {"ความอดทน": 10, "Dropout": 0.2}}) config_bytes = config.to_bytes () พิมพ์ (config_bytes) # b '[การฝึกอบรม] npatience = 10nndropout = 0.2'| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
interpolate | bool | ไม่ว่าจะเป็นการแทรกตัวแปรเช่น ${section.key} ค่าเริ่มต้นเป็น True |
overrides | Dict[str, Any] | แทนที่สำหรับค่าและส่วนต่างๆ คีย์มีให้ในสัญกรณ์ DOT เช่น "training.dropout" แมปกับค่า |
| ผลตอบแทน | str | การกำหนดค่าอนุกรม |
Config.from_bytesโหลดการกำหนดค่าจากสตริงไบต์
จาก conpection import configconfig = config ({"การฝึกอบรม": {"ความอดทน": 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ทำให้เป็นอนุกรมการกำหนดค่าเป็นไฟล์
จาก conpection import confignfig = config ({"การฝึกอบรม": {"ความอดทน": 10, "Dropout": 0.2}}) config.to_disk ("./ config.cfg")| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
path | Union[Path, str] | เส้นทางไฟล์ |
interpolate | bool | ไม่ว่าจะเป็นการแทรกตัวแปรเช่น ${section.key} ค่าเริ่มต้นเป็น True |
Config.from_diskโหลดการกำหนดค่าจากไฟล์
จาก conpection import configConfig = config ({"การฝึกอบรม": {"ความอดทน": 10, "Dropout": 0.2}}) config.to_disk ("./ config.cfg") new_config = config () จาก _disk ("" 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
จาก Conpection Import Confignfig_str = "" "[hyper_params] Dropout = 0.2 [การฝึกอบรม] Dropout = $ {hyper_params.dropout}" "" config = config (). from_str (config_str, interpolate = false) พิมพ์ (config ["การฝึกอบรม"] ) # {'Dropout': '$ {hyper_params.dropout}'}} config = config.interpolate () พิมพ์ (config ["การฝึกอบรม"]) # {'dropout': 0.2}}}| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
| ผลตอบแทน | Config | สำเนาของการกำหนดค่าที่มีค่าที่ถูกแก้ไข |
Config.merge วัตถุที่กำหนดค่าสองส่วนลึกโดยใช้การกำหนดค่าปัจจุบันเป็นค่าเริ่มต้น เฉพาะส่วนรวมส่วนและพจนานุกรมและไม่ใช่ค่าอื่น ๆ เช่นรายการ ค่าที่มีให้ในการอัปเดตจะถูกเขียนทับในการกำหนดค่าพื้นฐานและเพิ่มค่าหรือส่วนใหม่ใด ๆ หากค่าการกำหนดค่าเป็นตัวแปรเช่น ${section.key} (เช่นหากการกำหนดค่าถูกโหลดด้วย interpolate=False) ตัวแปรจะเป็นที่ต้องการ แม้ว่าการอัปเดตจะให้ค่าที่แตกต่างกัน สิ่งนี้ทำให้มั่นใจได้ว่าการอ้างอิงตัวแปรจะไม่ถูกทำลายโดยการผสาน
โปรดทราบว่าบล็อกที่อ้างถึงฟังก์ชั่นที่ลงทะเบียนโดยใช้ @syntax นั้นจะถูกรวมเข้าด้วยกันหากพวกเขาอ้างถึงฟังก์ชั่นเดียวกัน มิฉะนั้นการรวมกันสามารถสร้างการกำหนดค่าที่ไม่ถูกต้องได้อย่างง่ายดายเนื่องจากฟังก์ชั่นที่แตกต่างกันสามารถใช้อาร์กิวเมนต์ที่แตกต่างกันได้ หากบล็อกหมายถึงฟังก์ชั่นที่แตกต่างกันมันจะถูกเขียนทับ
จากการนำเข้านำเข้า configbase_config_str = "" "[การฝึกอบรม] ความอดทน = 10dropout = 0.2" "" update_config_str = "" "[การฝึกอบรม] Dropout = 0.1max_epochs = 2000" "base_config = config () ) .from_str (update_config_str) ผสาน = config (base_config) .merge (update_config) พิมพ์ (รวม ["การฝึกอบรม"]) # {'ความอดทน': 10, 'Dropout': 0.1, 'max_epochs': 2000}| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
overrides | Union[Dict[str, Any], Config] | การอัปเดตที่จะรวมเข้ากับการกำหนดค่า |
| ผลตอบแทน | Config | อินสแตนซ์การกำหนดค่าใหม่ที่มีการกำหนดค่าที่ผสาน |
| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
is_interpolated | bool | ไม่ว่าค่าการกำหนดค่าจะถูกแก้ไขหรือไม่ ค่าเริ่มต้นเป็น True และถูกตั้งค่าเป็น False หากโหลดการกำหนดค่าด้วย interpolate=False , เช่นการใช้ Config.from_str |