ray.tune调参学习笔记1:超参数优化器tuner设置

        最近研究中学习使用python的ray.tune进行神经网络调参。在这里记录学习过程中的收获,希望能够帮助到有同样需求的人。学习过程主要参考ray官网文档,但由于笔者使用的ray为2.2.0版本,而官方文档为更高级版本,笔者代码和官方文档代码存在一定差异,具体以实际版本为准。

        在学习笔记0中笔者归纳了tune调参的基本流程:(1)定义模型训练API;(2)设置超参数优化器并进行超参数搜索;(3)对结果进行分析。模型训练API的定义根据具体任务需求和采用框架定义即可,可以参考学习笔记0中的样例,就不额外撰文进行说明。本文对定义超参数优化器的各种设置进行介绍。

1 概述

       在使用tune调参时,通过创建Tuner对象实例可以灵活地配置调参过程,包括使用的搜索算法和调度器的设置等。如下图所示, 超参数优化器turner的参数包括模型训练函数trainable,超参数搜索空间parame_space,优化算法配置tune_config,及运行配置run_config。以下进行具体说明。

2 模型训练API trainable

        trainable传递定义好的模型训练API即可。这里对模型训练函数的定义再做一些补充说明,如以下代码所示,模型训练函数可以使用report返回指标或通过return字典的方式返回指标,允许返回多个指标。使用report可以在每个epoch后进行报告,便于在训练过程中监控指标的变化趋势。而使用return通常是在整个训练过程结束后,将最终的指标作为函数的返回值返回,在无需监控指标变化趋势时可以使用。

def trainable(config):
    train_data, test_data = load_data()  # 读取训练及测试数据
    model, optimizer = create_model(config) # 创建模型及优化器
    while True:
        train(model,optimizer, train_data)  # 模型训练
        metric1, metric2 = test(model, test_data)  # 模型测试
        tune.report(metric1=metric1, metric2=metric2)  # 返回结果指标
    # return({"metric1": metric1, "metric2": metric2})

        需要注意,tune调参时默认在CPU上进行,如果需要在GPU上训练,需要在给tuner传递trainable参数时通过tune.with_resources(trainable, resources_per_trial)的方式分配使用的GPU,否则将报错。其中resources_per_trial为给每个trial分配的最大计算资源,以字典形式传递,如以下代码。

resources_per_trial = {"cpu": 2, "gpu": 1} # 如不设置,默认为{"cpu": 1}
tuner = tune.Tuner(
        trainable=tune.with_resources(trainable, resources=resources_per_trial),
        ...
    )

        此外需要注意tune调参时会根据分配的计算资源自动并行执行多个trial,例如设备有32个CPU,且给每个trial分配CPU数为4,则会并行执行8个trial,通过该方式可以控制并行的trial数量,避免过载。

3 搜索空间 param_space

        搜索空间以字典{参数名:取值范围}的形式输入,用来定义模型中各参数的搜索范围,每个trial将从搜索空间中选取一组可行的参数并进行网络训练。tune中提供了一些接口用于指定参数的取值范围,下表列出了一些常用的取值形式。

类型接口说明
定值/字典值只给一个值的情况下该参数将为定值
网格搜索tune.grid_search([List])通过多个Trial搜索List中的所有参数
随机选择tune.choice([List])每个trial随机从List中选择一个参数
随机均匀采样tune.uniform(a,b)每个trial从[a,b]中按均匀分布随机采样一个参数
随机整数采样tune.randint(a,b)每个trial从[a,b]中按正态分布随机采样一个整数
随机增量采样tune.quniform(a,b,q)每个trial从[a,b]中从a开始且间隔为q的数中随机采样

随机整数

增量采样

tune.qrandint(a,b,q)每个trial从[a,b]中从a开始且间隔为q的整数中随机采样
采样函数

tune.sample_from(function)

通过自定义的函数采样

        需要注意除网格搜索外其他的参数形式并不会影响搜索次数(即trial的数量),当没有参数采用网格搜索时,trial次数等于优化设置tune_config中设置的num_samples(默认为1)。当有参数采用网格搜索时,网格搜索会尝试所有参数,因此会执行N\prod G_i个trial,其中N为num_samples,G_i为第i个采用网格搜索的参数的所有取值数,即会重复N次网格搜索。

        此外使用tune.sample_from(function)可以按照自定义的函数生成参数,具体使用方法可以参考官方文档。

4 优化设置 tune_config

        优化设置tune_config以tune.TuneConfig类的对象作为输入,用来设置参数搜索及优化策略。TuneConfig的主要参数如下表。

