Save, Push and Pull#

このチュートリアルでは、MINTOを使用して最適化実験を保存し、リモートリポジトリにプッシュする方法を説明します。

Save#

mintoではデータをローカルに保存する方法として、"ファイルベースの保存"と"OMMX Archiveベースの保存"の2つがあります。

ファイルベースの保存#

ファイルベースの保存については2つの保存方法があります。

experiment = minto.Experiment("sample", auto_saving=True)

上記のようにauto_saving=Trueを指定すると、.log_*メソッドが呼び出されるたびにファイルベースの保存の形で自動的に保存されます。

また実験が終わった後に

experiment.save("path/to/directory")

のようにsaveメソッドを呼び出すことで、指定したディレクトリにファイルベースの保存を行うこともできます。

OMMX Archiveベースの保存#

experiment.save_as_ommx_archive("path/to/archive.minto.ommx")

のようにsave_as_ommx_archiveメソッドを呼び出すことで、OMMX Archiveベースのひとつの圧縮ファイルとして保存することができます。

GitHub PackageへのPushとPull#

ここではOMMX Artifact機能を利用して、MINTOにより管理している実験をGitHub Packagesにpushする方法と、他のユーザがこれらの実験をpullする方法について説明します。
OMMX Artifactは、実験結果を他のコンテナレジストリにpushすることも可能です。 GitHub Packagesにpushすることで、コードと実験結果の両方をGitHub上で管理でき量になり、チームでの共有も容易になります。

まずは数理最適化のための数値実験を行いましょう。 ここでは、"Quick Start"と同じものを題材にします。 詳細は元のチュートリアルページをご覧ください。

import minto
import ommx_pyscipopt_adapter as scip_ad
from ommx.dataset import miplib2017

instance_name = "reblock115"
instance = miplib2017(instance_name)

timelimit_list = [0.1, 0.5, 1, 2]

experiment = minto.Experiment("scip_reblock115", auto_saving=False, verbose_logging=False)

experiment.log_global_instance(instance_name, instance)
adapter = scip_ad.OMMXPySCIPOptAdapter(instance)
scip_model = adapter.solver_input

for timelimit in timelimit_list:
    with experiment.run() as run:
        run.log_parameter("timelimit", timelimit)

        # Solve by SCIP
        scip_model.setParam("limits/time", timelimit)
        scip_model.optimize()
        solution = adapter.decode(scip_model)

        run.log_solution("scip", solution)

experiment.get_run_table()
metadata parameter solution_scip
elapsed_time run_id timelimit feasible name objective optimality relaxation start
run_id
0 0.110150 0 0.1 True scip 0.000000e+00 0 0 None
1 0.407828 1 0.5 True scip -2.824191e+07 0 0 None
2 0.507013 2 1.0 True scip -2.824191e+07 0 0 None
3 1.007558 3 2.0 True scip -2.824191e+07 0 0 None

GitHub Packageへのpush#

実験結果を、GitHub Packagesにpushする方法を学びましょう。

前提条件#

  1. GitHubのアカウントとリポジトリが必要となります。

  2. まだ作成していない場合、リポジトリ作成に関するGitHubのドキュメントを参照してください。

GitHub Packagesにpushするには、GitHub ActionsでPersonal Access Token (PAT)もしくはGITHUB_TOKENを用いた認証が必要です。write:packages権限を持つPATを作成してください。

PATの作成方法については、GitHubのドキュメントを参照してください。

取得したトークンを用いて以下の2つのいずれかの方法で認証を行います。

  1. CLIを用いる方法 ommx loginを実行し、認証情報をローカルマシンに保存します

    ommx login --username=<GITHUB_USERNAME> --password=<PERSONAL_ACCESS_TOKEN> https://ghcr.io
    
  2. 環境変数を用いる方法

    • 以下の環境変数の設定を行います

     env:
         OMMX_BASIC_AUTH_DOMAIN: ghcr.io
         OMMX_BASIC_AUTH_USERNAME: ${{ github.actor }}
         OMMX_BASIC_AUTH_PASSWORD: ${{ github.token }}
    
    • OMMX_BASIC_AUTH_PASSWORDには、GitHubのPersonal Access Tokenを作成する必要があります。Personal Access Tokenを作成するには、GitHubのガイドに従い、write:packages権限を有効にしてください

注意: GitHub Packagesへのpushとpullには、OMMX Artifact機能を用います。そのため、GitHub認証などの設定はOMMX Artifactと同じになります。詳細については、こちらのノートブックを参照してください。

push#

認証の設定が完了したら、Experiment.push_githubメソッドを用いて、GitHub Packagesにpushします。 このメソッドは以下のパラメータを持ちます。

  • org: GitHubでの組織名

  • repo: GitHubリポジトリ名

  • name: Artifact名 (初期設定ではExperiment.name)

  • tag: タグ名 (初期設定ではExperiment.timestamp.strftime('%Y%m%d%H%M%S'))

# If environment variables are not set, please use the following to set them.
# Environment variables
import os

# os.environ["OMMX_BASIC_AUTH_DOMAIN"] = 'ghcr.io'
# os.environ["OMMX_BASIC_AUTH_USERNAME"] = <GITHUB_USERNAME>
# os.environ["OMMX_BASIC_AUTH_PASSWORD"] = <PERSONAL_ACCESS_TOKEN>

早速、Experiment.push_githubメソッドを用いて、GitHub Packagesにpushしてみましょう。 先述の通り、nameとtagのパラメータは指定する必要はありません。 このメソッドはommx.Artifactオブジェクトを返し、ommx.Artifact.image_nameを用いてpushされたイメージ名を確認することができます。

artifact = experiment.push_github(org="Jij-Inc", repo="MINTO-Public")
artifact.image_name
'ghcr.io/jij-inc/minto-public/scip_reblock115:latest5'

GitHub Packagesからのpull#

次に、GitHub Packagesにpushしたイメージをpullしてみましょう。 そのために、minto.Experiment.load_from_registryメソッドを用います。 このメソッドはGitHub Packagesだけでなく、他のコンテナレジストリからのpullもサポートしています。 そのため、イメージ名を直接指定する必要があるのです。

exp2 = minto.Experiment.load_from_registry(
    "ghcr.io/jij-inc/minto-public/scip_reblock115:latest5"
)

pullしてきたデータを見てみましょう。

exp2.get_run_table()
metadata parameter solution_scip
elapsed_time run_id timelimit feasible name objective optimality relaxation start
run_id
0 0.110150 0 0.1 True scip 0.000000e+00 0 0 None
1 0.407828 1 0.5 True scip -2.824191e+07 0 0 None
2 0.507013 2 1.0 True scip -2.824191e+07 0 0 None
3 1.007558 3 2.0 True scip -2.824191e+07 0 0 None

まとめ#

mintoを使ってデータをローカルに保存する方法(ファイルベース, OMMX Archiveベース)と GitHub Packagesへのpushとpullする方法を見てきました。

mintoはこのようにデータを取り扱いしやすくする機能を提供することで簡単に他の人とデータを共有しやすくしています。