コンテンツにスキップ

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 ~]$ python <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.X:$PYTHONPATH

source <venv_name>/bin/activate

python <python_code_name>

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

python3.X: 使用する Python のバージョンに合わせてください。

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

ジョブ投入

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

[username@qes01 ~]$ qsub run.sh