วิธีการนำ Quantum Circuit จาก Qiskit ไปลงบน Azure Quantum
วิธีการใช้งาน azure-quantum จาก Python package ในการนำ quantum circuit ที่สร้างด้วย Qiskit ไปลงบน Azure Quantum service
สามารถศึกษาวิธีการสร้าง quantum circuit เบื้องต้นได้ที่นี่: Quantum Circuit
สิ่งที่ต้องเตรียมก่อนเริ่มใช้งาน
- Azure Account สามารถไปสมัครได้ที่นี่: Create an Azure account for free
- Azure Quantum workspace ที่สามารถเลือกระหว่าง Honeywell หรือ IonQ (หรือทั้งคู่) ตามสถานการณ์ที่เรากำหนดเองได้
สามารถศึกษาวิธีการสร้างเบื้องต้นได้ที่นี่: Create an Azure Quantum workspace
3. ลง azure-quantum Python package เวอร์ชั่นล่าสุด
pip install — upgrade azure-quantum
4. ทำการเลือก code editor ที่ชื่นชอบหรือที่ใช้งาน Python ได้และเริ่มโค้ดกันเลย
Required Import
ทำการ import library ดังนี้
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.tools.monitor import job_monitor
from azure.quantum.qiskit import AzureQuantumProvider
เชื่อมต่อกับ Azure Quantum service
ในการเชื่อมต่อกับ Azure Quantum service โปรแกรมที่เขียนจะต้องมี resource ID และ location ของ Azure Quantum workspace ของคุณ
โดยสามารถล็อคอินไปที่ Azure account ของคุณที่เว็บ: Azure portal และไปที่ Azure Quantum workspace และ copy ค่าที่บอกไปข้างต้น (ตามสี่เหลี่ยมสีแดง)
วางค่าที่ copy มาลงบนโค้ดตามนี้ ที่จะสร้าง provider object ในการเชื่อมต่อกับ Azure Quantum workspace ของคุณ
provider = AzureQuantumProvider(
resource_id="",
location=""
)
แสดง backends ทั้งหมด
สามารถแสดง quantum computing backends ทั้งหมดที่สามารถใช้งานบน workspace ของคุณได้ดังนี้ :
print([backend.name() for backend in provider.backends()])
Output ที่ได้ :
['ionq.qpu', 'ionq.simulator', 'honeywell.hqs-lt-s1', 'honeywell.hqs-lt-s1-apival', 'honeywell.hqs-lt-s2', 'honeywell.hqs-lt-s2-apival', 'honeywell.hqs-lt-s1-sim']
Run a simple circuit
สามารถสร้าง Qiskit circuit เบื้องต้นได้ดังนี้ :
# 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()
Output ที่ได้ :
┌───┐ ┌─┐
q_0: ┤ H ├──■───────┤M├──────
└───┘┌─┴─┐ └╥┘┌─┐
q_1: ─────┤ X ├──■───╫─┤M├───
└───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
└───┘ ║ ║ └╥┘
c: 3/════════════════╩══╩══╩═
0 1 2
วิธีการให้ได้ผลลัพธ์ที่ไวยิ่งขึ้น สามารถใช้ provider.get_backend ในการสร้าง Backend ที่จะเชื่อมต่อกับ IonQ Simulator backend
simulator_backend = provider.get_backend("ionq.simulator")
สามารถ run โปรแกรมทาง Azure Quantum service และได้รับผลลัพธ์ตามที่ต้องการ ข้างล่างจะเป็นตัวอย่างการ runs circuit 100 shot
job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)
Output :
Job id 00000000-0000-0000-0000-000000000000
สามารถตรวจสอบความคืบหน้าการทำงานของงาน โดยใช้ job_monitor ที่ต้องใส่เข้ามาก่อนหน้านี้เพื่อติดตามสถานะของงาน
job_monitor(job)
Output :
Job Status: job has successfully run
ถ้าหากต้องการรองานให้เสร็จสิ้นและส่งคืนผลลัพธ์ได้ดังนี้ :
result = job.result()
ที่จะคืนค่าออกมาเป็น qiskit.Result
type(result)
Output :
qiskit.result.result.Result
สามารถแสดงผลลัพธ์ออกมาได้ดังนี้ :
print(result)
Output :
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'))])
สามารถใช้คำสั่งขอ Qiskit มาใช้งานได้ เช่น result.get_counts และ plot_histogram ในการแสดงผลลัพธ์ได้ เพื่อแสดงความเป็นไปได้ทั้งหมดของ bitstring และเพิ่มใน counts
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Output :
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0,
'110': 0, '111': 50}
คำนวณราคาของงาน
ก่อนที่จะนำงานของเราไปรันบน Quantum Processor Unit (QPU) ของจริง, คุณสามารถคำนวณราคาก่อนที่จะรันได้ โดยทำตามดังนี้ :
cost = (cost_1q * N_1q + cost_2q * N_2q) * num_shots
cost = max(cost, 1.0)
N_1q คือ จำนวนของ one-qubit gates, N_2q คือ จำนวนของ two-qubit gates,
cost_1q คือ ราคาของการรัน หนึ่ง one-qubit gate สำหรับ 1 shot,
cost_2q คือ ราคาของการรัน หนึ่ง two-qubit gate สำหรับ 1 shot,
num_shots คือ จำนวนของ shots ทั้งหมด
สามารถไปดูรายละเอียดราคาได้ที่ : IonQ Pricing
Run on IonQ QPU
สามารถเชื่อมต่อฮาร์ดแวร์จริง ๆ เพียงแค่ระบุชื่อของ provider ซึ่งในที่นี้จะเลือก IonQ โดยสามารถใช้คำสั่ง ionq.qpu ใน provider.get_backend method :
qpu_backend = provider.get_backend("ionq.qpu")
สามารถใช้ job_monitor ในการตรวจสอบ status และใช้ plot_histogram ในการ plot ผลลัพธ์
# Submit the circuit to run on Azure Quantum
qpu_job = qpu_backend.run(circuit, shots=1024)
job_id = qpu_job.id()
print("Job id", job_id)# Monitor job progress and wait until complete:
job_monitor(qpu_job)# Get the job results (this method also waits for the Job to complete):
result = qpu_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)
Output :
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}
เท่านี้ก็จะสามารถนำงานของเราไปรันบน QPU จริง ๆ บน Azure Quantum ได้ 😃
สรุป
สุดท้ายนี้นี่คือตัวอย่างเบื้องต้นในการนำ quantum circuit ที่ทำบน Qiskit ไป submit บน Azure Quantum ซึ่งในอนาคตของ Quantum Computing เป็นยังไง สามารถติดตามต่อได้ในบทความต่อๆไปได้เลยครับ
อ้างอิง
Quickstart: Submit a circuit with Qiskit to Azure Quantum