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 <= 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