Cara mengirimkan sirkuit dengan Cirq ke Azure Quantum
Pelajari cara mengirimkan sirkuit kuantum Cirq menggunakan azure-quantum
Python paket. Anda dapat mengirimkan sirkuit Cirq ke Azure Quantum menggunakan notebook Azure Quantum, yang memiliki paket bawaan azure-quantum
Python , atau dari komputer lokal Anda.
Untuk informasi selengkapnya, lihat Sirkuit kuantum.
Prasyarat
Untuk detail penginstalan, lihat Menginstal QDK di Visual Studio Code.
Ruang kerja Azure Quantum di langganan Azure Anda. Untuk membuat ruang kerja, lihat Membuat ruang kerja Azure Quantum.
Lingkungan Python dengan Python dan Pip terinstal.
Visual Studio Code dengan Ekstensi Azure Quantum Development Kit, Python, dan Jupyter terinstal.
Paket Azure Quantum
azure-quantum
dengan tag [cirq], danqsharp
danipykernel
paket.python -m pip install --upgrade azure-quantum[cirq] qsharp ipykernel
Catatan
Jika kernel
ipykernel
Jupyter Python tidak terdeteksi, VISUAL Code akan meminta Anda untuk menginstalnya.
Membuat Jupyter Notebook
- Di Visual Studio Code, pilih Tampilkan Palet Perintah dan pilih Buat: Notebook Jupyter > Baru.
- Di kanan atas, Visual Studio Code akan mendeteksi dan menampilkan versi Python dan lingkungan virtual Python yang dipilih untuk buku catatan. Jika Anda memiliki beberapa Python lingkungan, Anda mungkin perlu memilih kernel menggunakan pemilih kernel di kanan atas. Jika tidak ada lingkungan yang terdeteksi, lihat Jupyter Notebooks di VISUAL Code untuk informasi penyiapan.
Memuat impor yang diperlukan
Di sel pertama buku catatan Anda, jalankan kode berikut untuk memuat impor yang diperlukan:
import azure.quantum
from azure.quantum.cirq import AzureQuantumService
Menyambungkan ke layanan Azure Quantum
Untuk dapat tersambung ke layanan Azure Quantum, program Anda memerlukan ID sumber daya dan lokasi ruang kerja Azure Quantum Anda.
Masuk ke akun Azure Anda, https://portal.azure.com,
Pilih ruang kerja Azure Quantum Anda, dan navigasikan ke Gambaran Umum.
Salin parameter di bidang .
Tambahkan sel baru dan gunakan informasi akun Anda untuk membuat Workspace
dan AzureQuantumService
objek untuk menyambungkan ke ruang kerja Azure Quantum Anda.
workspace = Workspace(
resource_id = "", # Add the resourceID of your workspace
location = "" # Add the location of your workspace (for example "westus")
)
service = AzureQuantumService(workspace)
Cantumkan semua targets
targets()
Gunakan metode untuk mencantumkan targets semua di ruang kerja Anda yang dapat menjalankan sirkuit Anda, termasuk waktu dan ketersediaan antrean saat ini.
Catatan
targets Semua di ruang kerja Anda mungkin tidak tercantum - hanya targets yang dapat menerima sirkuit Cirq atau OpenQASM yang akan tercantum di sini.
print(service.targets())
[<Target name="quantinuum.qpu.h1-1", avg. queue time=0 s, Degraded>,
<Target name="quantinuum.sim.h1-1sc", avg. queue time=1 s, Available>,
<Target name="quantinuum.sim.h1-1e", avg. queue time=40 s, Available>,
<Target name="ionq.simulator", avg. queue time=3 s, Available>,
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>]
Membuat sirkuit sederhana
Selanjutnya, buat sirkuit Cirq sederhana untuk dijalankan. Sirkuit ini menggunakan akar kuadrat dari gerbang X, asli dari sistem perangkat keras IonQ.
import cirq
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
cirq.X(q0)**0.5, # Square root of X
cirq.CX(q0, q1), # CNOT
cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
│ │
1: ───────────X───M────────
target Pilih untuk menjalankan program Anda
Jalankan pada simulator IonQ
Anda sekarang dapat menjalankan program melalui layanan Azure Quantum dan mendapatkan hasilnya. Sel berikut mengirimkan pekerjaan (ke simulator IonQ default) yang menjalankan sirkuit dengan 100 bidikan, menunggu sampai pekerjaan selesai, dan mengembalikan hasilnya.
result = service.run(program=circuit, repetitions=100, target="ionq.simulator")
Langkah ini akan memunculkan objek cirq.Result
.
print(result)
b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010
Memperkirakan biaya pekerjaan
Sebelum menjalankan pekerjaan di QPU, Anda harus memperkirakan berapa biaya yang harus dijalankan.
Untuk detail harga terbaru, lihat Harga IonQ, atau temukan ruang kerja Anda dan lihat opsi harga di tab "Penyedia" ruang kerja melalui: aka.ms/aq/myworkspaces.
Menjalankan di IonQ QPU
Pekerjaan sebelumnya berjalan di simulator default, "ionq.simulator"
. Namun, Anda juga dapat menjalankannya pada prosesor perangkat keras IonQ (Quantum Processor Unit (QPU)). Untuk berjalan di QPU IonQ, berikan "ionq.qpu.aria-1"
sebagai target
argumen:
result = service.run(
program=circuit,
repetitions=100,
target="ionq.qpu.aria-1",
timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)
Sekali lagi, cara ini akan menampilkan objek cirq.Result
.
print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111
Model asinkron menggunakan Jobs
Untuk sirkuit yang berjalan lama, dapat berguna untuk menjalankannya secara asinkron.
Metode ini service.create_job
mengembalikan objek Job
, yang dapat Anda gunakan untuk mendapatkan hasil setelah pekerjaan berjalan dengan sukses.
job = service.create_job(
program=circuit,
repetitions=100,
target="ionq.simulator"
)
Untuk memeriksa status pekerjaan, gunakan job.status()
:
print(job.status())
'completed'
Untuk menunggu pekerjaan selesai dan kemudian mendapatkan hasilnya, gunakan panggilan pemblokiran job.results()
:
result = job.results()
print(result)
00: 0.5
11: 0.5
Perhatikan bahwa cara ini tidak akan menampilkan objek cirq.Result
. Sebaliknya, fungsi tersebut akan menampilkan objek hasil yang khusus untuk simulator IonQ dan menggunakan probabilitas status, daripada data bidikan.
type(result)
cirq_ionq.results.SimulatorResult
Untuk mengubah ini menjadi objek cirq.Result
, gunakan result.to_cirq_result()
:
print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100
Prasyarat
- Akun Azure dengan langganan aktif. Jika Anda tidak memiliki akun Azure, daftarkan secara gratis dan daftar untuk langganan prabayar.
- Ruang kerja Azure Quantum. Untuk informasi selengkapnya, lihat Buat ruang kerja Azure Quantum.
Membuat buku catatan baru di ruang kerja Anda
- Masuk ke portal Azure lalu pilih ruang kerja dari langkah sebelumnya.
- Di panel kiri, pilih Notebook.
- Klik Notebook Saya lalu klik Tambahkan Baru.
- Ketik nama untuk file, misalnya Cirq.ipynb, lalu klik Buat file.
Saat buku catatan baru Anda terbuka, buku catatan akan secara otomatis membuat kode untuk sel pertama, berdasarkan informasi langganan dan ruang kerja Anda.
from azure.quantum import Workspace
workspace = Workspace (
resource_id = "", # Add your resource_id
location = "" # Add your workspace location (for example, "westus")
)
Catatan
Kecuali dinyatakan lain, Anda harus menjalankan setiap sel saat Anda membuatnya untuk menghindari masalah kompilasi.
Klik ikon segitiga "putar" di sebelah kiri sel untuk menjalankan kode.
Memuat impor yang diperlukan
Pertama, Anda harus mengimpor modul tambahan.
Klik + Kode untuk menambahkan sel baru, lalu tambahkan dan jalankan kode berikut:
from azure.quantum.cirq import AzureQuantumService
Menyambungkan ke layanan Azure Quantum
Selanjutnya, buat AzureQuantumService
objek menggunakan workspace
objek dari sel sebelumnya untuk menyambungkan ke ruang kerja Azure Quantum Anda. Tambahkan sel baru dengan kode berikut:
provider = AzureQuantumService(workspace)
Menentukan sirkuit sederhana
Selanjutnya, buat sirkuit Cirq sederhana untuk dijalankan. Sirkuit ini menggunakan akar kuadrat dari gerbang X, asli dari sistem perangkat keras IonQ.
import cirq
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
cirq.X(q0)**0.5, # Square root of X
cirq.CX(q0, q1), # CNOT
cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
│ │
1: ───────────X───M────────
Cantumkan semua targets
targets()
Gunakan metode untuk mencantumkan targets semua di ruang kerja Anda yang dapat menjalankan sirkuit Anda, termasuk waktu dan ketersediaan antrean saat ini.
Catatan
targets Semua di ruang kerja Anda mungkin tidak tercantum - hanya targets yang dapat menerima sirkuit Cirq atau OpenQASM yang akan tercantum di sini.
print("This workspace's targets:")
for target in service.targets():
print(target)
This workspace's targets:
<Target name="quantinuum.qpu.h1-1", avg. queue time=0 s, Degraded>
<Target name="quantinuum.sim.h1-1sc", avg. queue time=1 s, Available>
<Target name="quantinuum.sim.h1-1e", avg. queue time=40 s, Available>
<Target name="ionq.simulator", avg. queue time=3 s, Available>
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>
Catatan
Daftar target lengkap mungkin berbeda untuk ruang kerja Anda.
target Pilih untuk menjalankan program Anda
Jalankan di simulator IonQ
Untuk memeriksa sirkuit Anda sebelum menjalankannya di perangkat keras kuantum yang sebenarnya, Anda dapat menggunakan simulator IonQ, ionq.simulator
.
Sel berikut mengirimkan pekerjaan yang menjalankan sirkuit dengan 100 bidikan, menunggu sampai pekerjaan selesai, dan menampilkan hasilnya.
result = service.run(
program=circuit,
repetitions=100,
target="ionq.simulator"
)
Langkah ini akan memunculkan objek cirq.Result
.
print(result)
b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010
Anda dapat merencanakan hasilnya dalam histogram:
import pylab as pl
pl.hist(result.data)
pl.ylabel("Counts")
pl.xlabel("Result")
Memperkirakan biaya pekerjaan
Sebelum menjalankan pekerjaan pada perangkat keras kuantum aktual , atau unit pemrosesan kuantum (QPU), Anda harus memperkirakan berapa banyak biaya yang akan dijalankan.
Untuk detail harga terbaru, lihat Harga IonQ, atau lihat opsi harga di bilah Penyedia ruang kerja Anda. Untuk melihat status dan penggunaan kredit Anda saat ini, pilih Kredit dan kuota.
Menjalankan di IonQ QPU
Pekerjaan sebelumnya berjalan di simulator default, ionq.simulator
. Namun, Anda juga dapat menjalankannya pada prosesor perangkat keras IonQ, atau Quantum Processor Unit (QPU). Untuk berjalan di QPU IonQ, berikan ionq.qpu.aria-1
sebagai target
argumen:
result = service.run(
program=circuit,
repetitions=100,
target="ionq.qpu.aria-1",
timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)
Catatan
Waktu yang diperlukan untuk menjalankan sirkuit pada QPU bergantung pada waktu antrean saat ini. Anda dapat melihat waktu antrean rata-rata untuk a target dengan memilih bilah Penyedia ruang kerja Anda.
Sekali lagi, cara ini akan menampilkan objek cirq.Result
.
print(result)
b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010
Model asinkron menggunakan Jobs
Untuk sirkuit yang berjalan lama, dapat berguna untuk menjalankannya secara asinkron.
Metode ini service.create_job
mengembalikan objek Job
, yang dapat Anda gunakan untuk mendapatkan hasil setelah pekerjaan berjalan dengan sukses.
job = service.create_job(
program=circuit,
repetitions=100,
target="ionq.simulator"
)
Untuk memeriksa status pekerjaan, gunakan job.status()
:
print(job.status())
'completed'
Untuk menunggu pekerjaan selesai dan kemudian mendapatkan hasilnya, gunakan panggilan pemblokiran job.results()
:
result = job.results()
print(result)
00: 0.5
11: 0.5
Catatan
Fungsi job.results()
tidak akan menampilkan objek cirq.Result
. Sebaliknya, fungsi tersebut akan menampilkan objek hasil yang khusus untuk simulator IonQ dan menggunakan probabilitas status, daripada data bidikan.
type(result)
cirq_ionq.results.SimulatorResult
Untuk mengubah ini menjadi objek cirq.Result
, gunakan result.to_cirq_result()
:
print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100
Penting
Mengirimkan beberapa sirkuit pada satu pekerjaan saat ini tidak didukung. Sebagai solusinya, Anda dapat memanggil backend.run
metode untuk mengirimkan setiap sirkuit secara asinkron, lalu mengambil hasil setiap pekerjaan. Contohnya:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())