参数说明作用及取值
metric性能指标和trainable返回的指标对应
mode确定性能指标最大化/最小化min或max

num_samples

搜索次数默认为1;若为-1则重复搜索直至满足停止条件
search_alg搜索算法

默认为随机搜索。可以通过实例化搜索算法对象从而基于BayesOpt,HyperOpt,Ax,Optuna等框架进行搜索,和这些框架配合搜索的方式可参考官方文档及官方示例。

scheduler调度方式

执行实验的调度方式,用于提前终止不良试验、暂停试验、克隆试验和更改正在运行的试验的超参数。tune提供了

FIFO(默认),MedianStopping,AsyncHyperBand,HyperBand,

PopulationBasedTrining等调度方法的API。不同调度方法主要决定了不同的搜索中止策略,具体方式可参考官方文档。

time_budget_s时间预算以秒为单位,超出时间预算的trial将终止

5 运行设置 run_config

        运行设置run_config以ray.air.config.RunConfig类的对象作为输入,用来设置参数搜索及优化策略。RunConfig的主要参数如下表。

参数说明作用及取值
name实验名称默认和trainable同名,保存结果时按该名称生成相应文件夹
local_dir存储地址搜索结果的存储地址,默认为~/ray_results
stop终止条件trainable训练的终止条件。可以以字典形式作为输入,在5.1节给出示例;也可以通过自定义函数或实例化Stopper类定义更复杂的终止条件,具体方式可参考官方文档。
checkpoint_config检查点配置具体方式可参考官方文档。

5.1 字典形式训练终止条件

        构建包含一或多个停止条件的字典作为stop参数输入。字典的键为trainable返回的metric时,将基于性能指标停止训练,如{"loss": 0.1}。字典的键为"training_iteration"时,如{"training_iteration": 100},当迭代次数超过设定值时停止训练。字典的键为time_total_s时,如{"time_total_s": 3600},当训练时间超过以秒为单位的指定值时停止训练。可以同时指定多个终止条件。以下给出示例代码:

stop_criteria = {
    "loss": 0.1,  # 损失小于0.1时停止训练
    "training_iteration": 100,  # 最多100次迭代
    "time_total_s": 3600  # 最多运行3600秒
}

tuner = tune.Tuner(
        ...,
        run_config=RunConfig(stop=stop_criteria)
    )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/575030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字藏品:重塑艺术与科技的新媒介

数字藏品,这个新兴的词汇,正在逐渐渗透到我们的日常生活中。它不仅是一种新的艺术表达方式,更是一种科技与艺术相结合的全新媒介。那么,数字藏品究竟是什么呢? 首先,我们需要明确一点,数字藏品并…

qt QTreeWidget 学习

树形控件的节点可以有多层、多个子节点, 如果将子节点全部展开,那么每一行都是一个数据条目。QTreeWidgetItem 比较特殊,一个条目内部可以有多列数据信息,相当于表格控件一整行的表格单元集成为一个条目。 默认情况下,…

ELK技术介绍:背景、功能及应用场景全面解析

一、ELK概述 ELK是由Elasticsearch、Logstash和Kibana三个开源软件组成的日志管理解决方案,这一组合在近年来得到了广泛的关注和应用。ELK的出现,源于大数据和云计算技术的快速发展,以及对高效日志管理的迫切需求。 随着企业信息化程度…

Nginx 配置 SSL(HTTPS)详解

Nginx作为一款高性能的HTTP和反向代理服务器,自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL,实现HTTPS的访问。 随着互联网安全性的日益重要,HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务…

6、ES单机设置用户名密码、集群设置用户名密码、es-head登录、如何去掉密码

目录 一、ES单节点密码配置1、修改配置文件2、 重启es服务3,执行修改密码命令4、访问服务 二、ES集群密码配置1、确定主节点2、生成elastic-stack-ca.p123、生成elastic-certificates.p124、修改配置文件并重启集群5、进行密码配置6、验证 三、es-head登录增加密码的…

ABAP json解析使用引用代替预定义数据结构

背景:在解析JSON数据时,通常会事先为定义相应的ABAP数据结构。但是,当遇到一些结构纵深较为复杂的情况时,会比较麻烦。 处理:使用引用类型来定义结构中的纵深部分来达到“省事”的目的,缺点在于访问时需要使…

Docker——开源的应用容器的引擎

