
الحوسبة الكمومية في Pytorch
أسرع وقابل للتطوير وسهل تصحيح الأخطاء وسهولة النشر على آلة حقيقية
محاكاة الحسابات الكمومية على الأجهزة الكلاسيكية باستخدام pytorch. وهو يدعم محاكاة StateVector ومحاكاة النبض على وحدات معالجة الرسومات. يمكن أن تصل إلى محاكاة 30+ Qubits مع وحدات معالجة الرسومات المتعددة.
الباحثون في تصميم الخوارزمية الكمومية ، التدريب على دائرة الكم المعلمة ، التحكم الكمومي الأمثل ، التعلم الآلي الكم ، الشبكات العصبية الكمومية.
الرسم البياني للحساب الديناميكي ، حساب التدرج التلقائي ، دعم 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) وطريقة kernel الكم ، والانحدار الكمومي.
بالنسبة للمستوى المتوسط ، يمكنك التحقق من ترميز السعة لـ MNIST و Clifford Gate QNN ، وتوفير وتحميل نماذج QNN ، وتشغيل Paulisum ، وكيفية تحويل TQ إلى Qiskit.
بالنسبة للخبير ، يمكنك التحقق من التدريب على المعلمة على الرقاقة ، وتقليم التدرج VQA ، و VQE ، و VQA للدولة المسبقة ، و QAOA (خوارزمية التحسين التقريبي الكمومي).
بناء نماذج الدائرة الكمومية المعلمة بسيطة مثل بناء نموذج 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. كمبيوتر Quito Quantum كما في البرنامج النصي simple_vqe.py:
cd examples / vqe
python vqe . py قم بتدريب دائرة كمية لأداء مهمة تصنيف MNIST ونشرها على الكمبيوتر الكمي IBM QUITO الحقيقي كما في MNIST_EXAMPLE.PY SCRIPT:
cd examples / mnist
python mnist . py | ملف | وصف |
|---|---|
| الأجهزة | فئة QuantumDevice التي تخزن StateVector |
| الترميز | ترميز الطبقات لتشفير القيم الكلاسيكية إلى المجال الكمي |
| الوظيفية | وظائف بوابة الكم |
| العوامل | فئات بوابة الكم |
| الطبقات | قوالب الطبقة مثل عشوائي |
| قياس | قياس الحالات الكمومية للحصول على القيم الكلاسيكية |
| Graph.py | الرسم البياني بوابة الكم المستخدم في الوضع الثابت |
| super_layer.py | قوالب الطبقة للدوائر الفائقة |
| الإضافات/Qiskit* | المحولون والمعالجات لسهولة النشر على IBMQ |
| أمثلة/ | المزيد من الأمثلة لتدريب نماذج QML و VQE |
يستخدم Torchquantum السنانير قبل الالتزام لضمان اتساق نمط Python ومنع الأخطاء الشائعة في قاعدة الشفرة الخاصة به.
لتمكينه خطافات مسبقة للالتزام ، يرجى إعادة إنتاج:
pip install pre-commit
pre-commit installconcurrent لـ Qiskit)منتدى 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 Ye
@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}
}