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

news2024/11/18 11:45:52

        最近研究中学习使用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)
    )

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现本地视频/音频播放器

Python实现本地视频/音频播放器 在Python中,有几个库可以用于视频播放,但是没有一个库是完美的,因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器,再介绍用Python实现本地音乐播放器。 Python实现…

【C 数据结构】图

文章目录 【 1. 基本原理 】1.1 无向图1.2 有向图1.3 基本知识 【 2. 图的存储结构 】2.1 完全图2.2 稀疏图和稠密图2.3 连通图2.3.1 (普通)连通图连通图 - 无向图非连通图 的 连通分量 2.3.2 强连通图强连通图 - 有向图非强连通有向图 的 强连通分量 2.3.3 生成树 - 连通图2.3…

重仓比特币

作者:Arthur Hayes Co-Founder of 100x. 编译:liam ccvalue (下文中表达的任何观点均为作者的个人观点,不应作为投资决策的依据,也不应被视为参与投资交易的建议或意见)。 我们中断牛市常规节目,为您播报这…

【研发管理】产品经理知识体系-产品创新中的市场调研

导读:在产品创新过程中,市场调研的重要性不言而喻。它不仅是产品创新的起点,也是确保产品成功推向市场的关键步骤。对于产品经理系统学习和掌握产品创新中的市场调研相关知识体系十分重要。 目录 概述:市场调研重要性 1、相关概…

华为数字化转型与数据管理实践介绍(附PPT下载)

华为作为全球领先的信息与通信技术(ICT)解决方案提供商,在数字化转型和数据管理领域拥有丰富的实践经验和技术积累。其数字化转型解决方案旨在帮助企业通过采用最新的ICT技术,实现业务流程、组织结构和文化的全面数字化&#xff0…

Kafka 3.x.x 入门到精通(03)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通(03)——对标尚硅谷Kafka教程 2. Kafka基础2.1 集群部署2.2 集群启动2.3 创建主题2.4 生产消息2.4.1 生产消息的基本步骤2.4.2 生产消息的基本代码2.4.3 发送消息2.4.3.1 拦截器2.4.3.1.1 增加拦截器类2.4.3.1.2 配置拦截器 2.4.3…

Spring Bean 的生命周期与作用域解析及实战

引言 在Spring框架中,Bean是构成应用的核心组件,它们负责执行应用中的业务逻辑。理解Spring Bean的生命周期和作用域对于开发高效、稳定的Spring应用至关重要。本文将详细解析Spring Bean的生命周期和作用域,并通过实战案例加深理解。 一、…

使用FunASR处理语音识别

FunASR是阿里的一个语音识别工具,比SpeechRecognition功能多安装也很简单; 官方介绍:FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD&#xff…

微软ML Copilot框架释放机器学习能力

摘要:大模型席卷而来,通过大量算法模型训练推理,能根据人类输入指令产生图文,其背后是大量深度神经网络模型在做运算,这一过程称之为机器学习,本文从微软语言大模型出发,详解利用大型语言模型&a…

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

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

【stm32】swjtu西南交大嵌入式实验三 外部中断实验:按键中断

实验内容: 1、编写程序,设置主程序:跑马灯以 0.2s 的速度旋转;将 KB1 设置为外部中断,下 降沿触发,按下 KB1 则全彩灯的 R 灯闪烁 5 次。编译、下载程序到开发板,观察实 验现象;按下…

torch.cuda.is_avaliable()在命令行里是true,pycharm是false【省流:换Pycharm】

我的问题: 1、torch.cuda.is_avaliable()在命令行里是true,但是pycharm是false 2、pycharm选择pytorch所在的解释器,加载失败。 3、pytorch所在的解释器加载成功,但是里边的torch包莫名消失。 解决方法: 在调试了很…

Sping源码(七)—context: component-scan标签如何扫描、加载Bean

序言 简单回顾一下。上一篇文章介绍了从xml文件context component-scan标签的加载流程到ConfigurationClassPostProcessor的创建流程。 本篇会深入了解context component-scan标签底层做了些什么。 component-scan 早期使用Spring进行开发时,很多时候都是注解 标…

免费好用各科目的刷题软件

一 、前言 刷题,即通过大量做题来提高解题能力和考试成绩的行为,主要有以下几个好处: 1. 熟悉题型和考试格式 通过刷题,可以对考试中可能出现的题型和格式有更深入的了解,有助于在实际考试中快速识别题目类型和解题…

Java使用IText根据pdf模板创建pdf文件

1.导包 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-as…

mdk输出本语句在源程序中行数以及函数名称

代码如下&#xff1a; /* USER CODE BEGIN WHILE */while (1){printf("anlog uart1 test 2024-4-16\r\n");printf("[%s] %d\r\n",__func__,__LINE__);printf("[%s] %d",__func__,__LINE__);HAL_Delay(200);/* USER CODE END WHILE *//* USER COD…

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

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

AWS SES发送邮件如何正确配置?操作指南?

AWS SES发送邮件有哪些限制&#xff1f;AWS SES发信的注意事项&#xff1f; AWS SES作为亚马逊云服务提供的一项高效、可靠的电子邮件发送服务&#xff0c;受到了众多企业的青睐。然而&#xff0c;如何正确配置AWS SES发送邮件。AokSend将详细解析AWS SES发送邮件的配置过程&a…

GO语言写Prometheus自定义node-exporter的Docker容器测试

1. 安装docker-compose 执行以下命令&#xff0c;安装docker-compose到CentOS7.9环境中&#xff1a; # 下载二进制文件 sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.7/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/d…

耐酸碱腐蚀PFA冷凝回流装置进口透明聚四氟材质PFA梨形漏斗特氟龙圆底烧瓶

PFA分液漏斗&#xff1a;也叫特氟龙分液漏斗、特氟龙梨型分液漏斗。 规格参考&#xff1a;125ml、250ml、500ml、1000ml 其主要特性有&#xff1a; 1.内壁对溶剂无粘贴性和吸附&#xff0c;可完全排空&#xff0c;分界面清晰可见&#xff1b; 2.密封性好&#xff0c;可防止…