Help us understand the problem. What is going on with this article?

blueqatでいろいろベンチマークとってみる。最適化とかGPUとか。

はじめに

blueqatという量子コンピュータのSDKのアルゴリズムを動かすための速度をいろいろ調べてみます。最初は普通の回路、そのあとvqeというアルゴリズムなどやっていきます。

大概はランダムで角度がスタートし、それを最適化して行くのですが、ブラックボックス最適なりにパフォーマンスは計算時間に影響しますし、量子古典ハイブリッド計算のため将来的に本当に使えるのかどうか分からないのですが、みてみたいと思います。

まずはblueqat

blueqatSDKを使ってみます。

https://github.com/Blueqat/Blueqat

インストールは、

pip3 install blueqat

となっております。あとで、GPUのシミュレータも使ってみるために、そちらも準備しておきます。

!wget https://github.com/shinmorino/qgate/raw/gh-pages/packages/0.2/qgate-0.2.1-cp36-cp36m-manylinux1_x86_64.whl
!pip install qgate-0.2.1-cp36-cp36m-manylinux1_x86_64.whl blueqat

まずはblueqat自体のパフォーマンスをチェック

VQEは行列を準備するとその固有値の期待値を求めてくれる便利なアルゴリズムです。blueqatの場合には、最初からアルゴリズムが搭載されています。

from blueqat import Circuit
import time

最初にインポートしておきます。

start = time.time()
Circuit(20).h[:].m[:].run(shots=100)
end = time.time()
print(end - start)

こちらは20量子ビットの計算をしてみます。

41.963502407073975

結構かかりました。次はQgateのCPUモードです。

start = time.time()
Circuit(20).h[:].m[:].run(backend='qgate',shots=100)
end = time.time()
print(end - start)

結構早いです。

0.09378552436828613

次はQgateのGPUモードです。

start = time.time()
Circuit(20).h[:].m[:].run(backend='qgate', runtime='cuda', shots=100)
end = time.time()
print(end - start)

さすがプロ、早いです。

0.01861095428466797

ついでにblueqatのnumbaシミュレータ

start = time.time()
Circuit(20).h[:].m[:].run(backend='numba', shots=100)
end = time.time()
print(end - start)

Qgateほどではないですが、通常モードよりは早そうです。

3.994394302368164

次にVQE

こちらはVQEを読み込みます。

from blueqat import vqe

しかしここで問題が起きました。blueqatのシミュレータがvqeに最適化されていて、qgateと差が出過ぎたため実行不可です。。。代わりにnumbaバックエンドでやってみます。

from blueqat import vqe
from blueqat.pauli import qubo_bit as q

hamiltonian = q(0)*q(1)*q(2)*q(3)
step = 10

start = time.time()
result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run()
end = time.time()

print(end - start)

こちらはハミルトニアンを作ってvqeでstep = 10で実行します。

32.705730676651

次はハミルトニアンを少し変えて、stepを短くしてみます。

hamiltonian = q(0)*q(1)*q(2)*q(3)*q(4)*q(5)
step = 2

start = time.time()
result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run()
end = time.time()

print(end - start)

結果は、

16.99196743965149

numbaバックエンドを

from blueqat import BlueqatGlobalSetting
BlueqatGlobalSetting.set_default_backend('numba')
hamiltonian = q(0)*q(1)*q(2)*q(3)
step = 10

start = time.time()
result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run()
end = time.time()

print(end - start)

こちらは、

8.867603778839111

3-4倍近く出ました。次に、

hamiltonian = q(0)*q(1)*q(2)*q(3)*q(4)*q(5)
step = 2

start = time.time()
result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run()
end = time.time()

print(end - start)

こちらも

3.8892688751220703

こんなもんでしょうか。4倍程度です。

optimizerを変えてみる

vqeには最適化ステップがあるので、最適化手法を変えてみます。

scipy.optimize.minimizeから読まれるみたいなので、変えてみましょう。バックエンドはnumbaバックエンドのままやってみます。

まずは何もやらずの、最適化のシードやステップによって結果が変わるので、10回計算した平均をとってみます。

hamiltonian = q(0)*q(1)*q(2)
step = 5
res = []

for _ in range(10):
  start = time.time()
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

これは、

2.0820191144943236

本当は結果も大きく変わるんでしょうけど、今回は計算速度だけにしてます。

最適化

hamiltonian = q(0)*q(1)*q(2)
step = 5
res = []

#ここで最適化を決めます。
minimizer=vqe.get_scipy_minimizer(method="COBYLA")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 0.2520469903945923

比べてみる

いろいろやってみます。

minimizer=vqe.get_scipy_minimizer(method="Nelder-Mead")
#=> 0.610225772857666

minimizer=vqe.get_scipy_minimizer(method="Powell")
#=> 2.6399760007858277

minimizer=vqe.get_scipy_minimizer(method="CG")
#=> 0.24484691619873047

minimizer=vqe.get_scipy_minimizer(method="BFGS")
#=> 0.2359239339828491

minimizer=vqe.get_scipy_minimizer(method="L-BFGS-B")
#=> 0.1822584867477417

minimizer=vqe.get_scipy_minimizer(method="TNC")
#=> 0.6948606491088867

minimizer=vqe.get_scipy_minimizer(method="COBYLA")
#=> 0.25164554119110105

minimizer=vqe.get_scipy_minimizer(method="SLSQP")
#=> 0.13522324562072754

minimizer=vqe.get_scipy_minimizer(method="trust-constr")
#=> 0.5144646644592286

まとめ

今ままであんまり速度面を考えたことなかったのですが、さすがにいろいろ問題が解かれ始めてるので実機を含めて考慮してみたいと思いました。

mdrft
量子コンピュータのアプリケーション、ミドルウェア、ハードウェアをフルスタックで開発
https://mdrft.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした