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 |