confection
؟ هي مكتبة خفيفة الوزن توفر نظام تكوين يتيح لك وصف الأشجار التعسفية بشكل مريح.
يمثل التكوين تحديًا كبيرًا لرمز تعلم الماكينة لأنك قد ترغب في فضح أي تفاصيل تقريبًا عن أي وظيفة كمعطر فرط. قد يكون الإعداد الذي تريد فضحه بعيدًا بشكل تعسفي في مكدس الاتصال الخاص بك ، لذلك قد يحتاج إلى المرور طوال الطريق من خلال CLI أو REST API ، من خلال أي عدد من الوظائف الوسيطة ، مما يؤثر على واجهة كل شيء على طول الطريق. ثم بمجرد إضافة هذه الإعدادات ، يصبح من الصعب إزالته لاحقًا. تصبح القيم الافتراضية أيضًا من الصعب تغييرها دون كسر التوافق الخلفي.
لحل هذه المشكلة ، توفر confection
نظام تكوين يتيح لك وصف الأشجار التعسفية بسهولة. يمكن إنشاء الكائنات عبر مكالمات الوظائف التي تسجلها باستخدام بناء جملة ديكور بسيط. يمكنك حتى إصدار الوظائف التي تنشئها ، مما يتيح لك إجراء تحسينات دون كسر التوافق الخلفي. نظام التكوين الأكثر تشابهًا الذي ندركه هو Gin ، والذي يستخدم بناء جملة مماثل ، ويسمح لك أيضًا بربط نظام التكوين بالوظائف في الكود الخاص بك باستخدام ديكور. نظام التكوين في confection
أبسط ويؤكد سير عمل مختلف عبر مجموعة فرعية من وظائف الجن.
PIP تثبيت الحلويات
كوندا تثبيت -c conda -forge الحلويات
يقوم نظام التكوين بتوصيف ملف .cfg
مثل
[تدريب] الصبر = 10dropout = 0.2use_vectors = خطأ [تدريب.
ويحلها Dict
:
{"التدريب": {"الصبر": 10 ، "التسرب": 0.2 ، "use_vectors": خطأ ، "تسجيل": {"المستوى": "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] OopTimizers = "my_cool_optimizer.v1" learn_rate = 0.001gamma = 1e-8
لتحميل هذا التكوين وتحليله باستخدام سجل catalogue
(تثبيت catalogue
بشكل منفصل):
استيراد قواعد البيانات dataClassesfrom typing استيراد اتحاد ، iterviliMport CatalogueFrom Confection Import ، config# إنشاء سجل جديد. registry.optimizers = catalogue.creat MyCooloptimizer: Learn_rate: Floatgamma: [email protected] ("my_cool_optimizer.v1") def make_my_optimizer (Learn_rate: Union [float ، iterbil ويحضر كائن Optimizer الذي تم إنشاء Instanted.config = config (). from_disk ("./ config.cfg") resolved = registry.Resolve (config) ensorizer = resolveD ["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"
في سجل "المحسّنات" ثم نسميها مع الوسيطات learn_rate
و gamma
. إذا كانت الوظيفة تحتوي على تعليقات من النوع ، فسيتم التحقق من صحة الإدخال أيضًا. على سبيل المثال ، إذا تم شرح learn_rate
كتعويم ويحدد التكوين سلسلة ، فسترفع confection
خطأ.
توفر وثائق Thinc مزيد من المعلومات حول نظام التكوين:
الكتل العودية
تحديد الحجج الموضعية المتغيرة
باستخدام الاستيفاء
باستخدام سجلات مخصصة
التعليقات التوضيحية من النوع المتقدم مع Pydantic
باستخدام مخططات قاعدة
ملء التكوين مع الافتراضات
Config
الفئة يحتفظ هذه الفئة بتكوين النموذج والتدريب ويمكنها تحميل وتنسيق تكوين Style من/إلى سلسلة أو ملف أو بايت. فئة Config
هي فئة فرعية من dict
وتستخدم Python's ConfigParser
أسفل الغطاء.
Config.__init__
تهيئة كائن Config
جديد مع بيانات اختيارية.
من الحلويات استيراد configConfig = config ({"التدريب": {"الصبر": 10 ، "التسرب": 0.2}})
دعوى | يكتب | وصف |
---|---|---|
data | Optional[Union[Dict[str, Any], Config]] | بيانات اختيارية لتهيئة التكوين مع. |
section_order | Optional[List[str]] | أسماء الأقسام ذات المستوى الأعلى ، بالترتيب ، تستخدم لفرز التكوين المحفوظ والتحميل. سيتم فرز جميع الأقسام الأخرى أبجديًا. |
is_interpolated | Optional[bool] | ما إذا كان التكوين محرف أو ما إذا كان يحتوي على متغيرات. اقرأ من data إذا كانت مثيلًا Config والافتراضات على نحو True . |
Config.from_str
قم بتحميل التكوين من سلسلة.
من الاستيراد CONFORT CONFIGCONFIG_STR = "" "[التدريب] الصبر = 10Dropout = 0.2" "" config =). من _str (config_str) طباعة (config ["التدريب") # {'الصبر': 10 ، 'التسرب': 0.2}}
دعوى | يكتب | وصف |
---|---|---|
text | str | تكوين السلسلة لتحميل. |
interpolate | bool | ما إذا كان يجب استبعاد المتغيرات مثل ${section.key} . الافتراضات إلى True . |
overrides | Dict[str, Any] | تجاوزات للقيم والأقسام. يتم توفير المفاتيح في تدوين DOT ، على سبيل المثال "training.dropout" تم تعيينها إلى القيمة. |
عودة | Config | التكوين المحمّل. |
Config.to_str
قم بتحميل التكوين من سلسلة.
من الحلويات استيراد configConfig = config ({"التدريب": {"الصبر": 10 ، "التسرب": 0.2}}) print (config.to_str ()) # '[التدريب] npatience = 10ndropout = 0.2'
دعوى | يكتب | وصف |
---|---|---|
interpolate | bool | ما إذا كان يجب استكمال المتغيرات مثل ${section.key} . الافتراضات إلى True . |
عودة | str | تكوين السلسلة. |
Config.to_bytes
تسلسل التكوين إلى سلسلة بايت.
من الاستيراد Conploy ConfigConfig = config ({"التدريب": {"الصبر": 10 ، "التسرب": 0.2}}) config_bytes = config.to_bytes () print (config_bytes) # b '[التدريب] npatience = 10nndropout = 0.2'
دعوى | يكتب | وصف |
---|---|---|
interpolate | bool | ما إذا كان يجب استبعاد المتغيرات مثل ${section.key} . الافتراضات إلى True . |
overrides | Dict[str, Any] | تجاوزات للقيم والأقسام. يتم توفير المفاتيح في تدوين DOT ، على سبيل المثال "training.dropout" تم تعيينها إلى القيمة. |
عودة | str | التكوين المسلسل. |
Config.from_bytes
قم بتحميل التكوين من سلسلة بايت.
من الحلويات استيراد configConfig = config ({"التدريب": {"الصبر": 10 ، "التسرب": 0.2})
دعوى | يكتب | وصف |
---|---|---|
bytes_data | bool | البيانات المراد تحميلها. |
interpolate | bool | ما إذا كان يجب استبعاد المتغيرات مثل ${section.key} . الافتراضات إلى True . |
عودة | Config | التكوين المحمّل. |
Config.to_disk
تسلسل التكوين إلى ملف.
من الحلويات استيراد configConfig = config ({"التدريب": {"الصبر": 10 ، "التسرب": 0.2}}) config.to_disk ("./ config.cfg")
دعوى | يكتب | وصف |
---|---|---|
path | Union[Path, str] | مسار الملف. |
interpolate | bool | ما إذا كان يجب استبعاد المتغيرات مثل ${section.key} . الافتراضات إلى True . |
Config.from_disk
قم بتحميل التكوين من ملف.
من الاستيراد CONFORE CONFIGCONFIG = config ({"التدريب": {"الصبر": 10 ، "التسرب": 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] | تجاوزات للقيم والأقسام. يتم توفير المفاتيح في تدوين DOT ، على سبيل المثال "training.dropout" تم تعيينها إلى القيمة. |
عودة | Config | التكوين المحمّل. |
Config.copy
نسخة عميقة التكوين.
دعوى | يكتب | وصف |
---|---|---|
عودة | Config | التكوين النسخ. |
Config.interpolate
متغيرات interpolate مثل ${section.value}
أو ${section.subsection}
وإرجاع نسخة من التكوين بالقيم المحرف. يمكن استخدامه إذا تم تحميل التكوين باستخدام interpolate=False
، على سبيل المثال عبر Config.from_str
.
من الاستيراد CONNOLSENT ISSOUNCTINGCONFIG_STR = "" "" [hyper_params] التسرب = 0.2 [تدريب] تسرب = $ {hyper_params.dropout} "" "config =). من _str (config_str ، interpolate = false) print (config [" التدريب "] ) # {'Reprot': '$ {hyper_params.dropout}'}} config = config.Interpolate () print (config ["Training"]) # {'Report': 0.2}}
دعوى | يكتب | وصف |
---|---|---|
عودة | Config | نسخة من التكوين مع القيم المحرف. |
Config.merge
أعماق كائنين تكوين ، باستخدام التكوين الحالي كما الافتراضي. دمج الأقسام والقواميس فقط وليس القيم الأخرى مثل القوائم. تتم كتابة القيم التي يتم توفيرها في التحديثات في التكوين الأساسي ، ويتم إضافة أي قيم أو أقسام جديدة. إذا كانت قيمة التكوين متغيرًا مثل ${section.key}
(على سبيل المثال ، إذا تم تحميل التكوين باستخدام interpolate=False)
، فسيتم تفضيل المتغير ، حتى إذا كانت التحديثات توفر قيمة مختلفة. هذا يضمن عدم تدمير المراجع المتغيرة بواسطة دمج.
️ لاحظ أن الكتل التي تشير إلى الوظائف المسجلة باستخدام بناء الجملة@
لا يتم دمجها إلا إذا كانت تشير إلى نفس الوظائف. خلاف ذلك ، يمكن أن تنتج الدمج بسهولة تكوينات غير صالحة ، لأن وظائف مختلفة يمكن أن تأخذ وسيطات مختلفة. إذا كانت الكتلة تشير إلى وظيفة مختلفة ، فسيتم الكتابة فوقها.
من الحلويات ، استيراد الاستيراد configbase_config_str = "" "" [التدريب] الصبر = 10dropout = 0.2 "" "update_config_str =" " ) .from_str (update_config_str) تم دمجها = config (base_config) .merge (update_config) print (mused ["Training"]) # {'panience': 10 ، 'Report': 0.1 ، 'max_epochs': 2000}
دعوى | يكتب | وصف |
---|---|---|
overrides | Union[Dict[str, Any], Config] | التحديثات لدمج في التكوين. |
عودة | Config | مثيل تكوين جديد يحتوي على التكوين المدمج. |
دعوى | يكتب | وصف |
---|---|---|
is_interpolated | bool | ما إذا كانت قيم التكوين قد تم استقراءها. الإعدادات الافتراضية إلى True ويتم تعيينها على False إذا تم تحميل التكوين مع interpolate=False ، على سبيل المثال باستخدام Config.from_str . |