Code Monkey home page Code Monkey logo

goptuna's Introduction

Goptuna

Software License GoDoc Go Report Card

Decentralized hyperparameter optimization framework, inspired by Optuna [1]. This library is particularly designed for machine learning, but everything will be able to optimize if you can define the objective function (e.g. Optimizing the number of goroutines of your server and the memory buffer size of the caching systems).

Supported algorithms:

Goptuna supports various state-of-the-art Bayesian optimization, evolution strategies and Multi-armed bandit algorithms. All algorithms are implemented in pure Go and continuously benchmarked on GitHub Actions.

  • Random search
  • TPE: Tree-structured Parzen Estimators [2]
  • CMA-ES: Covariance Matrix Adaptation Evolution Strategy [3]
  • IPOP-CMA-ES: CMA-ES with increasing population size [4]
  • BIPOP-CMA-ES: BI-population CMA-ES [5]
  • Median Stopping Rule [6]
  • ASHA: Asynchronous Successive Halving Algorithm (Optuna flavored version) [1,7,8]
  • Quasi-monte carlo sampling based on Sobol sequence [10, 11]

Projects using Goptuna:

Installation

You can integrate Goptuna in wide variety of Go projects because of its portability of pure Go.

$ go get -u github.com/c-bata/goptuna

Usage

Goptuna supports Define-by-Run style API like Optuna. You can dynamically construct the search spaces.

Basic usage

package main

import (
    "log"
    "math"

    "github.com/c-bata/goptuna"
    "github.com/c-bata/goptuna/tpe"
)

// ① Define an objective function which returns a value you want to minimize.
func objective(trial goptuna.Trial) (float64, error) {
    // ② Define the search space via Suggest APIs.
    x1, _ := trial.SuggestFloat("x1", -10, 10)
    x2, _ := trial.SuggestFloat("x2", -10, 10)
    return math.Pow(x1-2, 2) + math.Pow(x2+5, 2), nil
}

func main() {
    // ③ Create a study which manages each experiment.
    study, err := goptuna.CreateStudy(
        "goptuna-example",
        goptuna.StudyOptionSampler(tpe.NewSampler()))
    if err != nil { ... }

    // ④ Evaluate your objective function.
    err = study.Optimize(objective, 100)
    if err != nil { ... }

    // ⑤ Print the best evaluation parameters.
    v, _ := study.GetBestValue()
    p, _ := study.GetBestParams()
    log.Printf("Best value=%f (x1=%f, x2=%f)",
        v, p["x1"].(float64), p["x2"].(float64))
}

Link: Go Playground

Furthermore, I recommend you to use RDB storage backend for following purposes.

  • Continue from where we stopped in the previous optimizations.
  • Scale studies to tens of workers that connecting to the same RDB storage.
  • Check optimization results via a built-in dashboard.

Built-in Web Dashboard

You can check optimization results by built-in web dashboard.

  • SQLite3: $ goptuna dashboard --storage sqlite:///example.db (See here for details).
  • MySQL: $ goptuna dashboard --storage mysql://goptuna:[email protected]:3306/yourdb (See here for details)
Manage optimization results Interactive live-updating graphs
state-of-the-art-algorithms visualization

Advanced Usage

Parallel optimization with multiple goroutine workers

Optimize method of goptuna.Study object is designed as the goroutine safe. So you can easily optimize your objective function using multiple goroutine workers.

package main

import ...

func main() {
    study, _ := goptuna.CreateStudy(...)

    eg, ctx := errgroup.WithContext(context.Background())
    study.WithContext(ctx)
    for i := 0; i < 5; i++ {
        eg.Go(func() error {
            return study.Optimize(objective, 100)
        })
    }
    if err := eg.Wait(); err != nil { ... }
    ...
}

full source code

Distributed optimization using MySQL

There is no complicated setup to use RDB storage backend. First, setup MySQL server like following to share the optimization result.

$ docker pull mysql:8.0
$ docker run \
  -d \
  --rm \
  -p 3306:3306 \
  -e MYSQL_USER=goptuna \
  -e MYSQL_DATABASE=goptuna \
  -e MYSQL_PASSWORD=password \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
  --name goptuna-mysql \
  mysql:8.0

Then, create a study object using Goptuna CLI.

