2025, Oct 19 05:31

Hydra/OmegaConf में absolute बनाम relative interpolation की सही प्रैक्टिस

Hydra में grouped config के भीतर sibling मान संदर्भित करने का सही तरीका जानें: OmegaConf की absolute/relative interpolation, resolution और ${...key} का उपयोग।

Hydra कॉन्फ़िगरेशन फ़ाइलें जोड़ना आसान बनाती है, लेकिन जब आप सेटिंग्स को कॉन्फ़िग ग्रुप्स में बांटते हैं, तो स्ट्रिंग इंटरपोलेशन पेचीदा हो सकता है। एक आम स्थिति यह है कि grouped config के भीतर किसी sibling key का संदर्भ दिया जाता है, और अंततः अपेक्षित मान की जगह आउटपुट में वही इंटरपोलेशन स्ट्रिंग ज्यों‑की‑त्यों दिखाई देती है।

ऐसा उदाहरण सेटअप जो सही दिखता है, पर resolve नहीं होता

मान लें कि मुख्य कॉन्फ़िग किसी group के जरिए मॉडल कॉन्फ़िग चुनता है:

defaults:
  - net: net_a
  - _self_

और grouped फ़ाइल:

# net/net_a.yaml
feat_size: 106
stages:
  unit_1:
    in_size: ${feat_size}
    emb_size: 64
    out_size: 64

उम्मीद यह है कि in_size का मान 106 हो जाएगा। लेकिन संयोजित मॉडल कॉन्फ़िग को प्रिंट करते समय, संख्या की बजाय in_size अक्सर शाब्दिक रूप से "${feat_size}" ही दिखाई देता है।

असल में हो क्या रहा है

OmegaConf (जिसका उपयोग Hydra करता है) में इंटरपोलेशन डिफ़ॉल्ट रूप से absolute होता है और lazily resolve होता है। Lazy resolution का मतलब है कि छपी हुई संरचना में स्ट्रिंग ज्यों‑की‑त्यों रह सकती है, लेकिन जब आप उस खास key को एक्सेस करते हैं तो सही मान मिल जाता है। Absolute addressing का अर्थ है कि पथ का मूल्यांकन संयोजित कॉन्फ़िग के root से होता है। चूंकि grouped फ़ाइल उसी group नाम वाले नोड के तहत जुड़ती है, इसलिए मान का absolute स्थान root पर feat_size नहीं, बल्कि उस नोड के अंदर होता है। इसलिए absolute interpolation के संदर्भ में, इस लेआउट के लिए सही रेफरेंस ${net.feat_size} होगा।

यदि आप सीधे वास्तविक मान जांचें—जैसे stages.unit_1.in_size पढ़ कर—तो resolution ट्रिगर हो जाता है। पूरे कॉन्फ़िग को प्रिंट करने पर फिर भी मूल स्ट्रिंग दिख सकती है; इसी वजह से ऐसे मामलों में सटीक key का स्पॉट‑चेक अधिक भरोसेमंद होता है।

इसे साफ़‑सुथरे तरीके से कैसे ठीक करें

इरादा स्पष्ट करने के दो संगत तरीके हैं।

पहला तरीका है root से absolute पथ देना, जिसमें group नोड भी शामिल हो—जैसे ${net.feat_size}। यह संयोजित संरचना से मेल खाता है।

दूसरा तरीका—जो grouped फ़ाइल में आमतौर पर अधिक उपयुक्त है—relative interpolation का उपयोग करना है। OmegaConf ऐसे relative रेफरेंस का समर्थन करता है जो नोड की absolute स्थिति से स्वतंत्र होते हैं। इस स्थिति में, आपको उसी mapping में मौजूद key का संदर्भ चाहिए, जिसे इस तरह लिखा जा सकता है:

# net/net_a.yaml
feat_size: 106
stages:
  unit_1:
    in_size: ${...feat_size}
    emb_size: 64
    out_size: 64

Relative interpolation रेफरेंस को स्थिर रखता है, चाहे कॉन्फ़िग अलग‑अलग पथों के तहत क्यों न जुड़ा हो; इससे group नाम या अंतिम ट्री में उस group के स्थान पर कड़ी निर्भरता नहीं रहती।

यह समझ क्यों ज़रूरी है

यह जानना कि इंटरपोलेशन डिफ़ॉल्ट रूप से absolute है और lazily resolve होता है, जाँच के दौरान अनावश्यक चिंताओं से बचाता है। यह भी स्पष्ट करता है कि grouped फ़ाइल के भीतर root‑स्टाइल ${key} क्यों resolve नहीं होता, और ${...key} अधिक मजबूत क्यों है। Relative interpolation नोड के absolute पथ पर निर्भरता हटाती है और कॉन्फ़िग ट्री को पुनर्गठित करना काफी कम त्रुटिपूर्ण बनाती है।

मुख्य बातें

Grouped Hydra कॉन्फ़िग के अंदर sibling मानों का संदर्भ देते समय, ${...feat_size} जैसी relative interpolation को प्राथमिकता दें। यदि आप absolute interpolation चुनते हैं, तो पूरा पथ शामिल करें, जैसे ${net.feat_size}। और जब यह सत्यापित करना हो कि Hydra वास्तव में क्या resolve करता है, तो पूरे कॉन्फ़िग की स्ट्रिंग अभिव्यक्ति पर निर्भर रहने के बजाय विशिष्ट key का मान जांचें।

यह लेख StackOverflow के एक प्रश्न (लेखक: Dan Jackson) और Omry Yadan के उत्तर पर आधारित है।