コンテンツにスキップ

Digital Annealer

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

Note

Digital Annealerの使用は特定の計算ノードのみに限定されています。まずはインタラクティブジョブにて、Pythonの仮想環境を作成することを推奨します。

インタラクティブジョブ

インタラクティブジョブでのジョブ投入からDigital Annealerの実行までの流れを以下で説明します。

ジョブ投入

資源タイプrt_QDを指定してジョブ投入します。

[username@qes01 ~]$ qsub -l rt_QD=1 -W group_list=grpname -I

grpname: 所属するグループ名に置き換えてください。

環境設定

共有ライブラリのパス及びPython モジュールの検索パスを追加します。

[username@qh503 ~]$ export LD_LIBRARY_PATH=/opt/FJSVda/lib:$LD_LIBRARY_PATH
[username@qh503 ~]$ export PYTHONPATH=/opt/FJSVda/python3.X:$PYTHONPATH

python3.X:使用するバージョン(3.9, 3.11)に合わせてください。

仮想環境の作成 (初回のみ)

Python の仮想環境を作成します。

[username@qh503 ~]$ python3.X -m venv --system-site-packages <venv_name>

<venv_name>: 任意の仮想環境名に置き換えてください。

python3.X:使用するバージョン(3.9, 3.11)に合わせてください。

仮想環境のアクティベート

作成した仮想環境をアクティベートします。

[username@qh503 ~]$ source <venv_name>/bin/activate

Pythonコードの作成

以下に格納されているユーザーガイド、APIリファレンスを参考にDigital AnnealerのためのPythonコードを作成します。

ユーザーガイド

/apps/digital-annealer/docs/ja/Users_Guide_ja.pdf

APIリファレンス

/apps/digital-annealer/docs/ja/API_Reference_ja.pdf

サンプルコード

# 1. Pyfjsvda ライブラリのインポート
from Pyfjsvda import Pyfjsvda
# 2. Pyfjsvda クラスをインスタンス化
da_instance = Pyfjsvda()
# 3. BinaryPolynomial クラスをインスタンス化
# 問題規模(変数の数)が 6bit の問題を作成
bit = 6
bp = da_instance.create_poly(bit)
pbp = da_instance.create_poly(bit)
# 4. add_term、power 等の関数を使用して問題を作成
# 二次多項式(コスト関数):-1*x_0 -2*x_1 -3*x_2 -4*x_3 -5*x_4 -6*x_5 +10*x_0*x_1
bp.add_term(-1, i=0)
bp.add_term(-2, i=1)
bp.add_term(-3, i=2)
bp.add_term(-4, i=3)
bp.add_term(-5, i=4)
bp.add_term(-6, i=5)
bp.add_term(10, i=0, j=1)
# ペナルティ二次多項式:(x_1 + x_3 + x_4 ? 2)**2
pbp.add_term(1, i=1)
pbp.add_term(1, i=3)
pbp.add_term(1, i=4)
pbp.add_term(-2)
pbp.power()
# 不等式制約:4*x_2+3*x_3+2*x_4+x_5 &lt;= 9
ineq = da_instance.create_inequalities(bit)
ineq.append_inequality([0, 0, 4, 3, 2, 1], 9, penalty=1)
# 5. Solver パラメータの設定
da_instance.solver(
        time_limit_sec=5,
        gs_level=0,
        internal_penalty=1,
        # 1way1hot 制約を次の通りに指定
        # x_0 と x_1 が 1 グループ、x_2 と x_3 が 1 グループ、x_4 と x_5 が 1 グループ
        # 各グループ内で 1 つ変数のみが 1 となる制約
        one_way_one_hot_groups={"numbers": [2, 2, 2]}
        )
# 6. 求解処理の実行
da_instance.minimize(
        bp,
        penalty_poly=pbp,
        inequalities=ineq,
        guidance_config={"1": True, "2": False, "4": False},
        show_progress=False
        )
# 7. 結果の出力、進捗情報の表示
print("solution_list:", da_instance.get_solution_list())
print("min_feasible_solution:", da_instance.get_min_feasible_solution())

Python コードの実行

Digital Annealer を利用する Python コードを実行します。

[username@qh503 ~]$ python3 <python_code_name>

Amplify SDK 経由で実行する方法

Note

Amplify SDK の最新バージョン (v1.4 以降) では Python 3.9 をサポートしていません。 そのため、 Amplify SDK を使用する場合は Python 3.11 をご利用ください。

作成した仮想環境に Amplify SDK をインストールします。

[username@qh503 ~]$ source <venv_name>/bin/activate
(venv_name)[username@qh503 ~]$ python3 -m pip install -U amplify

また、 LD_LIBRARY_PATHPYTHONPATH が上述の通り設定された状態で、さらに PYTHONPATH に以下のパスを追加してください。

$ export PYTHONPATH=/opt/DA_middleware/python3.11:$PYTHONPATH

Amplify SDK 経由で実行するためには、 リクエストを処理する中継サーバーを起動する必要があります。

(venv_name)[username@qh503 ~]$ /usr/local/sbin/da_start
Digital Annealer middleware server successfully started
Frontend: http://0.0.0.0:2080
Database: 127.0.0.1:2081

Amplify のサンプルコード

from datetime import timedelta

from amplify import FujitsuDA4Client, Model, VariableGenerator, solve

client = FujitsuDA4Client()
client.url = "localhost:2080"

# one-way one-hot groups の検出を有効化
client.set_one_way_one_hot_groups = True

# 実行時間を 1 秒に設定
client.parameters.time_limit_sec = timedelta(seconds=1)


# 決定変数と目的関数を定義
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(f"Best objective value: {result.best.objective}")  # 0.0
print(f"Best solution:        {q.evaluate(result.best.values)}")  # [0. 1.]

Amplify の実行

Amplify SDK 経由で Digital Annealer を利用する Python コードを実行します。

(venv_name)[username@qh503 ~]$ python3 <python_code_name>

バッチジョブ

既にPythonコードを作成してる場合はバッチジョブによる実行も可能です。

バッチジョブでの実行の流れを以下で説明します。

ジョブスクリプト

ジョブスクリプト内で資源タイプをrt_QD指定します。

#!/bin/sh

#PBS -l rt_QD=1
#PBS -j oe
#PBS -W group_list=grpname

export LD_LIBRARY_PATH=/opt/FJSVda/lib:$LD_LIBRARY_PATH
export PYTHONPATH=/opt/FJSVda/python3.11:$PYTHONPATH

# Amplify SDK を使用する場合は次の 2 行を追加してください (Python 3.11 でのみ可能です)
# export PYTHONPATH=/opt/DA_middleware/python3.11:$PYTHONPATH
# source /usr/local/sbin/da_start

source <venv_name>/bin/activate

python <python_code_name>

grpname: 所属するグループ名に置き換えてください。

<venv_name>: 作成した仮想環境名に置き換えてください。

ジョブ投入

バッチジョブを投入します。

[username@qes01 ~]$ qsub run.sh