Python

>

optunaとmysqlデータベースとの連携

公開日 : 2024/02/10

最終更新日時 : 2024/02/14 19:35:34

環境
CentOS Stream release 9
Apache/2.4.57 (CentOS Stream)
Xserver VPS

mysql サーバーにログイン

mysql -uroot -p
Enter password:

optuna 用のデータベースを作成 (データベース名は任意の名前で構わないがここでは study_name と合致させる)

create database optuna;
quit;

Python 必要なライブラリをインストール

source my_env/bin/activate # 環境に応じて
pip install mysqlclient
pip install mysql-connector-python

Python ファイル

import os
import mysql.connector as mysql
import pymysql

    # Optuna で枝刈りしながら最適化
    def OptunaFunc(study_name, trloader, teloader):
    
        # sqlite を使用する場合
        """
        dirpath = './sqldb'
        if not os.path.exists(dirpath): # ディレクトリが存在しない場合は作成する
            os.makedirs(dirpath)
        storage='sqlite:///sqldb/%s.db' % (study_name)
        """
        
        # mysql データベースを使用する場合
        storage = 'mysql+pymysql://root:パスワード@localhost/%s' % (study_name)
        
        pruner = optuna.pruners.HyperbandPruner(min_resource=1, max_resource=max_epoch, reduction_factor=3)
        study = optuna.create_study(
            study_name = study_name,
            pruner = pruner,
            storage = storage,
            load_if_exists = True
        )
        study.optimize(objective_variable_degree(trloader, teloader), timeout=limit)
        
        return study.best_params, study.best_value

これだけで optuna を動かせば予め作成しておいたデータベース内にテーブル、テーブル内にカラムが自動作成される。

データベースを確認

mysql -uroot -p
Enter password:

データベース選択

use optuna;

テーブル参照

show tables;
+---------------------------+
| Tables_in_optuna         |
+---------------------------+
| alembic_version           |
| studies                   |
| study_directions          |
| study_system_attributes   |
| study_user_attributes     |
| trial_heartbeats          |
| trial_intermediate_values |
| trial_params              |
| trial_system_attributes   |
| trial_user_attributes     |
| trial_values              |
| trials                    |
| version_info              |
+---------------------------+
13 rows in set (0.001 sec)

trial_values テーブル内のカラム参照

show columns from trial_values;
+----------------+------------------------------------+------+-----+---------+----------------+
| Field          | Type                               | Null | Key | Default | Extra          |
+----------------+------------------------------------+------+-----+---------+----------------+
| trial_value_id | int(11)                            | NO   | PRI | NULL    | auto_increment |
| trial_id       | int(11)                            | NO   | MUL | NULL    |                |
| objective      | int(11)                            | NO   |     | NULL    |                |
| value          | double                             | YES  |     | NULL    |                |
| value_type     | enum('FINITE','INF_POS','INF_NEG') | NO   |     | NULL    |                |
+----------------+------------------------------------+------+-----+---------+----------------+
5 rows in set (0.002 sec)

最新レコード抽出、参照

select * from trial_values order by trial_value_id desc limit 1\G
trial_value_id: 18
      trial_id: 18
     objective: 0
         value: 1.00652
    value_type: FINITE
1 row in set (0.002 sec)

これで Optuna 分散並列処理の環境が整う。