コンテンツにスキップ

SQBM+

システムHに導入されている SQBM+ を利用する手順を説明します。

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コードを作成します。

Fixstars Amplify Demo

サンプルコード

# 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