当前位置: 首页 > news >正文

[python tools] 今天看到另一个配置工具 YACS,所以做下笔记

YACS

实际上就只是把别人的readme翻译了一下

github: https://github.com/rbgirshick/yacs
样例代码: https://github.com/Wuziyi616/multi_part_assembly/blob/master/docs/config.md

一、使用方法

1. 首先搞一个config的python文件,用来存一下基本的配置信息

比如说显卡的数量、num_works等等。

# my_project/config.py
from yacs.config import CfgNode as CN_C = CN()_C.SYSTEM = CN()
# Number of GPUS to use in the experiment
_C.SYSTEM.NUM_GPUS = 8
# Number of workers for doing things
_C.SYSTEM.NUM_WORKERS = 4_C.TRAIN = CN()
# A very important hyperparameter
_C.TRAIN.HYPERPARAMETER_1 = 0.1
# The all important scales for the stuff
_C.TRAIN.SCALES = (2, 4, 8, 16)def get_cfg_defaults():"""Get a yacs CfgNode object with default values for my_project."""# Return a clone so that the defaults will not be altered# This is for the "local variable" use patternreturn _C.clone()# Alternatively, provide a way to import the defaults as
# a global singleton:
# cfg = _C  # users can `from config import cfg`

2. 这个基本的配置信息还可以和yaml文件一起使用

YACS给的使用场景是,你可以给每一个实验写一个yaml文件,然后将这个yaml+前面的config文件一起使用

# my_project/main.pyimport my_project
from config import get_cfg_defaults  # local variable usage pattern, or:
# from config import cfg  # global singleton usage patternif __name__ == "__main__":cfg = get_cfg_defaults()cfg.merge_from_file("experiment.yaml")cfg.freeze()print(cfg)# Example of using the cfg as global access to optionsif cfg.SYSTEM.NUM_GPUS > 0:my_project.setup_multi_gpu_support()model = my_project.create_model(cfg)
# my_project/experiment.yaml
SYSTEM:NUM_GPUS: 2
TRAIN:SCALES: (1, 2)

3. 还可以通过freeze()函数来冻结 config

# my_project/main.pyimport my_project
from config import get_cfg_defaults  # local variable usage pattern, or:
# from config import cfg  # global singleton usage patternif __name__ == "__main__":cfg = get_cfg_defaults()cfg.merge_from_file("experiment.yaml")cfg.freeze()print(cfg)# Example of using the cfg as global access to optionsif cfg.SYSTEM.NUM_GPUS > 0:my_project.setup_multi_gpu_support()model = my_project.create_model(cfg)

4. 你还可以通过list来merge配置信息

但是我觉得这个看上去 好像不如argsparse好用

cfg.merge_from_file("experiment.yaml")
# Now override from a list (opts could come from the command line)
opts = ["SYSTEM.NUM_GPUS", 8, "TRAIN.SCALES", "(1, 2, 3, 4)"]
cfg.merge_from_list(opts)

The following principle is recommended: “There is only one way to configure the same thing.” This principle means that if an option is defined in a YACS config object, then your program should set that configuration option using cfg.merge_from_list(opts) and not by defining, for example, --train-scales as a command line argument that is then used to set cfg.TRAIN.SCALES.

二、在 Multi_part_assembly这个仓库中是具体使用

https://github.com/Wuziyi616/multi_part_assembly/blob/master/docs/config.md

这个项目是将配置信息分割在不同的python文件中,然后通过继承和组合来获得新的配置。

1. 比如说面这个数据集的配置 可以和 模型结构的配置组合在一起

datasets/partnet.py

from yacs.config import CfgNode as CN_C = CN()
_C.dataset = 'partnet'
_C.data_dir = './data/partnet'def get_cfg_defaults():return _C.clone()

model/global.py

from yacs.config import CfgNode as CN_C = CN()
_C.name = 'global'
_C.encoder = 'pointnet'def get_cfg_defaults():return _C.clone()

global-partnet.py

import os
from yacs.config import CfgNode as CN
from multi_part_assembly.utils import merge_cfg# inheriting configs by specifying `_base_`
# 'data' field will be from `partnet.py`
# 'model' field will be from `global.py`
_base_ = {'data': 'datasets/partnet.py','model': 'model/global.py',
}_C = CN()  # create self in yacs# to override a field in a parent config
# you need to first create a `CN()` base for it
# then modify the value by setting new values
_C.data = CN()
_C.data.data_dir = './datasets/partnet'  # overriding `data_dir`# merging code
def get_cfg_defaults():base_cfg = _C.clone()cfg = merge_cfg(base_cfg, os.path.dirname(__file__), _base_)return cfg

2. 这篇文章的命名是这样的

{model}_{batch_per_gpu x gpu}_{schedule}_{dataset}.py

  • model 使用的模型
  • batch per gpu x gpu 在每个gpu上的batch,总的gpu的数量
  • dataset 数据集
  • schedule 应该是学习率的配置

可以使用下面的代码看一下这个配置有哪些信息

python scripts/print_cfg.py --cfg_file $CFG
http://www.lryc.cn/news/42907.html

相关文章:

  • Prometheus cadvisor容器监控和node-exporter节点监控
  • 机器学习|正则化|评估方法|分类模型性能评价指标|吴恩达学习笔记
  • python迭代器详解
  • 关于Docker逃逸
  • @Autowired和@Resource区别
  • 动态内存管理详细讲解
  • Python和Excel的完美结合:常用操作汇总(案例详析)
  • 卡特兰数、斯特林数基础
  • STL——mapmultimap和setmultiset
  • 2023热门抖音权重查询小程序源码
  • 153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]
  • 如何成为优秀的程序员
  • 多线程(四):线程安全
  • [ROC-RK3568-PC] [Firefly-Android] 10min带你了解Camera的使用
  • C++之模拟实现string
  • SpringBoot实战(十三)集成 Admin
  • mke2fs命令:建立ext2文件系统
  • 免费分享一个springboot+vue的办公系统
  • STM32数据搬运工DMA
  • 4、操作系统——进程间通信(2)(system V-IPC介绍)
  • 基于CentOS Stream 9平台搭建Nacos2.0.4集群以及OpenResty反向代理
  • 老杜MySQL入门基础 第二天
  • Python深度学习实战:人脸关键点(15点)检测pytorch实现
  • linux简单入门
  • 给准备面试网络工程师岗位的应届生一些建议
  • 主线程与子线程之间相互通信(HandlerThread)
  • 13基于双层优化的电动汽车日前-实时两阶段市场竞标
  • REDIS19_zipList压缩列表详解、快递列表 - QuickList、跳表 - SkipList
  • JavaScript 基础 - 第3天
  • 23.3.26总结