Skip to main content

1. JijZeptのサブスクリプションの設定

JijZeptを利用するにはJij Inc.の問い合わせ窓口からお問い合わせください。その後利用申し込みを行うことでJijZeptの利用を開始することが可能です。

以下ではアカウント作成後, 株式会社Jijへ利用申し込みまで行っているとし、その後のサブスクリプションの設定とJijZeptの始め方を紹介します。

1.1 Project について

JijZeptではProjectという単位で契約を行います。JijZeptでアカウントを作ることができますが、JijZeptの利用申請フォームから申請を行い、利用契約を行なっていなければJijZeptを使い始めることができません。  

利用契約を行なったあとの利用開始までの流れを説明します。

1.1.1 プロジェクトの作成

契約後JijZeptのポータルサイトからアカウントを作成してください。その後、右上の「Settings」から「Projects」に移って「Create new +」で適当な名前でプロジェクトを作成してください。
JijZeptではこのプロジェクト単位で契約・クレジットの購入を行います。

プロジェクトへクレジットの付与依頼

プロジェクトを作成したら、Jijへ作成したプロジェクト名を伝えてください。Jijで手続きが完了後、プロジェクトにクレジットが付与されます。

プロジェクトにクレジットが付与されると「Dashboard」にてクレジットの付与を確認することができます。

プロジェクトを作成したAdminユーザーの方はそのプロジェクトに「Standard member」を追加することができます。「Standard member」に追加する方にJijZeptのアカウントを作成してもらったあとProjectのページからアカウントのメールアドレスを使って「Standard member」にユーザーを追加してください。

プロジェクトに「Standard member」を追加するとそのプロジェクトに付与されているクレジットを共有することができます。

プロジェクトにクレジットの付与が確認できたら以下に進み、APIキーの取得を行なってください。

1.2 JijZeptのAPIキーの取得

ここからJijZeptのポータルサイトにサインインしてください。

右上のメニューから「Setting」をクリックします。ここで「Projects」から申し込み時にサブスクリプションを設定したProjectsを指定してください。 以下のように「Selected」になっていればOKです。

!!! note Projectsがない場合は, Projectを作成してJijへ利用申し込みを行うか, 同じ組織で利用申し込みを行っている方のProjectにMemberとして追加してもらうように申請してください。

次にポータルサイトの右上から「Dashboard」をクリックします。先程の設定でサブスクリプションが設定されているProjectを選択している場合は以下のように残りクレジットと利用可能なソルバー名が表示されているはずです。

次にAPI keyか「Add」をクリックしてキーを生成します。この時の名前は任意のもので大丈夫です。ここでは「Sample」としておきます。

「Primary key」と「Secondary key」が発行されますが、どちらを使っても良いです。どちらかをコピーしておいてください。JIjZeptのPython SDKを利用する際に用います。

1.3 Python SDKのインストールと初めてのJijZept

PyPIからJijZeptの利用に必要なPython SDKをインストールします。

!!! info Pythonの仮想環境 JijZeptを利用する際はPythonの仮想環境の構築をお勧めします。Python標準のvenvまたはpoetryといったツールを利用してPythonの仮想環境を構築し, 仮想環境上でJijZeptの設定を行ってください。

pip install jijmodeling jijzept

では早速JijZeptにリクエストを投げてみましょう。 適当な作業ディレクトリを作成し、移動します。

mkdir jijzept_sample; cd jijzept_sample

以下のPythonファイルをsample.pyという名前で作成します。

import jijzept as jz

sampler = jz.JijSASampler(token="**API key**", url="https://api.jijzept.com")
response = sampler.sample_qubo({("q0", "q1"): -1})
print(response.record)

jz.JijSASamplerの第一引数には先程ポータルサイトのDashboardで作成した「APIキー」を入力します。

このスクリプトを実行すると以下のようにPython SDKがJijZeptに問題を投げてソルバーが出した解が表示されます。

uploading instance ...
submitting query ...
submitted to the queue.
Your solution_id is e90902ajfa09039204ajdfada.
rec.array([([1, 1], -1., 1)],
dtype=[('sample', 'i1', (2,)), ('energy', '<f8'), ('num_occurrences', '<i8')])

これでJijZeptを始めることができました!次はtokenやAPIのURLの設定をソースコードとは別に設定ファイルに記述する方法を紹介します。

