前言

关于optuna的一些基础使用方法,在官方文档中已经介绍的非常详细:教程 — Optuna 2.7.0 文档,所以这里不再概述

本文档记录的原因很简单,只是笔者在工作时的使用过程中遇到了各种各样的问题,所以于此记录,主要用于自己复阅,如果能帮到他人那就更好了。

optuna是一个非常有用的优化器,在之后的学习过程中我应该也会经常去使用它。

并行运行

在此处有官方文档:简单的并行化 — Optuna 2.7.0 文档

代码不细讲,写一个脚本同时运行多个优化器就行,即创建多个study共用一个数据库。顺带一提,optuna的数据库支持选择很多,sqlite,mysql,postsql都可以使用。

创建多个study后,数据库就会创建一个study表,作为副键放在trial表中,用以分别不同的study的数据。当然了,如果你还要再分,可以写一个接口代码,在数据库中分模式以储存更多不同类型的优化数据。不过正常使用,我想直接一起塞到一个数据库中就可以了。

关于并行上限,不同的电脑性能和数据库类型差别都比较大,总的来说在20-30,这取决于你的数据库连接池情况。如果你不确定是否是连接池满了导致的并行数量上限,可以在数据库里用显示查看实时连接池情况。

关于optuna-Dashboard

optuna-dashboard用于optuna优化数据的可视化。
下面是一些心得:

  1. dashboaard可以根据数据库内的不同模式打开页面,也就是做到分类的效果
  2. dashboard的刷新速度在10s左右,也就是不需要手动刷新页面哦,并行运行也是这样的。
  3. 似乎在数据库的使用中,没有出现过死锁情况——优化器和dashboard都自带读写锁,不会冲突。
  4. dashboard不允许多开,会出现端口冲突,改端口也许是个办法,不过我没有测试过。

运行代码:

STORAGE = "postgresql://usrname:psaaword@localhost/da_name"

def run_dashboard(post):

        subprocess.run([

            "optuna-dashboard",

            STORAGE,

            "--port", str(port),

            "--host", "127.0.0.1",

        ])

外接第三方优化器

保留随机取值

参考文档Ask-and-Tell 接口 — Optuna 2.7.0 文档
使用ask和tell接口,不再赘述。

完全外接第三方(只使用dashboard)

实现路径:只新建study和加入trial

  1. 新建study。如果没有就新建,有就载入。
study_name = xxx
storage_url = "postgresql://usrname:psaaword@localhost/da_name"

        try:

            study = optuna.load_study(study_name=study_name, storage=storage_url)

        except:

            study = optuna.create_study(study_name=study_name, storage=storage_url, direction="maximize")
  1. 定义变量类型。optuna规定载入的数据必须定义数据类型。我这里没有合适的代码,请按照自己的需求来。
def create_distributions(params_dict);
  1. 创建trial,载入变量,变量类型和优化值
trial = optuna.trial.create_trial(

        params = params,  

        distributions = create_distributions(params),

        value = value)
  1. 将trial加入study
study.add_trial(trial)