目录 一、前言 1.虚拟化产品有哪些 1.1寄居架构 1.2源生架构 2.虚拟化产品对比/介绍 2.1虚拟化产品 2.1.1仿真虚拟化 2.1.2半虚拟化 2.1.3全虚拟化 2.2重点 2.2.1KVM——Linux内核来完成的功能和性能 2.2.2ESXI——用的比较多 二、Docker概述 1.Docker定义 2.Do…

赋能智慧校园!A3D数字孪生可视化,轻量又高效!

放假之后,学生们会逐步返学,大量人员出入校园,安全更是不容忽视,如何在短时间内对大批人员及设施进行智能监管?数字化转型是关键手段,我们可以融合线上线下数据,搭建3D立体的智慧校园&#xff0…

智能合约——提案demo

目录 这是一个超超超级简单的智能合约提案项目,你确定不点进来看一下吗? 引言: 1、搭建开发环境: 2、编写智能合约: 3、部署智能合约: ​编辑​编辑4、编写前端交互代码(使用web3.js&…

MyBatis源码之MyBatis中SQL语句执行过程

MyBatis源码之MyBatis中SQL语句执行过程 SQL执行入口 我们在使用MyBatis编程时有两种方式&#xff1a; 方式一代码如下&#xff1a; SqlSession sqlSession sqlSessionFactory.openSession(); List<Student> studentList sqlSession.selectList("com.sjdwz.da…

C语言——自定义数据类型(结构体内存对齐)

C语言中不只有内置类型诸如 int 、float、char 等类型&#xff0c;还有自定义数据类型&#xff0c;本文主要探讨结构体&#xff08;struct&#xff09;、联合体&#xff08;union&#xff09;、枚举&#xff08;enum&#xff09;三种自定义数据类型。 在我之前的文章《C语言—…

WPF2 样式布局

样式布局 WPF中的各类控件元素, 都可以自由的设置其样式。 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Margin) 水平位置(HorizontalAlignment) 垂直位置(VerticalAlignment) 等等。 而样式则是组织和重用以上的重要工具。…

解码Linux中的Shell:一探脚本起源、发展与变量数据类型之奥秘

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是Shell脚本 3、Sh…

MySQL面试——聚簇/非聚簇索引

存储引擎是针对表结构&#xff0c;不是数据库 引擎层&#xff1a;对数据层以何种方式进行组织 update&#xff1a;加索引&#xff1a;行级锁&#xff1b;不加索引&#xff1a;表级锁

LabVIEW专栏七、队列

目录 一、队列范例二、命令簇三、队列应用1.1、并行循环队列1.2、命名队列和匿名队列1.2.1、命名队列1.2.2、匿名队列 1.3、长度为1的队列 队列是一种特殊的线性表&#xff0c;就是队列里的元素都是按照顺序进出。 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为…

HNCTF 2022 week1 题解

自由才是生活主旋律。 [HNCTF 2022 Week1] Interesting_include <?php //WEB手要懂得搜索 //flag in ./flag.phpif(isset($_GET[filter])){$file $_GET[filter];if(!preg_match("/flag/i", $file)){die("error");}include($file); }else{highlight_…

OSPF的协议特性

路由汇总的概念 l 路由汇总&#xff08; Route Aggregation &#xff09;&#xff0c;又称路由聚合&#xff08;Route Summarization&#xff09;&#xff0c;指的是把一组明细路由汇聚成一条汇总路由条目的操作 l 路由汇总能够减少路由条目数量、减小路由表规模&#xff0…

目标检测——3D玩具数据集

在数字化时代&#xff0c;计算机视觉技术取得了长足的进展&#xff0c;其中基于形状的3D物体识别技术更是引起了广泛关注。该技术不仅有助于提升计算机对现实世界物体的感知能力&#xff0c;还在多个领域展现出了广阔的应用前景。本文将探讨基于形状的3D物体识别实验的重要性意…

STM32的Flash读写保护

参考链接 STM32的Flash读写保护&#xff0c;SWD引脚锁的各种解决办法汇总&#xff08;2020-03-10&#xff09;-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1597959 STM32系列芯片Flash解除写保护的办法 - 知乎 (zhihu.com)https://zh…

Java设计模式:使用责任链模式和状态模式优化‘审批流程‘

Java设计模式&#xff1a;使用责任链模式和状态模式优化审批流程 摘要引言 需求流程图正文内容&#x1f4d0; 基本概念介绍 功能实现示例1:设计模式&#xff1a;责任链模式方法&#xff1a;好处&#xff1a; 示例2:设计模式&#xff1a;责任链模式方法和操作流程&#xff1a;好…