diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index d87bdf50..1107398b 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -24,7 +24,7 @@ jobs: - run: flake8 . --show-source - run: black --check --diff . - run: isort --check --diff . - - run: mypy . + - run: mypy optuna_dashboard python_tests test: runs-on: ubuntu-latest strategy: diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 17b38c56..b334fd5d 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -29,6 +29,19 @@ $ npm run build:prd +### Building a Docker image + +``` +$ docker build -t cbata/optuna-dashboard . +``` + +When failed above command due to the out of heap memory error (Exit code: 137), please check "Resources" tab on your Docker engine's preference since it requires a lot of memory to compile TypeScript files. +You can use the Docker image like below: + +``` +$ docker run -it --rm -p 8080:8080 cbata/optuna-dashboard sqlite:///db.sqlite3 +``` + ### Running dashboard server ``` diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..4cd28c4d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM node:14 AS front-builder +WORKDIR /usr/src + +ADD ./package.json /usr/src/package.json +ADD ./package-lock.json /usr/src/package-lock.json +RUN npm install + +ADD ./tsconfig.json /usr/src/tsconfig.json +ADD ./webpack.config.js /usr/src/webpack.config.js +ADD ./optuna_dashboard/static/ /usr/src/optuna_dashboard/static +RUN mkdir -p /usr/src/optuna_dashboard/public +RUN npm run build:prd + +FROM python:3.8-buster AS python-builder + +WORKDIR /usr/src +RUN pip install --upgrade pip setuptools +RUN pip install --progress-bar off PyMySQL[rsa] psycopg2-binary + +ADD ./setup.cfg /usr/src/setup.cfg +ADD ./setup.py /usr/src/setup.py +ADD ./optuna_dashboard /usr/src/optuna_dashboard +COPY --from=front-builder /usr/src/optuna_dashboard/public/ /usr/src/optuna_dashboard/public/ +RUN pip install --progress-bar off . + +FROM python:3.8-slim-buster as runner + +COPY --from=python-builder /usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages +COPY --from=python-builder /usr/local/bin/optuna-dashboard /usr/local/bin/optuna-dashboard + +EXPOSE 8080 +ENTRYPOINT ["optuna-dashboard", "--port", "8080", "--host", "0.0.0.0"] diff --git a/docker/check_mysql.sh b/docker/check_mysql.sh new file mode 100755 index 00000000..d4a7906b --- /dev/null +++ b/docker/check_mysql.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +DIR=$(cd $(dirname $0); pwd) +OPTUNA_DASHBOARD_IMAGE=${OPTUNA_DASHBOARD_IMAGE:-cbata/optuna-dashboard} + +echo "" +echo "1. Prepare MYSQL 8.0 Server using Docker." +echo "" + +set -e +docker run \ + -d \ + --rm \ + -p 3306:3306 \ + -e MYSQL_USER=optuna \ + -e MYSQL_DATABASE=optuna \ + -e MYSQL_PASSWORD=password \ + -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \ + --name optuna-mysql \ + mysql:8 + +echo "Wait ready for MySQL" +sleep 20 + + +echo "" +echo "2. Run an Optuna example." +echo "" + +python ${DIR}/optuna_example.py "mysql+pymysql://optuna:password@127.0.0.1:3306/optuna" + +set +e + +echo "" +echo "3. Open Web Dashboard" +echo "" + +docker run -it --rm -p 8080:8080 --link=optuna-mysql $OPTUNA_DASHBOARD_IMAGE "mysql+pymysql://optuna:password@optuna-mysql:3306/optuna" + +echo "" +echo "4. Stop MYSQL Server" +echo "" + +docker stop optuna-mysql diff --git a/docker/check_postgres.sh b/docker/check_postgres.sh new file mode 100755 index 00000000..8a7d60e7 --- /dev/null +++ b/docker/check_postgres.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +DIR=$(cd $(dirname $0); pwd) +OPTUNA_DASHBOARD_IMAGE=${OPTUNA_DASHBOARD_IMAGE:-cbata/optuna-dashboard} + +echo "" +echo "1. Run PostgreSQL Server using Docker." +echo "" + +set -e +docker run \ + -d \ + --rm \ + -p 5432:5432 \ + -e POSTGRES_USER=optuna \ + -e POSTGRES_DB=optuna \ + -e POSTGRES_PASSWORD=password \ + --name optuna-postgres \ + postgres:10.1-alpine + +echo "Wait ready for PostgreSQL" +sleep 20 + + +echo "" +echo "2. Run an Optuna example." +echo "" + +python ${DIR}/optuna_example.py "postgresql+psycopg2://optuna:password@127.0.0.1:5432/optuna" + +set +e + +echo "" +echo "3. Open Web Dashboard" +echo "" + +docker run -it --rm -p 8080:8080 --link=optuna-postgres $OPTUNA_DASHBOARD_IMAGE "postgresql+psycopg2://optuna:password@optuna-postgres:5432/optuna" + +echo "" +echo "4. Stop MYSQL Server" +echo "" + +docker stop optuna-postgres diff --git a/docker/optuna_example.py b/docker/optuna_example.py new file mode 100644 index 00000000..3b75e90c --- /dev/null +++ b/docker/optuna_example.py @@ -0,0 +1,19 @@ +import sys + +import optuna + + +def objective(trial): + x = trial.suggest_float("x", -100, 100) + y = trial.suggest_categorical("y", [-1, 0, 1]) + return x ** 2 + y + + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Invalid args") + sys.exit(1) + + db_url = sys.argv[1] + study = optuna.create_study(storage=db_url, study_name="example-study") + study.optimize(objective, n_trials=10)