Fixstars Amplify AE
システムHに導入されている Fixstars Amplify Annealing Engine(AE) を利用する手順を説明します。
仮想環境の作成 (初回のみ)
インタラクティブノードでPython の仮想環境を作成しFixstars Amplify SDKをインストールします。
[username@qes01 ~]$ python3 -m venv <venv_name>
[username@qes01 ~]$ source <venv_name>/bin/activate
(venv_name)[username@qes01 ~]$ python3 -m pip install -U amplify
venv_name: 任意の仮想環境名に置き換えてください。
home領域に仮想環境を準備できたらインタラクティブジョブ及びバッチジョブを投入します。
インタラクティブジョブ
インタラクティブジョブでのジョブ投入からFixstars Amplifyの実行までの流れを以下で説明します。
ジョブ投入
資源タイプrt_QAを指定してジョブ投入します。
[username@qes01 ~]$ qsub -l rt_QA=1 -W group_list=grpname -I
grpname: 所属するグループ名に置き換えてください。
環境設定
cudaモジュールをロードします。
[username@qh503 ~]$ module load cuda/12.6/12.6.2
Fixstars Amplifyサーバを起動します。
[username@qh503 ~]$ /usr/local/sbin/fa_start
仮想環境のアクティベート
事前に作成した仮想環境をアクティベートします。
[username@qh503 ~]$ source <venv_name>/bin/activate
Pythonコードの作成
Fixstars Amplifyが公開している以下Webサイトを参考にPythonコードを作成します。
Note
システムHではFixstars Amplify Engineのurlを設定の際にローカルホストを指定します。
またインタラクティブノードでもPythonコードの開発は可能ですが、求解処理は計算ノードのみで可能です。
Caution
ABCI-QでサポートしているAmplify AEはv0.8.8です。
そのため、AmplifyAEClient()などのAmplify SDK v1 APIは使用できません。
以下のサンプルコードではAmplify SDK v0 APIを使用しています。
サンプルコード
# import
import amplify
from amplify import FixstarsClient
from amplify import Model
from amplify import VariableGenerator
from amplify import solve
from datetime import timedelta
# ---
# setting
client = FixstarsClient()
# Fixstars Amplify Engineのurlを設定
client.url = "http://localhost:1080"
# 実行時間を 1 秒に設定
client.parameters.timeout = timedelta(milliseconds=1000)
# 使用する GPU 数を 4 に設定
client.parameters.num_gpus = 4
# 探索中に得られた全ての解を取得
client.parameters.outputs.num_outputs = 0
# ---
# 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)}")
Python コードの実行
作成したPython コードを実行します。
[username@qh503 ~]$ python3 <python_code_name>
バッチジョブ
既にPythonコードを作成してる場合はバッチジョブによる実行も可能です。
バッチジョブでの実行の流れを以下で説明します。
ジョブスクリプト
ジョブスクリプト内で資源タイプをrt_QA指定します。
#!/bin/sh
#PBS -l rt_QA=1
#PBS -j oe
#PBS -W group_list=grpname
# cudaモジュールロード
module load cuda/12.6/12.6.2
# Fixstars Amplify サーバの起動
/usr/local/sbin/fa_start
# 仮想環境のアクティベート
source <venv_name>/bin/activate
# pythonコードの実行
python3 <python_code_name>
grpname: 所属するグループ名に置き換えてください。
<venv_name>: 任意の仮想環境名に置き換えてください。
ジョブ投入
バッチジョブを投入します。
[username@qes01 ~]$ qsub run.sh
OMMXにおけるAmplify AEの使用について
OMMXとは
OMMX(Open Mathematical prograMming eXchange; オミキス)とは、数理最適化を実務に応用する過程で必要となる、ソフトウェア間や人間同士のデータ交換を実現するためのオープンなデータ形式と、それを操作するためのSDKの総称です。
このOMMXで作成した数式モデルは、ommx-fixstars-amplify-adapterを使用することで、Fixstars Amplifyを使って解くことができます。
OMMXのAmplify Adapterを使用するにあたって
ommx-fixstars-amplify-adapterはデフォルトではAmplify AE v1を前提に実装されています。 そのため、一般に公開されたサンプルコードは、そのままではABCI-QのAmplify AE v0.8.8では動きません。
ABCI-Q上で動作させるためには、Adapterのインスタンスを生成した後に以下の対応が必要になります。
- clientを
amplify.FixstarsClientに変更する - client.urlを
"https://localhost:1080"に変更する
以下にABCI-Q上で動作するOMMXのプログラム例を示します。
Note
本サンプルコードはommx-fixstars-amplify-adapter v0.4.0でのみ動作確認をしています。
サンプルコード
import amplify
from ommx.v1 import Instance, DecisionVariable
from ommx_fixstars_amplify_adapter import OMMXFixstarsAmplifyAdapter
q_0 = DecisionVariable.binary(id=0, name="q_0")
q_1 = DecisionVariable.binary(id=1, name="q_1")
ommx_instance = Instance.from_components(
decision_variables=[q_0, q_1],
objective=q_0 * q_1 + q_0 - q_1 + 1,
constraints=[q_0 + q_1 == 1],
sense=Instance.MAXIMIZE,
)
adapter = OMMXFixstarsAmplifyAdapter(ommx_instance)
model = adapter.solver_input
client = amplify.FixstarsClient()
client.url = "http://localhost:1080"
result = amplify.solve(model, client)
solution = adapter.decode(result)
print(solution.decision_variables_df)