こんにちは、ちょっと開発してみました。
無料のSDKでPyTorchベースで巨大な計算が解けます。
GPUを増やすと解ける問題を増やすことができると思いますが、今後の開発に期待です。
今回は単体のCPU/GPUを使って組合せ最適化問題を解いてみます。
Tytan(タイタン)というQUBOアニーリングのSDKに統合しました。
有志によって運用されています。
Tytan
https://github.com/tytansdk/tytan
使い方はシンプルです。とりあえずgithubに載せたので、インストールは、
pip install -U git+https://github.com/tytansdk/tytan
使い方はやはりシンプルです。今回のTorch TytanではPyTorchもインストールが必要ですので、合わせて入れておいてください。
通常のTytanでソルバーを変更するだけです。今回の指定するソルバーは、
solver = sampler.ArminSampler()
で、アルミンソルバーを指定すればOKです。標準ではCPUモードになっていますので、
solver = sampler.ArminSampler(mode="GPU")
のように指定してあげるとGPUモードになります。
from tytan import *
import random
N = 5000
#量子ビットを用意(まとめて定義)
q = symbols_list([N])
print(q)
式を記述(ランダムな数を与えます)
H = 0
バイアスを設定
for i in range(N):
H += random.randint(-10, 10) * q[i]
全部の相互作用を追加するの大変なので、5000箇所だけ指定
for i in range(5000):
H += random.choice([-1, 1]) * q[random.randint(0,N-1)] * q[random.randint(0,N-1)]
print(H)
#コンパイル
qubo, offset = Compile(H).get_qubo()
#サンプラー選択
solver = sampler.ArminSampler(mode="GPU")
#サンプリング
result = solver.run(qubo, show=True)
#結果
for r in result:
print(r)
こんな感じですね。
[q0 q1 q2 ... q4997 q4998 q4999]
3*q0 - 9*q1 - 3*q10 - 10*q100 + 4*q1000 (略)
GPU MODE
[{'q0': 0, 'q1': 1, 'q10': 1, (中略), -11177.0, 1]
今回はオプションで履歴をつけてるので、
サンプラー自体はこちらにあります、
https://github.com/tytansdk/tytan/blob/main/tytan/sampler.py
インスタンス生成時にはモードの指定、シードの指定ができます。mode = 'CPU' か mode='GPU'が指定できます。
def __init__(self, mode='CPU', seed=None, seed_cuda=None):
実行時にはいくつかオプションがありますが、重要なのは、num_iterationsでシミュレーションのステップ数を長くできます。大規模になったらこちらを大きめにとるのが良いかと。また、show=Trueを指定するとグラフが見れます。
def run(self, qubo, shots=1, initial_temp=10.0, final_temp=0.1, alpha=0.95, num_iterations=10000, show=False):
どうでしょうか?GPUを持っているとかなり夢が広がります。今回の問題もGoogle Colabの無料T4でも10秒くらいで計算が終わります。式展開などを入れても20秒ほどでした。ぜひ色々試してみてください。