
Pytorchの量子コンピューティング
より速く、スケーラブルで、簡単にデバッグされ、実際のマシンでの簡単な展開
Pytorchを使用して、クラシックハードウェアの量子計算をシミュレートします。 GPUのStatevectorシミュレーションとパルスシミュレーションをサポートします。複数のGPUを使用した30以上のキュービットのシミュレーションまでスケールアップできます。
量子アルゴリズム設計、パラメーター化された量子回路トレーニング、量子最適制御、量子機械学習、量子ニューラルネットワークに関する研究者。
動的計算グラフ、自動勾配計算、高速GPUサポート、バッチモデルテルソー化処理。
git clone https://github.com/mit-han-lab/torchquantum.git
cd torchquantum
pip install --editable . import torchquantum as tq
import torchquantum . functional as tqf
qdev = tq . QuantumDevice ( n_wires = 2 , bsz = 5 , device = "cpu" , record_op = True ) # use device='cuda' for GPU
# use qdev.op
qdev . h ( wires = 0 )
qdev . cnot ( wires = [ 0 , 1 ])
# use tqf
tqf . h ( qdev , wires = 1 )
tqf . x ( qdev , wires = 1 )
# use tq.Operator
op = tq . RX ( has_params = True , trainable = True , init_params = 0.5 )
op ( qdev , wires = 0 )
# print the current state (dynamic computation graph supported)
print ( qdev )
# obtain the qasm string
from torchquantum . plugin import op_history2qasm
print ( op_history2qasm ( qdev . n_wires , qdev . op_history ))
# measure the state on z basis
print ( tq . measure ( qdev , n_shots = 1024 ))
# obtain the expval on a observable by stochastic sampling (doable on simulator and real quantum hardware)
from torchquantum . measurement import expval_joint_sampling
expval_sampling = expval_joint_sampling ( qdev , 'ZX' , n_shots = 1024 )
print ( expval_sampling )
# obtain the expval on a observable by analytical computation (only doable on classical simulator)
from torchquantum . measurement import expval_joint_analytical
expval = expval_joint_analytical ( qdev , 'ZX' )
print ( expval )
# obtain gradients of expval w.r.t. trainable parameters
expval [ 0 ]. backward ()
print ( op . params . grad )
# Apply gates to qdev with tq.QuantumModule
ops = [
{ 'name' : 'hadamard' , 'wires' : 0 },
{ 'name' : 'cnot' , 'wires' : [ 0 , 1 ]},
{ 'name' : 'rx' , 'wires' : 0 , 'params' : 0.5 , 'trainable' : True },
{ 'name' : 'u3' , 'wires' : 0 , 'params' : [ 0.1 , 0.2 , 0.3 ], 'trainable' : True },
{ 'name' : 'h' , 'wires' : 1 , 'inverse' : True }
]
qmodule = tq . QuantumModule . from_op_history ( ops )
qmodule ( qdev )また、Torchquantumを使用して多くの例とチュートリアルを準備します。
開始レベルについては、QNNがMNIST、量子畳み込み(Quanvolution)および量子カーネル法、および量子回帰をチェックすることができます。
中間レベルの場合、Mnist、Clifford Gate QNNの振幅エンコード、QNNモデルの保存とロード、Paulisum Operation、TQをQiskitに変換する方法を確認できます。
エキスパートの場合、パラメーターシフトオンチップトレーニング、VQAグラデーションプルーニング、VQE、状態前処理のVQA、QAOA(QUANTUM近似最適化アルゴリズム)を確認できます。
通常のpytorchモデルを構築するのと同じように、パラメーター化された量子回路モデルを構築します。
import torch . nn as nn
import torch . nn . functional as F
import torchquantum as tq
import torchquantum . functional as tqf
class QFCModel ( nn . Module ):
def __init__ ( self ):
super (). __init__ ()
self . n_wires = 4
self . measure = tq . MeasureAll ( tq . PauliZ )
self . encoder_gates = [ tqf . rx ] * 4 + [ tqf . ry ] * 4 +
[ tqf . rz ] * 4 + [ tqf . rx ] * 4
self . rx0 = tq . RX ( has_params = True , trainable = True )
self . ry0 = tq . RY ( has_params = True , trainable = True )
self . rz0 = tq . RZ ( has_params = True , trainable = True )
self . crx0 = tq . CRX ( has_params = True , trainable = True )
def forward ( self , x ):
bsz = x . shape [ 0 ]
# down-sample the image
x = F . avg_pool2d ( x , 6 ). view ( bsz , 16 )
# create a quantum device to run the gates
qdev = tq . QuantumDevice ( n_wires = self . n_wires , bsz = bsz , device = x . device )
# encode the classical image to quantum domain
for k , gate in enumerate ( self . encoder_gates ):
gate ( qdev , wires = k % self . n_wires , params = x [:, k ])
# add some trainable gates (need to instantiate ahead of time)
self . rx0 ( qdev , wires = 0 )
self . ry0 ( qdev , wires = 1 )
self . rz0 ( qdev , wires = 3 )
self . crx0 ( qdev , wires = [ 0 , 2 ])
# add some more non-parameterized gates (add on-the-fly)
qdev . h ( wires = 3 )
qdev . sx ( wires = 2 )
qdev . cnot ( wires = [ 3 , 0 ])
qdev . qubitunitary ( wires = [ 1 , 2 ], params = [[ 1 , 0 , 0 , 0 ],
[ 0 , 1 , 0 , 0 ],
[ 0 , 0 , 0 , 1j ],
[ 0 , 0 , - 1j , 0 ]])
# perform measurement to get expectations (back to classical domain)
x = self . measure ( qdev ). reshape ( bsz , 2 , 2 )
# classification
x = x . sum ( - 1 ). squeeze ()
x = F . log_softmax ( x , dim = 1 )
return x VQEタスクを実行するために量子回路をトレーニングします。 simple_vqe.pyスクリプトのようにquito Quantumコンピューター:
cd examples / vqe
python vqe . py MNIST_EXAMPLE.PYスクリプトのように、MNIST分類タスクを実行するための量子回路をトレーニングし、実際のIBM Quito Quantum Computerに展開します。
cd examples / mnist
python mnist . py | ファイル | 説明 |
|---|---|
| devices.py | StateVectorを保存するQuantumdeviceクラス |
| encoding.py | レイヤーをエンコードして、古典的な値を量子ドメインにエンコードします |
| functional.py | 量子ゲート機能 |
| operators.py | 量子ゲートクラス |
| layers.py | ランダムレイヤーなどのレイヤーテンプレート |
| measure.py | 古典的な値を取得するための量子状態の測定 |
| Graph.py | 静的モードで使用されるQuantum Gateグラフ |
| super_layer.py | スーパーサーキット用のレイヤーテンプレート |
| プラグイン/Qiskit* | IBMQで簡単に展開するためのコンバーターとプロセッサ |
| 例/ | QMLおよびVQEモデルをトレーニングするためのその他の例 |
Torchquantumは、コミット前のフックを使用して、Pythonスタイルの一貫性を確保し、コードベースの一般的な間違いを防ぎます。
フックを事前にコミットすることを有効にするには、再現してください:
pip install pre-commit
pre-commit installconcurrentパッケージの問題がある場合があります)Torchquantumフォーラム
Hanrui Wang [email protected]
Jiannan Cao、Jessica Ding、Jiai Gu、Song Han、Zhirui Hu、Zirui Li、Zhiding Liang、Pengyu Liu、Yilian Liu、Mohammadreza Tavasoli、Hanrui Wang、Zhepeng Wang、Zhuoyang Yee
@inproceedings{hanruiwang2022quantumnas,
title = {Quantumnas: Noise-adaptive search for robust quantum circuits},
author = {Wang, Hanrui and Ding, Yongshan and Gu, Jiaqi and Li, Zirui and Lin, Yujun and Pan, David Z and Chong, Frederic T and Han, Song},
booktitle = {The 28th IEEE International Symposium on High-Performance Computer Architecture (HPCA-28)},
year = {2022}
}