SQBM+
システムHに導入されている SQBM+ を利用する手順を説明します。
SQBM+は、東芝が開発した技術「シミュレーテッド分岐アルゴリズム(SBアルゴリズム)」を用いた組合せ最適化ソルバ「シミュレーテッド分岐マシン(Simulated Bifurcation Machine:SBM)」を核とする量子インスパイアード最適化ソリューションです。
SQBM+では汎用的に利用できるQUBOソルバに加えて、様々なソルバを提供しています。 対象とする問題に合わせてソルバを選択してください。
インタラクティブジョブ
インタラクティブジョブでのジョブ投入からSQBM+の実行までの流れを以下で説明します。
ジョブ投入
資源タイプrt_QSを指定してジョブ投入します。
[username@qes01 ~]$ qsub -l rt_QS=1 -W group_list=grpname -I
grpname: 所属するグループ名に置き換えてください。
問題データの作成
SQBM+マニュアルを参考に求解したい問題を表すデータファイルを作成します。
quboソルバのサンプルデータファイルは以下となっています。
qubo.txt
%%MatrixMarket matrix coordinate integer general
5 5 11
1 1 -2
2 1 2
2 2 -3
3 1 2
3 2 2
3 3 -3
4 2 2
4 4 -2
5 3 2
5 4 2
5 5 -2
SQBM+サーバの起動
SQBM+サーバを以下を参考に起動してください。
例)サーバ起動
[username@qh505 ~]$ /usr/local/sbin/sqbmplus_start
sqbmplus service start
[username@qh505 ~]$ curl "http://localhost:8000/version"
{"version":"2.1.0"}
求解処理の実行
起動したSQBM+のサーバに対して求解処理のHTTPリクエストを送信します。
HTTP送信の際のURLは以下となっています。
URL configuration: http://{ip}:{port}/solver/{solver}?{parameter}
| 変数 | 説明 |
|---|---|
| ip | SQBM+計算APIが動作しているマシンのIPアドレス(システムHではlocalhostに固定) |
| port | SQBM+サーバのポート番号(システムHでは8000に固定) |
| solver | ソルバの種類(qubo, qplib, pubo, tsp, shift, qap) |
| parameter | クエリ文字列(key=value形式)利用可能なパラメータとその詳細は、各ソルバ固有のパラメータ仕様を参照 パラメータが設定されていない場合はデフォルト値が使用されます。 |
Note
--data-binaryでHTTPリクエスト送信の際に作成したデータファイルを指定します。
例)quboソルバの実行例
[username@qh505 ~]$ curl -H "Content-Type: application/octet-stream" -X POST "http://localhost:8000/solver/qubo?timeout=1" --data-binary @qubo.txt
{"id":"r4894118093","time":1.062,"wait":0.004,"message":"timeout","runs":131990,"value":-5,"result":[0,1,0,0,1],"param":{"algo":255,"steps":2,"dt":0.7796917,"C":0.1791543},"count":18513}
バッチジョブ
既に問題データファイルを作成している場合はバッチジョブによる実行も可能です。
バッチジョブでの実行の流れを以下で説明します。
ジョブスクリプト
ジョブスクリプト内で資源タイプをrt_QS指定します。
例)quboソルバでのジョブスクリプト
#!/bin/bash
#PBS -l rt_QS=1
#PBS -l walltime=1:00:00
#PBS -W group_list=grpname
echo "Start SQBM+"
/usr/local/sbin/sqbmplus_start
echo "SQBM+ Version"
curl "http://localhost:8000/version"
echo "Run qubo"
curl -H "Content-Type: application/octet-stream" -X POST "http://localhost:8000/solver/qubo?timeout=1" --data-binary @qubo.txt
grpname: 所属するグループ名に置き換えてください。
ジョブ投入
バッチジョブを投入します。
[username@qes01 ~]$ qsub run.sh
Amplify SDKを用いた実行方法
問題の定式化および求解処理の実行に Fixstars Amplify SDK を用いる場合の実行方法を説明します。
インタラクティブジョブ
仮想環境の作成 (初回のみ)
インタラクティブジョブにてPython の仮想環境を作成しFixstars Amplify SDKをインストールします。
[username@qes01 ~]$ qsub -l rt_QS=1 -W group_list=grpname -I
grpname: 所属するグループ名に置き換えてください。
[username@qh505 ~]$ python3 -m venv <venv_name>
[username@qh505 ~]$ source <venv_name>/bin/activate
(venv_name)[username@qh505 ~]$ python3 -m pip install -U amplify
venv_name: 任意の仮想環境名に置き換えてください。
仮想環境のアクティベート
事前に作成した仮想環境をアクティベートします。
[username@qh505 ~]$ source <venv_name>/bin/activate
Pythonコードの作成
Fixstars Amplifyが公開している以下Webサイトを参考にPythonコードを作成します。
サンプルコード
# import
import amplify
from amplify import ToshibaSQBM2Client
from amplify import Model
from amplify import VariableGenerator
from amplify import solve
from datetime import timedelta
# ---
# setting
client = ToshibaSQBM2Client()
# SQBM+ で使用するローカルホストのurlを設定
client.url = "http://localhost:8000/"
# 使用するソルバを Qubo に設定
client.solver = "Qubo"
# 実行時間を 1 秒に設定
client.parameters.timeout = timedelta(milliseconds=1000)
# ---
# run
# 決定変数と目的関数を定義
g = VariableGenerator()
q = g.array("Binary", 2)
f = q[0] * q[1] + q[0] - q[1] + 1
# モデルを作成
model = Model(f)
# ソルバーを実行
result = solve(model, client)
# ---
# print
print("Amplify SDK version = " + amplify.__version__)
print("solver version = " + client.version)
#print(result)
# 目的関数の値
print(result.best.objective)
# 変数の値
print(result.best.values)
# サンプル問題の解 ( [q_0, q_1] = [0. 1.] )
print(f"{q} = {q.evaluate(result.best.values)}")
SQBM+サーバの起動
SQBM+サーバを以下を参考に起動してください。
例)サーバ起動
(venv_name)[username@qh505 ~]$ /usr/local/sbin/sqbmplus_start
sqbmplus service start
(venv_name)[username@qh505 ~]$ curl "http://localhost:8000/version"
{"version":"2.1.0"}
Python コードの実行
作成したPython コードを実行します。
(venv_name)[username@qh505 ~]$ python3 <python_code_name>
バッチジョブ
既にPythonの仮想環境、Pythonコードを作成してる場合はバッチジョブによる実行も可能です。
バッチジョブでの実行の流れを以下で説明します。
ジョブスクリプト
ジョブスクリプト内で資源タイプをrt_QS指定します。
#!/bin/sh
#PBS -l rt_QS=1
#PBS -l walltime=1:00:00
#PBS -W group_list=grpname
# 仮想環境のアクティベート
source <venv_name>/bin/activate
echo "Start SQBM+"
/usr/local/sbin/sqbmplus_start
echo "SQBM+ Version"
curl "http://localhost:8000/version"
# pythonコードの実行
python3 <python_code_name>
grpname: 所属するグループ名に置き換えてください。
<venv_name>: 任意の仮想環境名に置き換えてください。
ジョブ投入
バッチジョブを投入します。
[username@qes01 ~]$ qsub run.sh