!!! note プロキシの設定が必要なために問題の送信がうまく行かない場合は、環境変数 HTTP_PROXYHTTPS_PROXYにプロキシのホストとポートを設定してください。

1.4 JijZeptの設定ファイルの作成

では先ほど取得した「APIキー」を使ってJijZeptの設定ファイルを作成します。

拡張子を.tomlとしたconfig.tomlファイルを作成します。またこのファイルにはAPIキーなどを記述するため、.gitignore ファイルの中にconfig.toml を追加してgitの管理外に置くことをお勧めします。

config.tomlファイルは以下のように記述します。

[default]
url = "https://api.jijzept.com/"
token = "0123456789abcdefg"

urlには「"https://api.jijzept.com/"」を設定してください。tokenには先ほど取得した「APIキー」を設定します。

これで最初の設定が完了しました。次はこのconfig.tomlに記述した情報を使ってJijZeptを使ってみます。

E(q0,q1)=2q0q1+q0E(q_0, q_1) = -2q_0 q_1 + q_0

という形のコストの最適化を行います。

from jijzept import JijSASampler

qubo = {('q_0', 'q_1'): -2, ('q_0', 'q_0'): 1}
sampler = JijSASampler(config='config.toml')
response = sampler.sample_qubo(qubo)

とすることでresponseに答えが返ってきます。response.infoにクラウド上で実際にかかった計算時間が[μs]単位で入っています。

Samplerのコンストラクタのconfig引数にはJijZeptの設定ファイルへのパスを記述してください。

1.5 JijModlingでの実行

ここではサンプルコード用の簡単な問題としてベクトル di`d_i` の中から一番小さい要素を選ぶ問題をQUBOで表現したモデルを使いたいと思います。つまり、

E=i=0N1dixi+λ(i=0N1xi1)2E = \sum_{i=0}^{N-1} d_i x_i + \lambda \left(\sum_{i=0}^{N-1} x_i -1\right)^2

というQUBOを解くことを考えます。

1.5.1 jijmodelingでのQUBOの構築

このQUBOをjijmodelingで構築します。

from jijmodeling import Problem, Placeholder, Binary, Element, Sum, Constraint

# 1次元ベクトルを用意します
d = Placeholder('d', dim=1)
N = d.shape[0]
# 1次元ベクトルと同じ長さのバイナリ変数列を用意します
x = Binary('x', shape=N)
# 総和 (Sum)のindexを設定します
i = Element('i', N)

problem = Problem('test_problem')
cost = Sum(i, d[i]*x[i])
problem += cost
# ペナルティの未定乗数はConstraintを使うと自動で付与されます
problem += Constraint('one-hot', x[:] == 1)

これで先ほどのQUBOを表現することができました。jijmodelingは数式に似た形で記述するのが特徴です。詳しくはjijmodelingのドキュメントをご覧ください。

1.5.2 jijzept を用いて問題を解く

では早速jijzeptを用いて問題を解いていきましょう。

from jijzept import JijSASampler

# インスタンス d となる具体的なベクトルを設定します
data_d = [1.0, 0.1, 2, 1]

sampler = JijSASampler(config='config.toml')
response = sampler.sample_model(
problem,
feed_dict={'d': data_d},
multipliers={'one-hot': 1.0},
search=True,
num_search=10
)

jijmodeling を使う場合は .sample_model を使います。

OpenJij で用意されているような BinaryQuadraticModelを扱う .sample, 辞書型を扱う .sample_ising, .sample_qubo も利用することができます。

.sample_model の引数を説明します。

  • feed_dict: Placeholderで構築した変数にセットする具体的な値を辞書で渡します。問題のインスタンスに対応します。
  • multipliers: ペナルティ項などで用いる未定乗数の値をセットします。feed_dictで設定されなかったPlaceholderが未定乗数として認識されます。Constraintクラスはデフォルトでは自動的にPlaceholderクラスの変数が乗算されるのでここで値の設定をしてください。
  • search: Trueの場合、制約条件の強さとしてmultipliersで設定した値を調整して実行可能解を探索します。最大でnum_reads×num_search回のアニーリングが実行されます。
  • num_search: searchTrueにした場合のパラメータ更新の最大回数を設定できます。しかし途中で実行可能解が得られた場合、更新が止まるためnum_searchに設定した回数以下の更新になります。

他にも機能に応じた引数がありますが、それは次章以降やチュートリアルで紹介します。