
Квантовые вычисления в Pytorch
Быстрая, масштабируемая, легкая отладка, легкое развертывание на настоящей машине
Моделируйте квантовые вычисления на классическом оборудовании с использованием Pytorch. Он поддерживает моделирование государственного вектора и моделирование импульса на графических процессорах. Он может масштабироваться до моделирования 30+ кубитов с несколькими графическими процессорами.
Исследователи по проектированию квантового алгоритма, параметризованном обучении квантовой схемы, квантовому оптимальному управлению, квантовому машинному обучению, квантовым нейронным сетям.
График динамического вычисления, автоматическое вычисление градиента, быстрая поддержка графических процессоров, пакетная модель Терроризованной обработки.
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, как преобразовать TQ в цискит.
Для эксперта вы можете проверить сдвиг параметров в чип-обучение, обрезка градиента 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. Quito Quantum Computer, как в Simple_vqe.py Script:
cd examples / vqe
python vqe . py Тренируйте квантовую схему для выполнения задачи классификации MNIST и развертывания на реальном квантовом компьютере IBM Quito, как в сценарии mnist_example.py:
cd examples / mnist
python mnist . py | Файл | Описание |
|---|---|
| Devices.py | Класс QuantumDevice, который хранит вевер |
| Encoding.py | Кодирование слоев для кодирования классических значений в квантовый домен |
| функциональный.py | Квантовые функции затвора |
| Операторы.py | Квантовые классы ворот |
| Layers.py | Шаблоны слоев, такие как случайный слой |
| мера.py | Измерение квантовых состояний для получения классических значений |
| graph.py | График квантового затвора, используемый в статическом режиме |
| super_layer.py | Шаблоны слоя для суперцирков |
| плагины/цискит* | Конвертаторы и процессоры для легкого развертывания на 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}
}