yacs库的使用——配置神经网络超参数
纪录下本人使用分布式训练神经网络时采用yacs库配置神经网络的超参数的理解,开始学习吧~
概念:YACS是一个轻量级库,使用*.YAML格式的文件进行参数的存储,用于定义和管理系统配置,这些“配置”通常涵盖诸如用于训练机器学习模型的超参数或可配置模型超参数(诸如卷积神经网络的深度)之类的概念。本人采用.yaml文件j进行每个模型训练的配置(YACS使用YAML作为简单的,人类可读的序列化格式.)
用法
YACS可以以各种灵活的方式使用。主要范例有两种:
(1)配置为局部变量 (local variable) 推荐使用
(2)配置为全局单例(global singleton)
使用yacs流程
要在你的项目中使用yacs库,一般是以下流程:
(1)首先要创建一个项目配置文件
这个配置文件通常称为config.py或defaults.py。 我们需要在文件中指定所有默认,此文件是所有可配置选项的一站式参考点。(也就是为所有的配置提供默认值) 它应该有很好的文档记录,并为所有选项提供合理的默认值。
#本人的是defaults.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os
from yacs.config import CfgNode as CN #yacs
_C = CN() #创建一个配置节点_C(配置网络整体的节点)
_C.OUTPUT_DIR = '' #输出路径
_C.LOG_DIR = '' #存放日志文件路径
_C.DATA_DIR = '' #数据路径
_C.GPUS = (0,) #GPU的数目
_C.WORKERS = 4 #分布式训练的进程数目
_C.PRINT_FREQ = 20
_C.AUTO_RESUME = False
_C.PIN_MEMORY = True #锁页内存,创建DataLoader时,意味着生成的Tensor数据最开始是属于内存中的锁页内存,这样将内存的Tensor转义到GPU的显存就会更快一些。显卡中的显存全部是锁页内存
_C.RANK = 0 #rank表示进程序号,用于进程间通讯,表征进程优先级。rank = 0 的主机为 master 节点,在各进程梯度计算完成之后,各进程需要将梯度进行汇总平均,然后再由 rank=0 的进程广播
# Cudnn related params
_C.CUDNN = CN() #创建新的配置节点_C.CUDNN(cuDNN加速节点)
_C.CUDNN.BENCHMARK = True #内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法
_C.CUDNN.DETERMINISTIC = False #避免计算中有随机性,每次网络前馈结果略有差异的波动
_C.CUDNN.ENABLED = True #设置cuDNN使用非确定性算法
(2)接下来,需要创建YAML配置文件
通常你会为每个实验(也就是你的每一次训练)创建一个.yaml文件。每个配置文件仅重写该实验中需要更改的配置选项,这个文件里只需要写出需要改变的参数, 其它的使用config.py/default.py里默认的就行了
AUTO_RESUME: true
CUDNN:
BENCHMARK: true
DETERMINISTIC: false
ENABLED: true
DATA_DIR: ''
GPUS: (0,1)
OUTPUT_DIR: 'output'
LOG_DIR: 'log'
WORKERS: 24
PRINT_FREQ: 100
注意:key和value之间必须有空格
(3)最后可以在你的实际项目代码使用配置,读取yaml文件
在初始设置之后,最好通过调用freeze()方法将配置冻结以防止进一步修改。 配置选项可以通过导入cfg并直接访问它来使用全局选项集(globle singleton模式),或者可以复制cfg并将其作为参数传递(local variable模式)。
# my_project/train.py
from config import get_cfg #局部变量用例模式
# from config import cfg # 全局单例用例模式
if __name__ == "__main__":
cfg = get_cfg_defaults()
cfg.merge_from_file("experiment.yaml")
cfg.freeze()
print(cfg)
# 使用cfg作为全局通道
if cfg.SYSTEM.NUM_GPUS > 0:
my_project.setup_multi_gpu_support()
model = my_project.create_model(cfg)