<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Config Management | Haobin Tan</title><link>https://haobin-tan.netlify.app/tags/config-management/</link><atom:link href="https://haobin-tan.netlify.app/tags/config-management/index.xml" rel="self" type="application/rss+xml"/><description>Config Management</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 23 Feb 2023 00:00:00 +0000</lastBuildDate><image><url>https://haobin-tan.netlify.app/media/icon_hu7d15bc7db65c8eaf7a4f66f5447d0b42_15095_512x512_fill_lanczos_center_3.png</url><title>Config Management</title><link>https://haobin-tan.netlify.app/tags/config-management/</link></image><item><title>🔖 Config Manaegment</title><link>https://haobin-tan.netlify.app/docs/ai/pytorch/cfg_management/</link><pubDate>Thu, 23 Feb 2023 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/ai/pytorch/cfg_management/</guid><description/></item><item><title>YACS</title><link>https://haobin-tan.netlify.app/docs/ai/pytorch/cfg_management/yacs_for_config/</link><pubDate>Wed, 12 May 2021 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/ai/pytorch/cfg_management/yacs_for_config/</guid><description>&lt;p>&lt;strong>YACS&lt;/strong> stands for Yet Another Configuration System. It helps define and manage system configurations such as hyperparameters and architecture/module choices for training a model. A tool like this one is essential to reproducibility and is a fundamental component of the system.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>YACS can be used in a variety of flexible ways. There are two main paradigms:&lt;/p>
&lt;ul>
&lt;li>Configuration as &lt;em>local variable&lt;/em> (recommend)&lt;/li>
&lt;li>Configuration as a &lt;em>global singleton&lt;/em>&lt;/li>
&lt;/ul>
&lt;h3 id="step-1-create-project-config-file">Step 1: Create Project Config File&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>Create a folder called &lt;code>config&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>In &lt;code>config&lt;/code> folder, create config file, typically called &lt;code>config.py&lt;/code> or &lt;code>default.py&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">my_project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">|- config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- __init__.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |- default.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">|- experiment.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">|- main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This file is the one-stop reference point for all configurable options. It should be very well documented and provide sensible defaults for all options.&lt;/p>
&lt;p>E.g.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># my_project/config/default.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">yacs.config&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">CfgNode&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">CN&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">_C&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">CN&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">_C&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SYSTEM&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">CN&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Number of GPUS to use in the experiment&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">_C&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SYSTEM&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">NUM_GPUS&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Number of workers for doing things&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">_C&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SYSTEM&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">NUM_WORKERS&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">_C&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">TRAIN&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">CN&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># A very important hyperparameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">_C&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">TRAIN&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">HYPERPARAMETER_1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># The all important scales for the stuff&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">_C&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">TRAIN&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SCALES&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_cfg_defaults&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Get a yacs CfgNode object with default values for my_project.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Return a clone so that the defaults will not be altered&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># This is for the &amp;#34;local variable&amp;#34; use pattern&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">_C&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">clone&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Alternatively, provide a way to import the defaults as a global singleton&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cfg = _C # users can `from config import cfg`&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>For global singleton, another way is to declare &lt;code>cfg&lt;/code> in &lt;code>__init__.py&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># my_project/config/__init__.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">.default&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">_C&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">cfg&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then, in other script, we can import it like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">config&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">cfg&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/blockquote>
&lt;h3 id="step-2-create-yaml-configuration-files">Step 2: Create YAML Configuration Files&lt;/h3>
&lt;p>Typically you&amp;rsquo;ll make one for each experiment. Each configuration file only overrides the options that are changing in that experiment.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># my_project/experiment.yaml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">SYSTEM&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">NUM_GPUS&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">TRAIN&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">SCALES&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">(1, 2)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-3-use-config-in-actual-project-code">Step 3: Use Config in Actual Project Code&lt;/h3>
&lt;p>Local variable usage pattern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># my_project/main.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">config&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">get_cfg_defaults&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_cfg_defaults&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">defrost&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">merge_from_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;experiment.yaml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Override from a list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">opts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;SYSTEM.NUM_WORKERS&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">merge_from_list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">opts&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Freeze the config to prevent further modification&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">freeze&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Further code using config settings&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ...&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">SYSTEM:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> NUM_GPUS: 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> NUM_WORKERS: 8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">TRAIN:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> HYPERPARAMETER_1: 0.1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> SCALES: (1, 2)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We can also use global singleton usage pattern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">config&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">cfg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">defrost&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">merge_from_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;experiment.yaml&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Override from a list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">opts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;SYSTEM.NUM_WORKERS&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">merge_from_list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">opts&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Freeze the config to prevent further modification&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">freeze&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Further code using config settings&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ...&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://github.com/rbgirshick">rbgirshick&lt;/a>/&lt;strong>&lt;a href="https://github.com/rbgirshick/yacs">yacs&lt;/a>&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://julienbeaulieu.github.io/2020/03/16/building-a-flexible-configuration-system-for-deep-learning-models/">Building A Flexible Configuration System For Deep Learning Models&lt;/a> - A good guideline for organizing Deep Learning projects 👍&lt;/p>
&lt;/li>
&lt;/ul></description></item><item><title>Hydra: Basics</title><link>https://haobin-tan.netlify.app/docs/ai/pytorch/cfg_management/hydra_basics/</link><pubDate>Thu, 23 Feb 2023 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/ai/pytorch/cfg_management/hydra_basics/</guid><description>&lt;p>&lt;img src="https://raw.githubusercontent.com/EckoTan0804/upic-repo/master/uPic/Hydra-Readme-logo2.svg" alt="GitHub - facebookresearch/hydra: Hydra is a framework for elegantly configuring complex applications">&lt;/p>
&lt;p>&lt;strong>Hydra is an open-source Python framework that simplifies the development of research and other complex applications.&lt;/strong> The name Hydra comes from its ability to run multiple similar jobs - much like a Hydra with multiple heads.&lt;/p>
&lt;p>Key features&lt;/p>
&lt;ul>
&lt;li>Hierarchical configuration composable from multiple sources&lt;/li>
&lt;li>Configuration can be specified or overridden from the command line&lt;/li>
&lt;li>Dynamic command line tab completion&lt;/li>
&lt;li>Run your application locally or launch it to run remotely&lt;/li>
&lt;li>Run multiple jobs with different arguments with a single command&lt;/li>
&lt;/ul>
&lt;p>Installation:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ pip install hydra-core --upgrade
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="specifying-a-config-file">Specifying a Config File&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>Hydra configuration files are yaml files and should have the &lt;code>.yaml&lt;/code> file extension.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Specify the config name by passing a &lt;code>config_name&lt;/code> parameter to the &lt;strong>@hydra.main()&lt;/strong> decorator. Note that you should omit the &lt;strong>.yaml&lt;/strong> extension.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Specify the directory containing it relative to the application by passing &lt;code>config_path&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>When running the script, use &lt;code>++&lt;/code> to override a config value if it&amp;rsquo;s already in the config, or add it otherwise.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="example">Example&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">|- config.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">|- my_app.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># config.yaml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">db&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">driver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mysql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">user&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">omry&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">secret&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">omegaconf&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OmegaConf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hydra&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@hydra.main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">version_base&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">config_path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">config_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;config&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">my_app&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">OmegaConf&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_yaml&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">my_app&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Hydra creates an empty &lt;code>cfg&lt;/code> object and passes it to the function annotate with &lt;code>@hydra.main&lt;/code>&lt;/p>
&lt;p>&lt;code>config.yaml&lt;/code> is loaded automatically when you run your application.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> driver: mysql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: omry
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> password: secret
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>Note: &lt;code>config_path&lt;/code> and &lt;code>config_name&lt;/code> can also be specified in command line instead of in code.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py --config-path&lt;span class="o">=&lt;/span>. --config-name&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;config&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/blockquote>
&lt;p>We can use &lt;code>++&lt;/code> to override a config value if it&amp;rsquo;s already in the config, or add it otherwise:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Override an existing item&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ python my_app.py ++db.password&lt;span class="o">=&lt;/span>&lt;span class="m">1234&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> driver: mysql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: omry
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> password: &lt;span class="m">1234&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add a new item&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ python my_app.py ++db.timeout&lt;span class="o">=&lt;/span>&lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> driver: mysql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: omry
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> password: secret
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> timeout: &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="using-the-config-object">Using the Config Object&lt;/h2>
&lt;p>Hydra&amp;rsquo;s configuration object is an instance of &lt;code>OmegaConf&lt;/code>&amp;rsquo;s DictConfig. More about &lt;code>OmegaConf&lt;/code> see &lt;a href="https://omegaconf.readthedocs.io/en/latest/usage.html#access-and-manipulation">here&lt;/a>.&lt;/p>
&lt;h4 id="example-1">Example&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># config.yaml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">node&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Config is hierarchical&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">loompa&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">10&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Simple value&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">zippity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${node.loompa} &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Value interpolation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">do&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;oompa ${node.loompa}&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># String interpolation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">waldo&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">???&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Missing value, must be populated prior to access&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># main.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">omegaconf&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OmegaConf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hydra&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@hydra.main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">version_base&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">config_path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">config_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;config&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">my_app&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">loompa&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="c1"># attribute style access&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="n">cfg&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;node&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s2">&amp;#34;loompa&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="c1"># dictionary style access&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">zippity&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="c1"># Value interpolation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="nb">isinstance&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">zippity&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># Value interpolation type&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">do&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;oompa 10&amp;#34;&lt;/span> &lt;span class="c1"># string interpolation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">node&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">waldo&lt;/span> &lt;span class="c1"># raises an exception&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">my_app&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="grouping-config-files">Grouping Config Files&lt;/h2>
&lt;p>A &lt;em>&lt;strong>Config Group&lt;/strong>&lt;/em> is a named group with a set of valid options. Selecting a non-existent config option generates an error message with the valid options.&lt;/p>
&lt;h3 id="creating-config-groups">Creating config groups&lt;/h3>
&lt;p>To create a config group, create a directory to hold a file for each configuration option.&lt;/p>
&lt;p>For example, suppose we want to benchmark your application on each of PostgreSQL and MySQL. We create a directory, e.g. &lt;code>db&lt;/code>, to hold a file for each database config option.&lt;/p>
&lt;p>Directory layout&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">├─ conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─ db
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├─ mysql.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─ postgresql.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── my_app.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>db/mysql.yaml&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">driver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mysql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">user&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">omry&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">secret&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>db/postgresql.yaml&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">driver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">postgresql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">user&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">postgres_user&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">drowssap&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">timeout&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">10&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="using-config-groups">Using config groups&lt;/h3>
&lt;p>Since we moved all the configs into the &lt;code>conf&lt;/code> directory, we need to tell Hydra where to find them using the &lt;code>config_path&lt;/code> parameter. &lt;strong>&lt;code>config_path&lt;/code> is a directory relative to &lt;code>my_app.py&lt;/code>&lt;/strong>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># my_app.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">omegaconf&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OmegaConf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hydra&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@hydra.main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">version_base&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">config_path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;conf&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">my_app&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">OmegaConf&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_yaml&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">my_app&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Running &lt;code>my_app.py&lt;/code> without requesting a configuration will print an empty config.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">{}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Select an item from a config group with &lt;code>+GROUP=OPTION&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py +db&lt;span class="o">=&lt;/span>postgresql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> driver: postgresql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pass: drowssap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> timeout: &lt;span class="m">10&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: postgres_user
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can still override individual values in the resulting config:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py +db&lt;span class="o">=&lt;/span>postgresql db.timeout&lt;span class="o">=&lt;/span>&lt;span class="m">20&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> driver: postgresql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pass: drowssap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> timeout: &lt;span class="m">20&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: postgres_user
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="selecting-default-configs">Selecting default configs&lt;/h2>
&lt;p>You can add a &lt;strong>Default List&lt;/strong> to your config file. A &lt;strong>Defaults List&lt;/strong> is a list telling Hydra how to compose the final config object. By convention, it is the &lt;em>first&lt;/em> item in the config.&lt;/p>
&lt;p>The defaults are ordered:&lt;/p>
&lt;ul>
&lt;li>If multiple configs define the same value, the last one wins.&lt;/li>
&lt;li>If multiple configs contribute to the same dictionary, the result is the combined dictionary.&lt;/li>
&lt;/ul>
&lt;p>Example:&lt;/p>
&lt;p>We extend the example above by adding a default config file named &lt;code>default.yaml&lt;/code> in the &lt;code>conf&lt;/code> directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">├─ conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─ db
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├─ mysql.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └─ postgresql.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| └─ default.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── my_app.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>default.yaml&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">db&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mysql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">omegaconf&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OmegaConf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hydra&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@hydra.main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">version_base&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">config_path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;conf&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">config_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">my_app&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">OmegaConf&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_yaml&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">my_app&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>When you run the updated application, MySQL is loaded by default.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> driver: mysql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pass: secret
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: omry
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="overriding-a-config-group-default">Overriding a config group default&lt;/h4>
&lt;p>We can still load PostgreSQL, and override individual values.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py &lt;span class="nv">db&lt;/span>&lt;span class="o">=&lt;/span>postgresql db.timeout&lt;span class="o">=&lt;/span>&lt;span class="m">20&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> driver: postgresql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pass: drowssap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> timeout: &lt;span class="m">20&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: postgres_user
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We can remove a default entry from the defaults list by prefixing it with ~:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py ~db
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">{}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="composition-order-of-primary-config">Composition order of primary config&lt;/h3>
&lt;p>Your primary config can contain both config values and a Defaults List. In such cases, you should add the &lt;code>_self_&lt;/code> keyword to your defaults list to specify the composition order of the config file relative to the items in the defaults list.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>If you want your primary config to override the values of configs from the Defaults List, append &lt;code>_self_&lt;/code> to the &lt;strong>end&lt;/strong> of the Defaults List.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># config.yaml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">db&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mysql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">_self_ &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># primary overrides default &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">db&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">user&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">root&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Result config: db.user from config.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> driver: mysql &lt;span class="c1"># db/mysql.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pass: secret &lt;span class="c1"># db/mysql.yaml &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: root &lt;span class="c1"># config.yaml (the value is overriden by primary confi)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>If you want the configs from the Defaults List to override the values in your primary config, insert &lt;code>_self_&lt;/code> as the **first **item in your Defaults List.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># config.yaml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">_self_ &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># default overrides primary&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">db&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mysql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">db&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">user&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">root&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Result config: db.user from config.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> driver: mysql &lt;span class="c1"># db/mysql.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pass: secret &lt;span class="c1"># db/mysql.yaml &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: omry &lt;span class="c1"># db/mysql.yaml &lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h2 id="leveraging-modularity-and-composition">Leveraging Modularity and Composition&lt;/h2>
&lt;p>Resorting to modularity and composition, we can keep the configs manageable. Instead of creating a numerb of different config files that fully specify each config, &lt;strong>create a single config that specifies the different configuration dimensions, and the default for each.&lt;/strong>&lt;/p>
&lt;h4 id="example-2">Example&lt;/h4>
&lt;p>Directory layout:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">├── conf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── config.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── db
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── mysql.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ └── postgresql.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── schema
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── school.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ ├── support.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ └── warehouse.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── ui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── full.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── view.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── my_app.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>configy.yaml&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">db&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mysql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">ui&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">full&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">schema&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">school&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The resulting default configuration is a composition of the &lt;em>mysql&lt;/em> database, the &lt;em>full&lt;/em> ui, and the &lt;em>school&lt;/em> schema&lt;/p>
&lt;h2 id="running-hydra">Running Hydra&lt;/h2>
&lt;h3 id="multirun-from-the-command-line">Multirun from the command-line&lt;/h3>
&lt;p>You can configure &lt;code>hydra.mode&lt;/code> in any supported way. The legal values are &lt;code>RUN&lt;/code> and &lt;code>MULTIRUN&lt;/code>.&lt;/p>
&lt;p>Setting &lt;code>hydra.mode=MULTIRUN&lt;/code> in your input config would make your application multi-run by default. For example, the following shows how to override from the command-line and sweep over &lt;strong>all&lt;/strong> 6 combinations of the dbs and schemas.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py hydra.mode&lt;span class="o">=&lt;/span>MULTIRUN &lt;span class="nv">db&lt;/span>&lt;span class="o">=&lt;/span>mysql,postgresql &lt;span class="nv">schema&lt;/span>&lt;span class="o">=&lt;/span>warehouse,support,school
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>2021-01-20 17:25:03,317&lt;span class="o">][&lt;/span>HYDRA&lt;span class="o">]&lt;/span> Launching &lt;span class="m">6&lt;/span> &lt;span class="nb">jobs&lt;/span> locally
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>2021-01-20 17:25:03,318&lt;span class="o">][&lt;/span>HYDRA&lt;span class="o">]&lt;/span> &lt;span class="c1">#0 : db=mysql schema=warehouse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>2021-01-20 17:25:03,458&lt;span class="o">][&lt;/span>HYDRA&lt;span class="o">]&lt;/span> &lt;span class="c1">#1 : db=mysql schema=support&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>2021-01-20 17:25:03,602&lt;span class="o">][&lt;/span>HYDRA&lt;span class="o">]&lt;/span> &lt;span class="c1">#2 : db=mysql schema=school&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>2021-01-20 17:25:03,755&lt;span class="o">][&lt;/span>HYDRA&lt;span class="o">]&lt;/span> &lt;span class="c1">#3 : db=postgresql schema=warehouse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>2021-01-20 17:25:03,895&lt;span class="o">][&lt;/span>HYDRA&lt;span class="o">]&lt;/span> &lt;span class="c1">#4 : db=postgresql schema=support&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>2021-01-20 17:25:04,040&lt;span class="o">][&lt;/span>HYDRA&lt;span class="o">]&lt;/span> &lt;span class="c1">#5 : db=postgresql schema=school&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can also specify the multirun mode by using &lt;code>--multirum&lt;/code> (&lt;code>-m&lt;/code>) argument:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py --multirun &lt;span class="nv">db&lt;/span>&lt;span class="o">=&lt;/span>mysql,postgresql &lt;span class="nv">schema&lt;/span>&lt;span class="o">=&lt;/span>warehouse,support,school
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python my_app.py -m &lt;span class="nv">db&lt;/span>&lt;span class="o">=&lt;/span>mysql,postgresql &lt;span class="nv">schema&lt;/span>&lt;span class="o">=&lt;/span>warehouse,support,school
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="sweeping-viahydrasweeperparams">Sweeping via &lt;code>hydra.sweeper.params&lt;/code>&lt;/h3>
&lt;p>You can also define sweeping in the input configs by overriding &lt;code>hydra.sweeper.params&lt;/code>.&lt;/p>
&lt;p>The multirun example above can be achieved via the following config:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">hydra&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">sweeper&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">params&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">db&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mysql,postgresql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">schema&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">warehouse,support,school&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If a sweep is specified in both an input config and at the command line, then the commandline sweep will &lt;strong>take precedence over&lt;/strong> the sweep defined in the input config.&lt;/p>
&lt;h3 id="additional-sweep-types">Additional sweep types&lt;/h3>
&lt;p>See the &lt;a href="https://hydra.cc/docs/advanced/override_grammar/extended/">Extended Override syntax&lt;/a> for details.&lt;/p>
&lt;h2 id="outputworking-directory">Output/Working directory&lt;/h2>
&lt;p>Hydra creates a directory for each run and executes your code within that working directory.&lt;/p>
&lt;p>The working directory is used to:&lt;/p>
&lt;ul>
&lt;li>Store the output for the application (For example, a database dump file)&lt;/li>
&lt;li>Store the Hydra output for the run (Configuration, Logs etc)&lt;/li>
&lt;/ul>
&lt;p>Every time you run the app, a new working directory is created.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># my_app.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hydra&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">omegaconf&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">DictConfig&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@hydra.main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">version_base&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">my_app&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Current working directory : &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">Path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cwd&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py hydra.job.chdir&lt;span class="o">=&lt;/span>True
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Current working directory : outputs&lt;span class="se">\2&lt;/span>023-02-20&lt;span class="se">\1&lt;/span>0-00-36
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>Note: By default &lt;code>hydra.job.chdir=False&lt;/code>, which means &lt;code>Path.cwd()&lt;/code> will output the directory where the python script locates. To get the log directory, you need to explicitly set &lt;code>hydra.job.chdir&lt;/code> to &lt;code>True&lt;/code>.&lt;/p>
&lt;/blockquote>
&lt;p>Structure of the working directory:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">outputs/2023-02-20/10-00-36
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── .hydra
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── config.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── hydra.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── overrides.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── my_app.log
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;p>Hydra output directory (&lt;code>.hydra&lt;/code> by default)&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;code>config.yaml&lt;/code>: A dump of the user specified configuration&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>hydra.yaml&lt;/code>: A dump of the Hydra configuration&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>overrides.yaml&lt;/code>: The command line overrides used&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;code>main_app.log&lt;/code>: Application log file created for this run&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="changing-or-disabling-hydras-output-subdir">Changing or disabling Hydra&amp;rsquo;s output subdir&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>You can change the &lt;code>.hydra&lt;/code> subdirectory name by overriding &lt;code>hydra.output_subdir&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>You can disable its creation by overriding &lt;code>hydra.output_subdir&lt;/code> to &lt;code>null&lt;/code>.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="accessing-the-original-working-directory-in-your-application">Accessing the original working directory in your application&lt;/h4>
&lt;p>With &lt;code>hydra.job.chdir=True&lt;/code>, you can still access the original working directory by importing &lt;code>get_original_cwd()&lt;/code> and &lt;code>to_absolute_path()&lt;/code> in &lt;code>hydra.utils&lt;/code>.&lt;/p>
&lt;h3 id="customizing-working-directory-pattern">Customizing working directory pattern&lt;/h3>
&lt;p>The output directory can be configured by&lt;/p>
&lt;ul>
&lt;li>
&lt;p>setting &lt;code>hydra.run.dir&lt;/code> (for single hydra runs) or&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>hydra.sweep.dir&lt;/code>/&lt;code>hydra.sweep.subdir&lt;/code> (for multirun sweeps).&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="configuration-for-single-run">Configuration for single run&lt;/h4>
&lt;p>Run output directory grouped by date:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">hydra&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">dir&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">./outputs/${now:%Y-%m-%d}/${now:%H-%M-%S}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Run output directory grouped by job name:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">hydra&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">dir&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">outputs/${hydra.job.name}/${now:%Y-%m-%d_%H-%M-%S}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Run output directory can contain user configuration variables:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">hydra&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">dir&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">outputs/${now:%Y-%m-%d_%H-%M-%S}/opt:${optimizer.type}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>More see: &lt;a href="https://hydra.cc/docs/configure_hydra/workdir/">Customizing working directory pattern&lt;/a>&lt;/p>
&lt;h2 id="logging">Logging&lt;/h2>
&lt;p>By default, Hydra logs at the &lt;code>INFO&lt;/code> level to both the console and a log file in the automatic working directory.&lt;/p>
&lt;p>Example&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">logging&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">omegaconf&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">DictConfig&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">hydra&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># A logger for this file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">logger&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getLogger&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vm">__name__&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@hydra.main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">my_app&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_cfg&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logger&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">info&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Info level message&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logger&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">debug&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Debug level message&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">my_app&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We can easily integrate &lt;code>loguru.logger&lt;/code> for customized logging.&lt;/p>
&lt;p>You can enable DEBUG level logging from the command line by overriding &lt;code>hydra.verbose&lt;/code>.&lt;/p>
&lt;p>&lt;code>hydra.verbose&lt;/code> can be a Boolean, a String or a List:&lt;/p>
&lt;p>Examples:&lt;/p>
&lt;ul>
&lt;li>&lt;code>hydra.verbose=true&lt;/code> : Sets the log level of &lt;strong>all&lt;/strong> loggers to &lt;code>DEBUG&lt;/code>&lt;/li>
&lt;li>&lt;code>hydra.verbose=NAME&lt;/code> : Sets the log level of the logger &lt;code>NAME&lt;/code> to &lt;code>DEBUG&lt;/code>. Equivalent to &lt;code>import logging; logging.getLogger(NAME).setLevel(logging.DEBUG)&lt;/code>.&lt;/li>
&lt;li>&lt;code>hydra.verbose=[NAME1,NAME2]&lt;/code>: Sets the log level of the loggers &lt;code>NAME1&lt;/code> and &lt;code>NAME2&lt;/code> to &lt;code>DEBUG&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="debug">Debug&lt;/h2>
&lt;h3 id="printing-the-configuration">Printing the configuration&lt;/h3>
&lt;p>Print the config for your app &lt;em>without&lt;/em> running your function by adding &lt;code>--cfg&lt;/code> or &lt;code>-c&lt;/code> to the command line.&lt;/p>
&lt;p>The &lt;code>--cfg&lt;/code> option takes one argument indicating which part of the config to print:&lt;/p>
&lt;ul>
&lt;li>&lt;code>job&lt;/code>: Your config&lt;/li>
&lt;li>&lt;code>hydra&lt;/code>: Hydra&amp;rsquo;s config&lt;/li>
&lt;li>&lt;code>all&lt;/code>: The full config, which is a union of &lt;code>job&lt;/code> and &lt;code>hydra&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>You can use &amp;ndash;package or -p to display a subset of the configuration:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py --cfg hydra --package hydra.job
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://hydra.cc/docs/tutorials/intro/">Hydra official tutorial&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Hydra: Advanced</title><link>https://haobin-tan.netlify.app/docs/ai/pytorch/cfg_management/hydra_advanced/</link><pubDate>Thu, 23 Feb 2023 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/ai/pytorch/cfg_management/hydra_advanced/</guid><description>&lt;h2 id="extend-configs">Extend Configs&lt;/h2>
&lt;p>A common pattern is to extend an existing config, overriding and/or adding new config values to it. The extension is done by&lt;/p>
&lt;ul>
&lt;li>
&lt;p>including the base configuration, and then&lt;/p>
&lt;/li>
&lt;li>
&lt;p>overriding the chosen values in the current config.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Example: Extending a config from the same config group&lt;/p>
&lt;p>&lt;code>config.yaml&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">db&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mysql &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>db/mysql.yaml&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">base_mysql &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># We extend mysql on the base of base_mysql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">user&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">omry&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">secret&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">3307&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">encoding&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">utf8&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>db/base_mysql.yaml&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">host&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">localhost&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">3306&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">user&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">???&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">???&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">db:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> host: localhost &lt;span class="c1"># from db/base_mysql&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> port: &lt;span class="m">3307&lt;/span> &lt;span class="c1"># overridden by db/mysql.yaml &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user: omry &lt;span class="c1"># populated by db/mysql.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> password: secret &lt;span class="c1"># populated by db/mysql.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> encoding: utf8 &lt;span class="c1"># added by db/mysql.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="configuring-experiments">Configuring Experiments&lt;/h2>
&lt;p>To clearly support multiple configurations, each configuration file &lt;strong>only specifies the changes to the master (default) configuration&lt;/strong>.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;p>The default configuration is:&lt;/p>
&lt;p>&lt;img src="https://raw.githubusercontent.com/EckoTan0804/upic-repo/master/uPic/%E6%88%AA%E5%B1%8F2023-02-23%2023.22.29.png" alt="截屏2023-02-23 23.22.29">&lt;/p>
&lt;p>The benchmark config files &lt;strong>specify the deltas from the default configuration&lt;/strong>:&lt;/p>
&lt;p>&lt;img src="https://raw.githubusercontent.com/EckoTan0804/upic-repo/master/uPic/%E6%88%AA%E5%B1%8F2023-02-23%2023.22.50.png" alt="截屏2023-02-23 23.22.50">&lt;/p>
&lt;p>Key concepts:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code># @package _global_&lt;/code>&lt;/strong>&lt;br>
Changes specified in this config should be interpreted as relative to the &lt;code>_global_&lt;/code> package.&lt;br>
We could instead place &lt;em>nglite.yaml&lt;/em> and &lt;em>aplite.yaml&lt;/em> next to &lt;em>config.yaml&lt;/em> and omit this line.&lt;/li>
&lt;li>&lt;strong>The overrides of &lt;code>/db&lt;/code> and &lt;code>/server&lt;/code> are absolute paths.&lt;/strong>&lt;br>
This is necessary because they are outside of the experiment directory.&lt;/li>
&lt;/ul>
&lt;p>Running the experiments from the command line requires prefixing the experiment choice with a &lt;code>+&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python .&lt;span class="se">\t&lt;/span>rain.py +experiment&lt;span class="o">=&lt;/span>aplite
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="sweeping-over-experiments">Sweeping over experiments&lt;/h3>
&lt;p>This approach also enables sweeping over those experiments:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py --multirun +experiment&lt;span class="o">=&lt;/span>aplite,nglite
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To run all the experiments, use the &lt;a href="https://hydra.cc/docs/advanced/override_grammar/extended/#glob-choice-sweep">glob&lt;/a> syntax:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python my_app.py --multirun &lt;span class="s1">&amp;#39;+experiment=glob(*)&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="specializing-configuration">Specializing Configuration&lt;/h2>
&lt;p>In some cases the desired configuration should depend on other configuration choices.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;p>You may want to use only 5 layers in your Alexnet model if the dataset of choice is cifar10, and the default 7 otherwise.&lt;/p>
&lt;p>We can start with a config that looks like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># config.yaml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">dataset&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">imagenet&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">model&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alexnet&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We want to specialize the config based on the choice of the selected dataset and model.&lt;/p>
&lt;p>&lt;code>OmegaConf&lt;/code> supports value interpolation, we can construct a value that would - at runtime - be a function of other values. The idea is that &lt;strong>we can add another element to the defaults list that would load a file name that depends on those two values&lt;/strong>.&lt;/p>
&lt;p>Modify &lt;code>config.yaml&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">dataset&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">imagenet&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">model&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alexnet&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">optional dataset_model&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${dataset}_${model}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;p>The key &lt;code>dataset_model&lt;/code> is an arbitrary directory, it can be anything unique that makes sense, including nested directory like &lt;code>dataset/model&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>${dataset}_${model}&lt;/code> is using OmegaConf&amp;rsquo;s &lt;a href="https://omegaconf.readthedocs.io/en/latest/usage.html#variable-interpolation">variable interpolation&lt;/a> syntax. At runtime, that value would resolve to &lt;em>imagenet_alexnet&lt;/em>, or &lt;em>cifar_resnet&lt;/em> - depending on the values of &lt;code>defaults.dataset&lt;/code> and &lt;code>defaults.model&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>optional&lt;/code>: By default, Hydra fails with an error if a config specified in the defaults does not exist. In this case we only want to specialize cifar10 + alexnet, not all 4 combinations. the keyword &lt;code>optional&lt;/code> tells Hydra to just continue if it can&amp;rsquo;t find this file.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Code example see: &lt;a href="https://github.com/facebookresearch/hydra/blob/main/examples/patterns/specializing_config">hydra/examples/patterns/specializing_config at main · facebookresearch/hydra · GitHub&lt;/a>&lt;/p>
&lt;h2 id="configuring-hydra">Configuring Hydra&lt;/h2>
&lt;p>Hydra is highly configurable. Many of its aspects and subsystems can be configured, including:&lt;/p>
&lt;ul>
&lt;li>The Launcher&lt;/li>
&lt;li>The Sweeper&lt;/li>
&lt;li>Logging&lt;/li>
&lt;li>Output directory patterns&lt;/li>
&lt;li>Application help (&amp;ndash;help and &amp;ndash;hydra-help)&lt;/li>
&lt;/ul>
&lt;p>You can include some Hydra config snippet in your own config to override it directly, or compose in different configurations provided by plugins or by your own code. You can also override everything in Hydra from the command line just like with your own configuration.&lt;/p>
&lt;h3 id="accessing-the-hydra-config">Accessing the Hydra config&lt;/h3>
&lt;p>Hydra is passing to the function annotated by &lt;code>@hydra.main()&lt;/code>. Two ways to access the Hydra config:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>In your config, using the &lt;code>hydra&lt;/code> resolver:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">config_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${hydra:job.name}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The resolver name is &lt;code>hydra&lt;/code>, and the &lt;code>key&lt;/code> is passed after the colon.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>In code, using the &lt;code>HydraConfig&lt;/code> singleton&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">hydra.core.hydra_config&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">HydraConfig&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@hydra.main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">my_app&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cfg&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">DictConfig&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HydraConfig&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">job&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>The following variables are populated at runtime:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://hydra.cc/docs/configure_hydra/intro/#hydrajob">&lt;code>hydra.job&lt;/code>&lt;/a>: used for configuring some aspects of your job (more information see: &lt;a href="https://hydra.cc/docs/configure_hydra/job/">Job Configuration&lt;/a>)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://hydra.cc/docs/configure_hydra/intro/#hydrarun">&lt;code>hydra.run&lt;/code>&lt;/a>: Used in single-run mode (i.e. when the &lt;code>--multirun&lt;/code> command-line flag is omitted). See &lt;a href="https://hydra.cc/docs/configure_hydra/workdir/#configuration-for-run">configuration for run&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://hydra.cc/docs/configure_hydra/intro/#hydrasweep">&lt;code>hydra.sweep&lt;/code>&lt;/a>: Used in multi-run mode (i.e. when the &lt;code>--multirun&lt;/code> command-line flag is given) See &lt;a href="https://hydra.cc/docs/configure_hydra/workdir/#configuration-for-multirun">configuration for multirun&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://hydra.cc/docs/configure_hydra/intro/#hydraruntime">&lt;code>hydra.runtime&lt;/code>&lt;/a>: Fields under &lt;strong>&lt;code>hydra.runtime&lt;/code>&lt;/strong> are populated automatically and should NOT be overridden.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://hydra.cc/docs/configure_hydra/intro/#hydraoverrides">&lt;code>hydra.overrides&lt;/code>&lt;/a>: Fields under &lt;strong>&lt;code>hydra.overrides&lt;/code>&lt;/strong> are populated automatically and should not be overridden.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://hydra.cc/docs/configure_hydra/intro/#hydramode">&lt;code>hydra.mode&lt;/code>&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>For other fields that are present also at the top level of the Hydra Config see: &lt;a href="https://hydra.cc/docs/configure_hydra/intro/#other-hydra-settings">Other Hydra settings&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Resolvers provided by Hydra&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>hydra&lt;/strong>: Interpolates into the &lt;code>hydra&lt;/code> config node. e.g. Use &lt;code>${hydra:job.name}&lt;/code> to get the Hydra job name.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>now&lt;/strong>: Creates a string representing the current time using &lt;a href="https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior">strftime&lt;/a>. e.g. for formatting the time you can use something like&lt;code>${now:%H-%M-%S}&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>python_version&lt;/strong>: Return a string representing the runtime python version by calling &lt;code>sys.version_info&lt;/code>. Takes an optional argument of a string with the values major, minor or macro. e.g:&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="hydra--wandb">Hydra + wandb&lt;/h2>
&lt;p>See: &lt;a href="https://wandb.ai/adrishd/hydra-example/reports/Configuring-W-B-Projects-with-Hydra--VmlldzoxNTA2MzQw">Configuring W&amp;amp;B Projects with Hydra&lt;/a>&lt;/p>
&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://hydra.cc/docs/patterns/extending_configs/">Hydra official tutorial&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>