• Stars
    star
    249
  • Rank 157,024 (Top 4 %)
  • Language
    Go
  • License
    MIT License
  • Created almost 5 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A hyperparameter optimization framework, inspired by Optuna.

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.

More Repositories

1

go-prompt

Building powerful interactive prompts in Go, inspired by python-prompt-toolkit.
Go
5,145
star
2

kube-prompt

An interactive kubernetes client featuring auto-complete.
Go
1,759
star
3

rtmp

Server implementation of Adobe's RTMP 1.0 protocol in Go.
Go
138
star
4

practical-django

書籍「実践Django Pythonによる本格Webアプリケーション開発 (翔泳社)」サンプルコード
Python
110
star
5

gh-prompt

An interactive GitHub CLI featuring auto-complete.
Go
53
star
6

pysearch

Web crawler and Search engine in Python.
Python
51
star
7

outlier-utils

Utility library for detecting and removing outliers from normally distributed datasets using the Smirnov-Grubbs test.
Python
50
star
8

systracer

Yet another system call tracer written in Go.
Go
45
star
9

pandas-validator

Validation Library for pandas' DataFrame and Series.
Python
44
star
10

jpandas

Implementation of Pandas (Python Data Analysis Library) on java.
Java
44
star
11

react-native-focus-scroll

React Native Library to detect children that are focused on ScrollView.
JavaScript
38
star
12

chalice-linebot

LINE BOT on AWS Lambda + API Gateway built with Chalice
Python
30
star
13

django-auth-example

Sample project for my talk at DjangoCongress JP 2018.
Python
26
star
14

webframework-in-python

"How to develop WSGI WEB Framework" talked at PyConJP 2016
Python
25
star
15

db_tutorial

Writing a sqlite clone from scratch in Rust (and Python3 for testing). Thanks @cstack !
Rust
25
star
16

xpcap

Cross-platform Packet Capture which supports Linux and macOS(BSD) in 1000 LOC without depending on libpcap.
C
24
star
17

datascience-notebook

Data Science Notebooks in Python3 (ja)
Jupyter Notebook
21
star
18

feedy

RSS Feed Fetching Framework for Python
Python
20
star
19

gosearch

Web crawler and Search engine in Golang.
Go
18
star
20

concurrency-in-python

Tutorial of concurrency in Python3 (Multi-threading, Multi-processing, Asynchronous programming)
Python
15
star
21

sample-c2goasm

Calling C functions optimized by LLVM Auto-Vectorization after converting to Go Plan9 Assembly using c2goasm.
Assembly
15
star
22

comet

Desktop application for displaying the hashtag tweets when you talk at a conference.
JavaScript
13
star
23

TDD-with-Django

QiitaのDjango入門をTDDで書いてみる
Python
8
star
24

ng2-card

NOT MAINTAINED: Card view component for angular2
TypeScript
7
star
25

goptuna-isucon9q

Applying bayesian optimization to the parameters of MySQL, Nginx and Go web applications.
Go
7
star
26

mypyc_ipython

IPython magic command interface for interactive work with mypyc, a compiler from type-annotated Python to C extensions.
Python
6
star
27

go-neural-network

WIP: Neural Network Implementation for Golang.
Go
6
star
28

django-httpbench

HTTP load testing tools for Django. Like an apache bench but requests are sent from authenticated users.
Python
5
star
29

google-translate-po

Auto-input po-style translation files using Google Translate API.
Python
5
star
30

goptuna-bayesopt

Goptuna sampler for Gaussian Process based bayesian optimization using d4l3k/go-bayesopt.
Go
4
star
31

django-api-practices

Sample source code for my talk at PyConJP 2018.
Python
4
star
32

benchmark-warm-starting-cmaes

Benchmark code for Warm Starting CMA-ES (PR: https://github.com/optuna/optuna/pull/2307)
Python
4
star
33

c-bata.github.io

This repository is my portfolio web site.
HTML
4
star
34

github-actions-kurobako

GitHub Action to generate kurobako report and comment it to the pull request.
Python
4
star
35

sandbox-atcoder

C++
3
star
36

c-bata

README for @c-bata
3
star
37

mdnote

Markdown editor with React.js, Babel and Electron.
JavaScript
3
star
38

django-unsecure-examples

Django projects to reproduce CSRF, XSS, SQL injection and Clickjacking.
Python
3
star
39

akashipy

兵庫県明石市で開催している Python勉強会 #akashipy の資料やソースコード
2
star
40

optuna-memorydump

Dump Optuna in-memory storage to RDB storage. This tool ensures idempotence and thread-safe.
Python
2
star
41

pym

NOT MAINTAINED. Please use python-build (See https://github.com/yyuu/pyenv/tree/master/plugins/python-build)
Shell
2
star
42

onnx-remove-random-normal

Automatically replace ONNX's RandomNormal node with Constant node.
Python
2
star
43

lambda-thumbnail-generator

Generating Thumbnail from S3 using AWS Lambda, Python2 and Pillow
Python
2
star
44

django-pygments-renderer

Provides functionality for syntax highlighting using Pygments.
Python
2
star
45

go-actions

[Deprecated] I recommend you to use JavaScript to write the custom Github actions now.
Go
2
star
46

rexecute

Re-execute a command when specified files are modified.
Makefile
1
star
47

katib-goptuna-example

An example project to run Goptuna based CMA-ES suggestion service on Katib for https://github.com/kubeflow/katib/pull/1131
Python
1
star
48

mkdocs-term-validator

mkdocs port of https://github.com/shimizukawa/sphinx-term-validator
Python
1
star
49

awesome-python-webapps

A curated list of awesome python web development libraries.
1
star
50

mlcamp-adult-competition

Python
1
star
51

JavaPaint

Java+Swingでお絵かきソフト
Java
1
star
52

talks

WIP: slide viewer for my talk.
HTML
1
star
53

django-label-tag-attr

Add css classes and html tag attributes to django form's label.
Python
1
star
54

Algorithm

アルゴリズムやデータ構造の考え方 & ソースコードをメモ
C
1
star