$ goptuna create-study --storage mysql://goptuna:password@localhost:3306/yourdb --study yourstudy
yourstudy
$ mysql --host 127.0.0.1 --port 3306 --user goptuna -ppassword -e "SELECT * FROM studies;"
+----------+------------+-----------+
| study_id | study_name | direction |
+----------+------------+-----------+
|        1 | yourstudy  | MINIMIZE  |
+----------+------------+-----------+
1 row in set (0.00 sec)

Finally, run the Goptuna workers which contains following code. You can execute distributed optimization by just executing this script from multiple server instances.

package main

import ...

func main() {
    db, _ := gorm.Open(mysql.Open("goptuna:password@tcp(localhost:3306)/yourdb?parseTime=true"), &gorm.Config{
        Logger: logger.Default.LogMode(logger.Silent),
    })
    storage := rdb.NewStorage(db)
    defer db.Close()

    study, _ := goptuna.LoadStudy(
        "yourstudy",
        goptuna.StudyOptionStorage(storage),
        ...,
    )
    _ = study.Optimize(objective, 50)
    ...
}

Full source code is available here.

Receive notifications of each trials

You can receive notifications of each trials via channel. It can be used for logging and any notification systems.

package main

import ...

func main() {
    trialchan := make(chan goptuna.FrozenTrial, 8)
    study, _ := goptuna.CreateStudy(
        ...
        goptuna.StudyOptionIgnoreObjectiveErr(true),
        goptuna.StudyOptionSetTrialNotifyChannel(trialchan),
    )

    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        defer wg.Done()
        err = study.Optimize(objective, 100)
        close(trialchan)
    }()
    go func() {
        defer wg.Done()
        for t := range trialchan {
            log.Println("trial", t)
        }
    }()
    wg.Wait()
    if err != nil { ... }
    ...
}

full source code

Links

References:

Presentations:

Blog posts:

Status:

License

This software is licensed under the MIT license, see LICENSE for more information.

goptuna's People

Contributors

c-bata avatar dependabot[bot] avatar renovate-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

goptuna's Issues

TODO

Goptuna currently supports the minimum required features only.

  • Sampler
    • RandomSearchSampler
    • TPESampler
  • Storage
    • In-memory storage backend
  • Distribution
    • UniformDistribution
    • LogUniformDistribution
    • DiscreteUniformDistribution
    • IntUniformDistribution
    • CategoricalDistribution
  • Examples
    • Add basic example
    • Add example of parallel optimization

goptuna is not compiling using gollvm. asm level bugs caught

Hi.
I have built and is able to use gollvm.

When I tried to build your package - I caught such bugs:

$ go get -u github.com/c-bata/goptuna/tpe

gonum.org/v1/gonum/internal/asm/f64

