
การคำนวณควอนตัมใน pytorch
เร็วขึ้นปรับขนาดได้ง่ายการดีบักการปรับใช้ง่าย ๆ บนเครื่องจริง
จำลองการคำนวณควอนตัมบนฮาร์ดแวร์คลาสสิกโดยใช้ pytorch รองรับการจำลองแบบสเต็ปเตอร์และการจำลองพัลส์บน GPU มันสามารถปรับขนาดได้ถึงการจำลอง 30+ qubits ด้วย GPU หลายตัว
นักวิจัยเกี่ยวกับการออกแบบอัลกอริทึมควอนตัม, การฝึกอบรมวงจรควอนตัมพารามิเตอร์, การควบคุมที่ดีที่สุดควอนตัม, การเรียนรู้ของเครื่องควอนตัม, เครือข่ายประสาทควอนตัม
กราฟการคำนวณแบบไดนามิก, การคำนวณการไล่ระดับสีอัตโนมัติ, การสนับสนุน 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, Quantum Convolution (quanvolution) และวิธีเคอร์เนลควอนตัมและการถดถอยควอนตัม
สำหรับ ระดับกลาง คุณสามารถตรวจสอบการเข้ารหัสแอมพลิจูดสำหรับ 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 Computer เช่นเดียวกับ Simple_vqe.py Script:
cd examples / vqe
python vqe . py ฝึกอบรมวงจรควอนตัมเพื่อดำเนินการจัดหมวดหมู่ MNIST และปรับใช้กับคอมพิวเตอร์ควอนตัม IBM Quito จริงเช่นเดียวกับใน mnist_example.py script:
cd examples / mnist
python mnist . py | ไฟล์ | คำอธิบาย |
|---|---|
| อุปกรณ์. py | คลาส QuantumDevice ซึ่งเก็บ StateVector |
| encoding.py | การเข้ารหัสเลเยอร์เพื่อเข้ารหัสค่าคลาสสิกไปยังโดเมนควอนตัม |
| functional.py | ฟังก์ชั่นเกตควอนตัม |
| operators.py | คลาสเกตควอนตัม |
| Layers.py | เทมเพลตเลเยอร์เช่น RandomLayer |
| measure.py | การวัดสถานะควอนตัมเพื่อให้ได้ค่าคลาสสิก |
| graph.py | กราฟเกตควอนตัมที่ใช้ในโหมดคงที่ |
| super_layer.py | เทมเพลตเลเยอร์สำหรับ supercircuits |
| ปลั๊กอิน/qiskit* | ตัวแปลงและโปรเซสเซอร์เพื่อให้ง่ายต่อการปรับใช้บน IBMQ |
| ตัวอย่าง/ | ตัวอย่างเพิ่มเติมสำหรับการฝึกอบรมรุ่น QML และ VQE |
Torchquantum ใช้ตะขอล่วงหน้าเพื่อให้แน่ใจว่าสไตล์ Python มีความสอดคล้องและป้องกันข้อผิดพลาดทั่วไปใน codebase
หากต้องการเปิดใช้งานตะขอล่วงหน้าโปรดทำซ้ำ:
pip install pre-commit
pre-commit installconcurrent สำหรับ qiskit)ฟอรัม Torchquantum
hanrui wang [email protected]
Jiannan Cao, Jessica Ding, Jiai Gu, เพลง Han, Zhirui Hu, Zirui Li, Zhiding Liang, Pengyu Liu, Yilian Liu, Mohammadreza Tavasoli, Hanrui Wang, Zhepeng Wang, Zhuoyang
@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}
}