こんにちは、現在は2023年3月です。国内では量子アニーリングの流れを汲む擬似量子やイジングマシンがまだ利用されています。これは海外ではかなり萎んでいる話ですが、国内では電機メーカー大手を中心に量子アニーリングに大幅な投資をしたため、その投資回収の一環として続いているものです。海外では量子アニーリングは量子ゲートに押されてビジネス的に厳しくなっており、量子アニーリングメーカーも経営危機に瀕しております。
Quantum computing star D-Wave faces cash crunch, investors say
https://www.theglobeandmail.com/business/article-d-wave-infinity-machine-cash-crunch/
弊社でもそれ以来、量子アニーリングにはビジネス継続の疑義があるためお勧めをしていません。最近はawsからも撤退してしまい、Amazon Braketで利用ができなくなりました。その代わりとして利用しているのが、イジングマシン(擬似量子)です。
量子アニーリングに対して擬似量子は量子アニーリングを利用しておらず、主にシミュレーテッドアニーリングを利用してQUBOという問題の設定方式だけを利用しています。シミュレーテッドアニーリングは比較的こなれた技術のために利用しやすい上、難しい量子の開発が不要なため大手電機メーカーを中心に好まれて利用されています。実際に擬似量子を学んでも量子コンピュータとの関連はほぼないのですが、実際に利用しやすいことから最近のGPU技術の発展とともに、バックエンドをGPUにした富士通のデジタルアニーラ、東芝のSBM、日立のCMOSアニーリングなどの利用が拡大しています。また、NECは独自のベクトルアニーリングを発表しており、こちらはGPUではなく、独自のエンジンを利用しています。
このように、シミュレーテッドアニーリングとGPUを組み合わせて量子の流れに乗り、問題設定を合わせることで量子技術の恩恵を受けるという流れもあります。現在量子アニーリングのビジネス応用が難しくなってきていることから、実際のビジネスに利用をしたい場合にはこちらのSAを利用する流れが増えています。この流れについては個人的には特に否定的ではなく、ソフトウェア資産を無駄にするならQUBOをSAで活用するのもいいかなと思っています。
今回はそれらのサービスを概観し、利用方法についてみていきたいと思います。
富士通デジタルアニーラ
https://www.fujitsu.com/jp/digitalannealer/superiority/
NECベクトルアニーリング
https://jpn.nec.com/nec-vector-annealing-service/index.html
日立CMOSアニーリング
東芝SQBM+
https://www.global.toshiba/jp/products-solutions/ai-iot/sbm.html
大手電機メーカーはこの辺りでしょうか。また、
Fixstars Amplify
https://amplify.fixstars.com/ja/
Noah
https://noahsi.com/tech/qtc/comb/
Quanmatic
JijZept
こんな感じで結構ありそうです。
次にSDKです。SDKはイジングマシンの問題設定や実行を行うためのツールです。こちらはいくつかあるようです。
PyQubo
https://pyqubo.readthedocs.io/en/latest/
インストールは、
pip install pyqubo
となっていて、利用方法は、
from pyqubo import Spin
s1, s2, s3, s4 = Spin("s1"), Spin("s2"), Spin("s3"), Spin("s4")
H = (4*s1 + 2*s2 + 7*s3 + s4)**2
model = H.compile()
qubo, offset = model.to_qubo()
pprint(qubo)
となっています。
上記はs1からs4までのスピンを作って、それをQUBOとしてHにしています。上記PyQuboには定式化ツールのみが搭載されておりソルバーは含まれていません。ソルバーを利用する場合には他のサービスを利用する必要があり、下記はD-Wave Nealを利用しています。
import neal
sampler = neal.SimulatedAnnealingSampler()
bqm = model.to_bqm()
sampleset = sampler.sample(bqm, num_reads=10)
decoded_samples = model.decode_sampleset(sampleset)
best_sample = min(decoded_samples, key=lambda x: x.energy)
best_sample.sample # doctest: +SKIP
{'s1': 0, 's2': 0, 's3': 1, 's4': 0}
上記ではサンプラーを準備して、問題をBQMに変換。実行回数10回と一緒にサンプラーに問題をかけています。最後に最小値を出しています。
次にFixters Amplifyを見てみます。
インストールは、
pip install amplify
実行方法は、
# 入力モデルの構築
q = BinarySymbolGenerator().array(2)
f = 1 - q[0] * q[1]
実行マシンの設定
client = FixstarsClient()
アニーリングの実行
s = Solver(client)
result = s.solve(f)
values = result[0].values
結果の取得
solution = q.decode(values)
print(f"result: {q} = {solution}")
result: [q_0, q_1] = [1.1.]
このような手順になるようです。
こちらはソルバー込みのサービスなので、似たような感じですが、QUBOの作り方やソルバーへの投入がちょっと異なりますね。
同じページにベンチマークも書いてあります。
OpenJij
pip install openjij
利用方法
import openjij as oj
n = 10
h, J = {}, {}
for i in range(n-1):
for j in range(i+1, n):
J[i, j] = -1
sampler = oj.SASampler()
response = sampler.sample_ising(h, J, num_reads=100)
minimum energy state
print(response.first.sample)
{0: -1, 1: -1, 2: -1, 3: -1, 4: -1, 5: -1, 6: -1, 7: -1, 8: -1, 9: -1}
or
{0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1}
indices (labels) of state (spins)
print(response.indices)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
まとめ
擬似量子・イジングマシンは国内で業務応用への数理最適化の入り口となるようなコンシューマサービスのようを呈しています。これらを使うことで数理最適化の業務応用の適用のいい入り口になると思います。ソルバーに関してはすでに開発競争が始まっているようで、SDKは逆に少ない気がしました。引き続き使用例を広げるとともにユーザーや開発企業がどれだけ参入するかも大事になる気がします。以上です。