Bagikan melalui


Cara mengirimkan sirkuit dengan Cirq ke Azure Quantum

Pelajari cara mengirimkan sirkuit kuantum Cirq menggunakan azure-quantumPython paket. Anda dapat mengirimkan sirkuit Cirq ke Azure Quantum menggunakan notebook Azure Quantum, yang memiliki paket bawaan azure-quantumPython , 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], dan qsharp dan ipykernel 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

  1. Di Visual Studio Code, pilih Tampilkan Palet Perintah dan pilih Buat: Notebook Jupyter > Baru.
  2. 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.

  1. Masuk ke akun Azure Anda, https://portal.azure.com,

  2. Pilih ruang kerja Azure Quantum Anda, dan navigasikan ke Gambaran Umum.

  3. Salin parameter di bidang .

    Cuplikan layar Visual Studio Code memperlihatkan cara memperluas panel gambaran umum Ruang Kerja Quantum Anda.

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

  1. Masuk ke portal Azure lalu pilih ruang kerja dari langkah sebelumnya.
  2. Di panel kiri, pilih Notebook.
  3. Klik Notebook Saya lalu klik Tambahkan Baru.
  4. 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())