go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s: Assembler messages:
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:10: Error: no such instruction: text ·L1Norm(SB),NOSPLIT,$0' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:11: Error: junk (FP)' after expression
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:11: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:12: Error: junk (FP)' after expression go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:12: Error: invalid character '=' in operand 2 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:13: Error: invalid character '=' in operand 2 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:14: Error: invalid character '=' in operand 2 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:15: Error: too many memory references for pxor'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:16: Error: too many memory references for pxor' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:17: Error: too many memory references for pxor'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:18: Error: too many memory references for pxor' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:19: Error: too many memory references for pxor'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:20: Error: too many memory references for pxor' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:21: Error: too many memory references for pxor'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:22: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:24: Error: too many memory references for movq' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:25: Error: invalid character '=' in operand 2 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:26: Error: invalid character '=' in operand 2 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:27: Error: invalid character '=' in operand 1 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:31: Error: junk (AX8)' after expression
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:31: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:32: Error: junk (SI)(AX*8)' after expression go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:32: Error: too many memory references for movups'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:33: Error: junk (SI)(AX*8)' after expression go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:33: Error: too many memory references for movups'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:34: Error: junk (SI)(AX*8)' after expression go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:34: Error: too many memory references for movups'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:35: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:36: Error: too many memory references for addpd' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:37: Error: too many memory references for addpd'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:38: Error: too many memory references for addpd' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:39: Error: invalid character '=' in operand 2 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:40: Error: too many memory references for subpd'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:41: Error: too many memory references for subpd' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:42: Error: too many memory references for subpd'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:43: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:44: Error: too many memory references for maxpd' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:45: Error: too many memory references for maxpd'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:46: Error: too many memory references for maxpd' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:47: Error: invalid character '=' in operand 2 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:48: Error: too many memory references for movaps'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:49: Error: too many memory references for movaps' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:50: Error: too many memory references for movaps'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:51: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:52: Error: bad expression
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:52: Error: junk } while --CX>0' after expression go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:55: Error: too many memory references for addpd'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:56: Error: too many memory references for addpd' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:57: Error: too many memory references for addpd'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:60: Error: too many memory references for movaps' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:61: Error: invalid character '=' in operand 3 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:62: Error: too many memory references for addsd'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:63: Error: operand size mismatch for cmp' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:64: Error: invalid character '=' in operand 1 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:67: Error: invalid character '=' in operand 2 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:68: Error: invalid character '=' in operand 2 go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:72: Error: junk (AX
8)' after expression
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:72: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:73: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:74: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:75: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:76: Error: invalid character '=' in operand 2
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:77: Error: bad expression
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:77: Error: junk i++' after expression go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:78: Error: bad expression go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:78: Error: junk } while --CX>0' after expression
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:81: Warning: X0' is not valid here (expected (%rsi)')
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:81: Error: junk (FP)' after expression go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:81: Warning: sum+24(FP)' is not valid here (expected (%rdi)') go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:52: Error: invalid operands (.text and *ABS* sections) for /'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:52: Error: division by zero
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:77: Error: invalid operands (UND and ABS sections) for /' go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:77: Error: division by zero go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:78: Error: invalid operands (.text and *ABS* sections) for /'
go/src/gonum.org/v1/gonum/internal/asm/f64/abssum_amd64.s:78: Error: division by zero

It seems that your asm mix-ins are not suitable to LLVM oriented back-end. Or I am wrong?
In any case: I suspect that it should be re-designed, to work with gollvm.

Ivan

differences vs optuna

May I ask what is the main difference between optuna and goptuna except goptuna is written in GO?

Concurrent map r/w in TPE

While TPE making suggestion, it will scan the trial history to making decision. It may cause data race fatal error while performing optimization concurrently with in-memory storage.

fatal error: concurrent map read and map write

goroutine 73 [running]:
runtime.throw({0x52eb11d?, 0x4000?})
	/usr/local/Cellar/go/1.18.1/libexec/src/runtime/panic.go:992 +0x71 fp=0xc000ebd250 sp=0xc000ebd220 pc=0x4035ff1
runtime.mapaccess2_faststr(0x50d5000?, 0xc000f4f890?, {0xc000532738, 0x12})
	/usr/local/Cellar/go/1.18.1/libexec/src/runtime/map_faststr.go:117 +0x3d4 fp=0xc000ebd2b8 sp=0xc000ebd250 pc=0x4014eb4
github.com/c-bata/goptuna/tpe.getObservationPairs(0xc00012e950?, {0xc000532738, 0x12})
	/Users/coldturnip/go/pkg/mod/github.com/c-bata/[email protected]/tpe/sampler.go:545 +0x1ff fp=0xc000ebd4a0 sp=0xc000ebd2b8 pc=0x4c7985f
github.com/c-bata/goptuna/tpe.(*Sampler).Sample(0xc00012e910, 0xc000ea9740?, {0x397, 0x0, 0x397, 0x0, 0x0, 0xc0010c2030, {0xc0b1212152a98eb0, 0x87030fa01b, ...}, ...}, ...)
	/Users/coldturnip/go/pkg/mod/github.com/c-bata/[email protected]/tpe/sampler.go:502 +0x12b fp=0xc000ebd5c0 sp=0xc000ebd4a0 pc=0x4c78f6b
github.com/c-bata/goptuna.(*Trial).suggest(0xc0010c2390, {0xc000532738, 0x12}, {0x5147760, 0xc000c81e20})
	/Users/coldturnip/go/pkg/mod/github.com/c-bata/[email protected]/trial.go:183 +0x256 fp=0xc000ebd7b0 sp=0xc000ebd5c0 pc=0x4c68a76
github.com/c-bata/goptuna.(*Trial).SuggestFloat(0x4c5bec8?, {0xc000532738, 0x12}, 0x4?, 0xc0019b6000?)
	/Users/coldturnip/go/pkg/mod/github.com/c-bata/[email protected]/trial.go:251 +0xb1 fp=0xc000ebd800 sp=0xc000ebd7b0 pc=0x4c69171

...

goroutine 82 [runnable]:
github.com/c-bata/goptuna.(*InMemoryStorage).SetTrialParam(0xc000192840, 0x394, {0xc000921f60, 0xd}, 0x400b3be10be8316b, {0x5147760?, 0xc001140120})
	/Users/coldturnip/go/pkg/mod/github.com/c-bata/[email protected]/storage.go:396 +0x26a
github.com/c-bata/goptuna.(*Trial).suggest(0xc0012c2090, {0xc000921f60, 0xd}, {0x5147760, 0xc001140120})
	/Users/coldturnip/go/pkg/mod/github.com/c-bata/[email protected]/trial.go:188 +0x2bb
github.com/c-bata/goptuna.(*Trial).SuggestFloat(0x4c5bec8?, {0xc000921f60, 0xd}, 0x4?, 0xc000154c00?)
	/Users/coldturnip/go/pkg/mod/github.com/c-bata/[email protected]/trial.go:251 +0xb1

Setup Github Actions

My repository enables to use Github Actions 🎉 Thank you Github!

  • make lint
  • make test
  • make build

Bandit-based early stopping algorithm

Algorithms

It seems to be enough if following bandit-based early-stopping algorithms are supported.

  • Median Stopping Rule
    • D. Golovin, B. Sonik, S. Moitra, G. Kochanski, J. Karro, and D.Sculley. Google Vizier: A service for black-box optimization. In Knowledge Discovery and Data Mining (KDD), 2017.
    • And PercentilePruner that I added to Optuna: optuna/optuna#397
  • Asynchronous Successive Halving Algorithm (ASHA)
    • Liam Li, Kevin Jamieson, Afshin Rostamizadeh, Ekaterina Gonina, Moritz Hardt, Ben- jamin Recht, and Ameet Talwalkar. Massively parallel hyperparameter tuning. arXiv preprint arXiv:1810.05934, 2018.
    • To implement this feature, I need to implement trial-queue.
  • Optuna-flavored ASHA.
    • SuccessiveHalvingPruner in Optuna
  • Hyperband (Asynchronous)
    • Liam Li, Kevin Jamieson, Giulia DeSalvo, Afshin Rostamizadeh, and Ameet Talwalkar. Hyperband: A novel bandit-based approach to hyperparameter optimization. Journal of Ma-chine Learning Research, Vol. 18-185, pp. 1–52, 2018.
    • Optuna PR: optuna/optuna#785

Design

import ...

func objective(trial goptuna.Trial) (float64, error) {
    # prepare training data and test data
    ...

    # initialize your model
    alpha, _ := trial.SuggestLogUniform("alpha", 1e-5, 1e-1)
    clf := ...

    for i := 0; i < 100; i++ {
        clf.PartialFit(...)
        validationLoss := clf.Score(...)
        trial.Report(validationLoss, i)
        
        if trial.ShouldPrune() {
            return 0.0, goptuna.ErrPruned
        }
    }
    return clf.Score(...), nil
}

func main() {
    ...
    study := goptuna.CreateStudy(
        "pruning-example",
        goptuna.StudyOptionSetPruner(...),
    )
}

See optuna's simple pruning example

Avoid to update `trial.Value` when intermediate values are reported.

See optuna/optuna#851 for the reason.

goptuna/rdb/storage.go

Lines 317 to 334 in 73412eb

// Update the value of trial
// This is essentially the same with Optuna (at v0.14.0).
// See https://github.com/optuna/optuna/blob/v0.14.0/optuna/trial.py#L371-L373
err = tx.Model(&trialModel{}).
Where("trial_id = ?", trialID).
Update("value", value).Error
if err != nil {
tx.Rollback()
return err
}
// If trial value is already exist, then do rollback.
result := tx.First(&trialValueModel{}, "trial_id = ? AND step = ?", trialID, step)
if !(result.Error != nil && result.RecordNotFound()) {
tx.Rollback()
return err
}

Failed to open Optuna's dashboard when set something attrs.

The cause of this error is optuna expects the value of DB is JSON format.
So this line raise following error:

$ optuna dashboard --storage sqlite:///db.sqlite3 --study goptuna-libffm
[W 2019-08-15 17:50:48,694] Optuna dashboard is still highly experimental. Please use with caution!
[I 2019-08-15 17:50:48,705] Starting Bokeh server version 1.0.4 (running on Tornado 6.0.2)
[I 2019-08-15 17:50:48,709] Bokeh app running at: http://localhost:5006/dashboard
[I 2019-08-15 17:50:48,709] Starting Bokeh server with process id: 52565
[E 2019-08-15 17:50:49,205] Error running application handler <bokeh.application.handlers.script.ScriptHandler object at 0x12bb7b9b0>: Expecting value: line 1 column 1 (char 0)
File "decoder.py", line 355, in raw_decode:
raise JSONDecodeError("Expecting value", s, err.value) from None Traceback (most recent call last):
  File "/Users/a14737/src/github.com/pfnet/optuna/venv/lib/python3.7/site-packages/bokeh/application/handlers/code_runner.py", line 179, in run
    exec(self._code, module.__dict__)
  File "/Users/a14737/src/github.com/pfnet/optuna/optuna/dashboard.py", line 305, in <module>
    _run()
  File "/Users/a14737/src/github.com/pfnet/optuna/optuna/dashboard.py", line 300, in _run
    app(doc)
  File "/Users/a14737/src/github.com/pfnet/optuna/optuna/dashboard.py", line 171, in __call__
    self.study.trials  # type: Optional[List[optuna.structs.FrozenTrial]]
  File "/Users/a14737/src/github.com/pfnet/optuna/optuna/study.py", line 220, in trials
    return self.storage.get_all_trials(self.study_id)
  File "/Users/a14737/src/github.com/pfnet/optuna/optuna/storages/rdb/storage.py", line 499, in get_all_trials
    trials = self._get_all_trials_without_cache(study_id)
  File "/Users/a14737/src/github.com/pfnet/optuna/optuna/storages/rdb/storage.py", line 528, in _get_all_trials_without_cache
    return self._merge_trials_orm(trials, params, values, user_attributes, system_attributes)
  File "/Users/a14737/src/github.com/pfnet/optuna/optuna/storages/rdb/storage.py", line 586, in _merge_trials_orm
    user_attrs[user_attr.key] = json.loads(user_attr.value_json)
  File "/Users/a14737/.pyenv/versions/3.7.1/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/Users/a14737/.pyenv/versions/3.7.1/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Users/a14737/.pyenv/versions/3.7.1/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

How to print current best values during the optimisation?

My optimisation run gets stuck in the middle and I want to figure out why. I want to print at which optimisation point it gets stuck i.e. to print the current set of best values. But there doesn't seem to be any way of doing it.

Design proposal for multi-objective optimization

Refs: optuna/optuna#1054

package main

import "github.com/c-bata/goptuna"

func objective(trial goptuna.Trial) (float64, error) {
	layers, _ := trial.SuggestFloat(...)
	lr, _ := trial.SuggestFloat(...)
        model, _ := createModel(....)

        accuracy := train(model, ...)
        flops := ...

        // Report submetrics for multi-objective optimization
	err := trial.ReportSubMetrics(map[string]float64{
		"accuracy": accuracy,
		"flops": flops,
	})
	return accuracy, err
}

func main() {
        study, _ := goptuna.CreaetStudy(...)

        // Set submetric direction
        study.SetSubMetricsDirections(map[string]goptuna.StudyDirection{
            "flops": goptuna.StudyDirectionMinimize,
            "accuracy": goptuna.StudyDirectionMaximize,
        }

        study.Optimize(objective, 100)
 
        // Retrieve Pareto-optimal solutions
	paretoOptimals, _ := study.GetParetoOptimalTrials()
	for _, pf := range paretoFronts {
		log.Printf("Pareto front: %v", pf.SubMetrics)
	}
}

Bayesian Optimization over Rest API

Hello I was wondering if someone could publish an example showing how to use the library to accept inputs over something like a gin REST API call.

My set up is I have another service that does some processing in real time and I want to try using Bayesian optimization to increase performance of it on the fly. I have 3 values that effect the processing application which I want the BO to give better values for. My "reward" or the evaluation happens on the processing application side.

How can I set up goptuna to accept inputs from gin context and then respond with the next set of parameters to try.

Thank you very much!

Support OrdinalChoicesDistribution for Kubeflow/Katib.

See the following code comment of Katib.

// Use categorical distribution instead of goptuna.DiscreteUniformDistribution
// because goptuna.DiscreteUniformDistributions needs to declare the parameter
// space with minimum value, maximum value and interval.
choices := p.GetFeasibleSpace().GetList()
searchSpace[p.Name] = goptuna.CategoricalDistribution{
	Choices: choices,
}

https://github.com/kubeflow/katib/blob/2c4ad152cd5d534c86923a23e7350185d32b5538/pkg/suggestion/v1beta1/goptuna/converter.go#L146-L154

Drop RDB schema compatibility with Optuna.

Optuna is now planning to alter its RDB schema for multi-objective optimizations (at optuna/optuna#1961). Due to my interests and to keep the current clean design, I'm not planning to support those algorithms in Goptuna.

And now Goptuna supports original Web dashboard and visualization features (#157). So the advantages of schema compatibility has been gradually decreased. Though Goptuna still cannot support some Optuna features like hyperparameter importance, I think it's enough just providing thin Python wrapper SDK to read Goptuna RDB storage (if needed).

This issue tracks the progress of dropping RDB schema compatibility.

Roadmap:

Passing other variables to objective function?

Forgive me if there is an obvious answer, but is it possible to define an objective function that depends on other variables? It doesn't seem possible to pass variables to the objective function itself, and as a separate function it cannot access previously declared variables.

Here is a very minimal example: say my objective function is (x1-2)^2 + (x2+5)^2 + a, where "a" is read from a file or input by a user. How can I optimize this objective with goptuna?

[Bug report] Too many SQL variables

storage.GetAllTrials use joins for reducing query count. But it tends to be raising 'Too many SQL variables error' like following if there are a lot of trials.

/home/shibata_masashi/go/pkg/mod/github.com/c-bata/[email protected]/rdb/storage.go:482)                                                                                 
[2019-08-15 02:58:54]  too many SQL variables                                                                                                                          
                                                                                                                                                                       
(/home/shibata_masashi/go/pkg/mod/github.com/c-bata/[email protected]/rdb/storage.go:482)                                                                                 
[2019-08-15 02:58:54]  [1.40ms]  SELECT * FROM "trial_params"  WHERE ("trial_id" IN (631,1189,1090,1652,2243,35,2275,393,596,670,692,2072,2241,2260,2294,183,300,456,91
0,2015,877,1387,1735,238,732,1150,1167,2313,339,686,865,1742,2057,10,976,2316,1355,1558,23,348,838,845,1197,1780,1895,1965,2234,452,1051,88,791,1134,1983,2095,685,1154
,1405,1654,2277,173,301,1469,1541,2238,1738,2208,180,776,1041,1227,1528,1874,279,368,476,1018,1093,81,373,775,890,1883,2077,11,1600,1621,92,138,618,1278,2041,1261,1286
,1358,101,376,622,678,1193,1545,1674,1783,1253,1909,13,283,521,701,901,48,169,656,1317,2206,2271,109,168,691,995,1272,571,1739,2112,189,1809,1952,2183,2262,161,1477,20
51,390,1818,2056,2359,446,704,1918,146,1311,1831,2182,1755,2193,480,964,1186,1266,1727,2186,176,718,1676,2103,2107,113,899,748,518,560,1583,2158,475,1587,1937,128,1384
,1709,1779,2281,156,371,554,1264,1708,1517,2042,2195,266,270,308,834,1390,148,930,1330,1740,1183,1580,194,559,600,655,1160,1111,1414,1764,245,298,782,955,1055,1912,231
1,1429,1492,2168,117,424,614,908,970,624,1116,1624,1833,2020,1247,1969,155,496,1743,2010,2289,1970,16,1588,2323,453,1711,2269,713,819,1102,1423,1456,408,578,672,1845,2
166,415,1135,1331,1486,1830,324,580,2268,56,1650,1...(so long trial_id)

https://github.com/c-bata/goptuna/blob/v0.0.4/rdb/storage.go#L482

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.