我想将 OmegaConf/Hydra 配置转换为嵌套字典/列表。我怎样才能做到这一点?
我想在加载 Hydra 配置后添加一个键 + 值。本质上我想运行我的代码并检查 GPU 是否可用。如果是,则将该设备记录为 gpu,否则保留 cpu。
本质上保存了以下输出:
torch.cuda.is_available()
Run Code Online (Sandbox Code Playgroud)
当我尝试添加带有“setdefault”的键时:
@hydra.main(config_path="conf", config_name="config")
def my_app(cfg: DictConfig) -> None:
cfg.setdefault("new_key", "new_value")
Run Code Online (Sandbox Code Playgroud)
如果我这样做,也会出现同样的错误:
cfg.new_key = "new_value"
print(cfg.new_key)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
omegaconf.errors.ConfigKeyError: Key 'new_key' is not in struct
full_key: new_key
reference_type=Optional[Dict[Union[str, Enum], Any]]
object_type=dict
Run Code Online (Sandbox Code Playgroud)
我当前的解决方法是仅使用 OmegaConfig:
cfg = OmegaConf.structured(OmegaConf.to_yaml(cfg))
cfg.new_key = "new_value"
print(cfg.new_key)
>>>> new_value
Run Code Online (Sandbox Code Playgroud)
当然一定有更好的方法来做到这一点吗?
假设我们有以下设置(从Hydra 文档中复制和缩短):
配置文件: config.yaml
db:
driver: mysql
user: omry
pass: secret
Run Code Online (Sandbox Code Playgroud)
蟒文件: my_app.py
import hydra
@hydra.main(config_path="config.yaml")
def my_app(cfg):
print(cfg.pretty())
if __name__ == "__main__":
my_app()
Run Code Online (Sandbox Code Playgroud)
当我们可以在函数上使用装饰器时,这很有效my_app。现在我想(为了小脚本和测试目的,但这并不重要)cfg在任何函数之外获取这个对象,只是在一个普通的 python 脚本中。据我了解装饰器的工作原理,应该可以调用
import hydra
cfg = hydra.main(config_path="config.yaml")(lambda x: x)()
print(cfg.pretty())
Run Code Online (Sandbox Code Playgroud)
但 thencfg只是None而不是所需的配置对象。所以看起来装饰器没有传递返回值。有没有另一种方法可以做到这一点cfg?
最近我开始使用Hydra来管理我的应用程序中的配置。我使用结构化配置为 .yaml 配置文件创建架构。Hyda 中的结构化配置使用数据类进行类型检查。但是,我还想对我在结构化配置中指定的某些参数使用某种验证器(类似这样)。
您知道是否可以使用 Pydantic 来实现此目的吗?当我尝试使用 Pydantic 时,OmegaConf 抱怨它:
omegaconf.errors.ValidationError: Input class 'SomeClass' is not a structured config. did you forget to decorate it as a dataclass?
Run Code Online (Sandbox Code Playgroud) 我知道我可以通过hydra.run.dir=XXX从命令行设置来更改配置中的工作目录。但是如何从不使用 CLI 参数的脚本中正确执行此操作,甚至将日志保存在我设置的目录中?
该代码不起作用,因为:
cfg.hydra。UPD:我在评论中得到了指示。if __name__ == 'main':我可以在调用 Hydra 之前更改块中的 Hydra 参数。hydra.run.dir但如何从脚本中获取和修改呢?
@hydra.main(config_path="conf", config_name="config")
def main(cfg):
cfg.hydra.run.dir = "./c_out/cached_loss" # no such attribute
logger.info('I log something')
Run Code Online (Sandbox Code Playgroud)
我的九头蛇配置如下所示:
defaults:
- hydra/job_logging: custom_logging
Run Code Online (Sandbox Code Playgroud)
# hydra/custom_logging.yaml
# python logging configuration for tasks
version: 1
formatters:
simple:
format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s'
handlers:
console:
class: logging.StreamHandler
formatter: simple
stream: ext://sys.stdout
file:
class: logging.FileHandler
formatter: simple
# relative to the job log directory
filename: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Windows 10 系统上安装 Hydra 2.5。我安装了 Visual Studio Build Tools 2022 和桌面 C++ 开发选项。当我使用 pip 时,我收到下面附加的错误。我已经尝试过 python 3.10 和 3.9。我尝试过新的 conda 环境。我还尝试安装 Mingw-w64 看看是否有帮助,但没有帮助。任何建议,将不胜感激。
\nBuilding wheels for collected packages: hfcnn, hydra\n Building wheel for hfcnn (setup.py) ... done\n Created wheel for hfcnn: filename=hfcnn-0.1.0-py2.py3-none-any.whl size=42563 sha256=6eddd284ff183a321cd329928f9d3c242253072b854502a6df97de9b413edc69\n Stored in directory: C:\\Users\\natep\\AppData\\Local\\Temp\\pip-ephem-wheel-cache-w1fs1loj\\wheels\\24\\17\\50\\c13d5e23193f95d3a4a29906052d1bfec09abb75cf58968c32\n Building wheel for hydra (setup.py) ... error\n error: subprocess-exited-with-error\n\n \xc3\x97 python setup.py bdist_wheel did not run successfully.\n \xe2\x94\x82 exit code: 1\n \xe2\x95\xb0\xe2\x94\x80> [39 lines of output]\n running bdist_wheel\n running build\n …Run Code Online (Sandbox Code Playgroud) python python-3.x windows-10 visual-studio-2017-build-tools fb-hydra
我有一个非常简单的 Python 脚本:
import hydra
from omegaconf import DictConfig, OmegaConf
@hydra.main(version_base="1.3", config_path=".", config_name="config")
def main(cfg: DictConfig) -> None:
if cfg.benchmarking.seed_number is None:
raise ValueError()
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
这里是配置文件:
benchmarking:
seed_number: None
Run Code Online (Sandbox Code Playgroud)
不幸的是,Python 脚本不会引发错误。相反,当我打印 的类型时cfg.benchmarking.seed_number,它是str。我怎样才能通过None呢?
我有一个主配置文件,比方说config.yaml:
num_layers: 4
embedding_size: 512
learning_rate: 0.2
max_steps: 200000
Run Code Online (Sandbox Code Playgroud)
我希望能够在命令行上使用另一个文件(例如 say )覆盖它,big_model.yaml我在概念上使用它,例如:
python my_script.py --override big_model.yaml
Run Code Online (Sandbox Code Playgroud)
可能big_model.yaml看起来像:
num_layers: 8
embedding_size: 1024
Run Code Online (Sandbox Code Playgroud)
我希望能够覆盖任意数量的此类文件,每个文件的优先级都高于前一个文件。假设我也有fast_learn.yaml
learning_rate: 2.0
Run Code Online (Sandbox Code Playgroud)
所以我想从概念上做一些类似的事情:
python my_script.py --override big_model.yaml --override fast_learn.yaml
Run Code Online (Sandbox Code Playgroud)
在九头蛇中做到这一点的最简单/最标准的方法是什么?(或者可能在 omegaconf 中?)
(请注意,我希望这些覆盖文件理想地只是标准 yaml 文件,理想情况下覆盖早期的 yaml 文件;尽管如果我必须使用覆盖 DSL 来编写,我可以这样做,如果这是最简单/最好的/最标准的方式)
我有一个配置树,例如:
config.yaml
model/
model_a.yaml
model_b.yaml
model_c.yaml
Run Code Online (Sandbox Code Playgroud)
其中config.yaml包含:
config.yaml
model/
model_a.yaml
model_b.yaml
model_c.yaml
Run Code Online (Sandbox Code Playgroud)
我想从我的 python 代码或文件本身访问所使用的模型配置文件的名称(默认或覆盖)。就像是:
# @package _global_
defaults:
- _self_
- model: model_a.yaml
some_var: 42
Run Code Online (Sandbox Code Playgroud)
或(来自例如model_a.yaml)
@hydra.main(...)
def main(config):
model_name = config.model.__filename__
Run Code Online (Sandbox Code Playgroud)
提前致谢!
fb-hydra ×10
python ×7
omegaconf ×3
python-3.x ×2
hydra-core ×1
hydra-python ×1
visual-studio-2017-build-tools ×1
windows-10 ×1