Cara mengirimkan sirkuit dengan Qiskit ke Azure Quantum

Pelajari cara mengirimkan sirkuit kuantum Qiskit menggunakan azure-quantumPython paket . Anda dapat mengirimkan sirkuit Qiskit ke Azure Quantum menggunakan notebook Azure Quantum, yang memiliki paket bawaan azure-quantumPython , atau dari komputer lokal Anda.

Untuk informasi selengkapnya, lihat Sirkuit kuantum.

Catatan

Microsoft Quantum Development Kit (Classic QDK) tidak akan lagi didukung setelah 30 Juni 2024. Jika Anda adalah pengembang QDK yang sudah ada, kami sarankan Anda beralih ke Azure Quantum Development Kit (Modern QDK) baru untuk terus mengembangkan solusi kuantum. Untuk informasi selengkapnya, lihat Memigrasikan kode Q# Anda ke QDK Modern.

Prasyarat

Untuk detail penginstalan, lihat Menginstal QDK Modern 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 Azure Quantum Development Kit, Python, dan ekstensi Jupyter terinstal.

  • Paket Azure Quantum azure-quantum dengan tag [qiskit], dan qsharp dan ipykernel paket.

    python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel 
    

    Catatan

    Jika kernel ipykernel Jupyter Python tidak terdeteksi, Visual Studio Code akan meminta Anda untuk menginstalnya.

Membuat Jupyter Notebook

  1. Di Visual Studio Code, pilih Tampilkan > palet Perintah dan pilih Buat: Jupyter Notebook 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 Studio 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 qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider

Menyambungkan ke layanan Azure Quantum

Untuk menyambungkan ke layanan Azure Quantum, Anda memerlukan ID sumber daya dan lokasi ruang kerja Azure Quantum Anda. Masuk ke akun Azure Anda, https://portal.azure.com, navigasikan ke ruang kerja Azure Quantum Anda, dan salin nilai dari header.

Cara mengambil ID sumber daya dan lokasi dari ruang kerja Azure Quantum

Tambahkan sel baru dan gunakan informasi akun Anda untuk membuat Workspace objek dan AzureQuantumProvider 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")
    )

provider = AzureQuantumProvider(workspace)

Mencantumkan semua backend

Anda sekarang dapat mencetak semua backend komputasi kuantum yang tersedia di ruang kerja Anda:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.qpu.aria-1
- ionq.simulator
- microsoft.estimator
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- quantinuum.hqs-lt-s2-sim
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

Menjalankan sirkuit sederhana

Pertama, buat sirkuit Qiskit sederhana untuk dijalankan.

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0,1,2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

Pilih untuk target menjalankan program Anda

Jalankan di simulator IonQ

Sebelum berjalan pada perangkat keras nyata, mari kita uji sirkuit di simulator. Gunakan get_backend untuk membuat Backend objek untuk menyambungkan ke backend Simulator IonQ:

simulator_backend = provider.get_backend("ionq.simulator")

Backend IonQ mendukung gerbang dari set gerbang yang ditentukan dan dikompilasi agar dapat berjalan secara optimal di perangkat keras. Jika sirkuit Anda berisi gerbang yang tidak ada dalam daftar ini, Anda perlu menerjemahkan ke dalam yang didukung gateset menggunakan transpile fungsi yang disediakan oleh Qiskit:

from qiskit import transpile
circuit = transpile(circuit, simulator_backend)

Fungsi transpile mengembalikan objek sirkuit baru di mana gerbang diurai menjadi gerbang yang didukung pada backend yang ditentukan.

Anda sekarang dapat menjalankan program melalui layanan Azure Quantum dan mendapatkan hasilnya. Sel berikut mengirimkan pekerjaan yang menjalankan sirkuit dengan 100 bidikan:

job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)
Job id 00000000-0000-0000-0000-000000000000

Untuk menunggu sampai pekerjaan selesai dan mengembalikan hasilnya, jalankan:

result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 50, '111': 50}, probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])

Karena hasilnya adalah objek asli paket Qiskit, Anda dapat menggunakan Qiskit result.get_counts dan plot_histogram untuk memvisualisasikan hasilnya. Untuk memastikan bahwa semua kemungkinan label bitstring diwakili, tambahkan ke counts.

counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}

Hasil sirkuit Qiskit pada Simulator IonQ

Memperkirakan biaya pekerjaan

Sebelum menjalankan pekerjaan di QPU, Anda dapat memperkirakan berapa biaya yang harus dijalankan. Untuk memperkirakan biaya menjalankan pekerjaan di QPU, Anda dapat menggunakan metode estimate_cost ini:

backend = provider.get_backend("ionq.qpu")
cost = backend.estimate_cost(circuit, shots=1024)

print(f"Estimated cost: {cost.estimated_total}")

Langkah ini akan mencetak perkiraan biaya dalam USD.

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

Untuk terhubung ke perangkat keras nyata ( Unit Prosesor Kuantum (QPU)), cukup berikan nama target"ionq.qpu" ke get_backend metode :

qpu_backend = provider.get_backend("ionq.qpu")

Kirim sirkuit untuk dijalankan di Azure Quantum, dapatkan hasilnya, dan jalankan plot_histogram untuk memplot hasilnya.

Catatan

Waktu yang diperlukan untuk menjalankan sirkuit di QPU dapat bervariasi bergantung pada waktu antrean saat ini.

# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)

# Get the job results (this method waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}

Hasil sirkuit Qiskit pada IonQ QPU

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 dari setiap pekerjaan. Contohnya:

jobs = []
for circuit in circuits:
    jobs.append(backend.run(circuit, shots=N))

results = []
for job in jobs:
    results.append(job.result())

Prasyarat

Membuat buku catatan baru di ruang kerja Anda

  1. Masuk ke portal Azure lalu pilih ruang kerja yang Anda buat di langkah sebelumnya.
  2. Di panel kiri, pilih Notebook.
  3. Klik Notebooks Saya lalu klik Tambahkan Baru.
  4. Ketik nama untuk file, misalnya Qiskit.ipynb, lalu klik Buat file.

Saat buku catatan baru Anda terbuka, buku catatan 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 agar Anda membuatnya untuk menghindari masalah kompilasi.

Klik ikon segitiga "putar" di sebelah kiri sel untuk menjalankan kode.

Muat impor yang diperlukan

Pertama, Anda perlu mengimpor beberapa modul tambahan.

Klik + Kode untuk menambahkan sel baru, lalu tambahkan dan jalankan kode berikut:

from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider

Menyambungkan ke layanan Azure Quantum

Selanjutnya, buat AzureQuantumProvider objek menggunakan Workspace objek dari sel sebelumnya untuk menyambungkan ke ruang kerja Azure Quantum Anda. Tambahkan sel baru dengan kode berikut:

provider = AzureQuantumProvider(workspace)

Definisikan sirkuit sederhana

Di sel baru, buat objek circuit. Contoh ini adalah generator bit acak kuantum sederhana. Tambahkan kode berikut untuk menentukan dan menampilkan sirkuit:

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0, 1, 2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

Cantumkan semua targets

Anda sekarang dapat menampilkan semua komputasi targetskuantum, atau backend, yang tersedia di ruang kerja Anda. Tambahkan sel baru dan jalankan baris berikut:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

target Pilih untuk menjalankan program Anda

Untuk memeriksa kode Anda sebelum menjalankannya di perangkat keras kuantum yang sebenarnya, Anda dapat menggunakan simulator kuantum IonQ, ionq.simulator.

Tambahkan sel baru dan buat objek untuk mewakili simulator targetkuantum IonQ :

# Get IonQ quantum simulator target:
simulator_backend = provider.get_backend("ionq.simulator")

Jalankan di simulator IonQ

Untuk menjalankan sirkuit Anda pada simulator, tambahkan kode berikut. Contoh ini menggunakan run metode target untuk mengirimkan pekerjaan Anda, lalu memantau status pekerjaan.

# Submit the circuit to run on Azure Quantum
job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)

Ketika pekerjaan berhasil berjalan, dapatkan hasil pekerjaan dan tampilkan:

# Get the job results:
result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='7d909574-98d4-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts=defaultdict(<class 'int'>, {'000': 50, '111': 50}), probabilities=defaultdict(<class 'int'>, {'000': 0.5, '111': 0.5})), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])

Karena jenis result ini adalah objek native ke paket Qiskit, Anda dapat menggunakan result.get_counts dan plot_histogram Qiskit untuk memvisualisasikan hasilnya. Untuk memastikan bahwa semua kemungkinan label bitstring diwakili, tambahkan ke counts.

counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}

Hasil sirkuit Qiskit pada Simulator IonQ

Memperkirakan biaya pekerjaan

Sebelum menjalankan pekerjaan pada perangkat keras kuantum aktual, atau unit pemrosesan kuantum (QPU), Anda dapat memperkirakan berapa biayanya untuk dijalankan.

Pertama, dapatkan daftar penyedia yang tersedia lagi:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

Selanjutnya, buat objek untuk mewakili komputer kuantum IonQ:

qpu_backend = provider.get_backend("ionq.qpu")

Untuk memperkirakan biaya menjalankan pekerjaan di QPU, tambahkan dan jalankan sel baru menggunakan estimate_cost metode target:

cost = qpu_backend.estimate_cost(circuit, shots=100)

print(f"Estimated cost: {cost.estimated_total}")

Ini menampilkan perkiraan biaya dalam USD.

Untuk detail harga terbaru, lihat Harga IonQ, atau temukan ruang kerja Anda dan lihat opsi harga di panel Penyedia ruang kerja Anda.

Jalankan di IonQ QPU

Setelah Anda berhasil menjalankan pekerjaan Anda pada simulator IonQ dan memperkirakan biaya QPU, saatnya untuk menjalankan sirkuit Anda pada perangkat keras.

Catatan

Waktu yang diperlukan untuk menjalankan sirkuit di QPU dapat bervariasi bergantung pada waktu antrean saat ini. Anda dapat melihat waktu antrean rata-rata untuk dengan target memilih bilah Penyedia ruang kerja Anda.

Gunakan metode dan operasi run yang sama seperti yang telah Anda gunakan sebelumnya dengan API Validator untuk mengirimkan dan memantau pekerjaan Anda:

# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)

Setelah pekerjaan selesai, dapatkan hasil pekerjaan seperti sebelumnya dan tampilkan dalam bagan:

result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 910b5ac8-98cd-11ec-b3ba-00155d5528cf
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='Job id 54e8c740-98d9-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}

Hasil sirkuit Qiskit pada IonQ QPU

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())

Langkah berikutnya