Qiskit를 사용하여 회로를 Azure Quantum에 제출하는 방법

패키지를 사용하여 Qiskit 양자 회로를 제출하는 방법을 알아봅니다 azure-quantumPython . 기본 제공 패키지가 있는 Azure Quantum Notebook을 사용하거나 로컬 컴퓨터에서 Qiskit 회로를 Azure Quantum에 azure-quantumPython 제출할 수 있습니다.

자세한 내용은 양자 회로를 참조하세요.

참고

Microsoft Quantum Development Kit(클래식 QDK)는 2024년 6월 30일 이후에 더 이상 지원되지 않습니다. 기존 QDK 개발자인 경우 새로운 Azure Quantum Development Kit(최신 QDK) 로 전환하여 양자 솔루션을 계속 개발하는 것이 좋습니다. 자세한 내용은 Q# 코드를 최신 QDK로 마이그레이션을 참조하세요.

사전 요구 사항

설치 세부 정보는 VS Code에 최신 QDK 설치를 참조하세요.

  • Azure 구독의 Azure Quantum 작업 영역. 작업 영역을 만들려면 Azure Quantum 작업 영역 만들기를 참조하세요.

  • Python및 Pip가Python 설치된 환경입니다.

  • Azure Quantum 개발 키트, PythonJupyter 확장이 설치된 VS Code.

  • [qiskit] 태그와 및 패키지가 qsharpipykernel 있는 Azure Quantum azure-quantum 패키지입니다.

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

    참고

    Jupyter Python 커널 ipykernel 이 검색되지 않으면 VS Code에서 설치하라는 메시지가 표시됩니다.

새 Jupyter Notebook 만들기

  1. VS Code에서 명령 팔레트 보기를 > 선택하고 만들기: 새 Jupyter Notebook 선택합니다.
  2. 오른쪽 위에서 VS Code는 Notebook에 대해 선택된 및 가상 Python 환경의 Python 버전을 검색하고 표시합니다. 여러 Python 환경이 있는 경우 오른쪽 위에 있는 커널 선택기를 사용하여 커널을 선택해야 할 수 있습니다. 환경이 검색되지 않은 경우 VS Code의 Jupyter Notebooks에서 설정 정보를 참조하세요.

필요한 가져오기 로드

Notebook의 첫 번째 셀에서 다음 코드를 실행하여 필요한 가져오기를 로드합니다.

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

Azure Quantum 서비스에 연결

Azure Quantum 서비스에 연결하려면 리소스 ID와 Azure Quantum 작업 영역의 위치가 필요합니다. Azure 계정 https://portal.azure.com에 로그인하여 Azure Quantum 작업 영역으로 이동하고, 헤더의 값을 복사합니다.

Azure Quantum 작업 영역에서 리소스 ID 및 위치를 검색하는 방법

새 셀을 추가하고 계정 정보를 사용하여 만들고 WorkspaceAzureQuantumProvider 개체를 사용하여 Azure Quantum 작업 영역에 연결합니다.

workspace = Workspace(  
    resource_id = "", # Add the resourceID of your workspace
    location = "" # Add the location of your workspace (for example "westus")
    )

provider = AzureQuantumProvider(workspace)

모든 백 엔드 나열

이제 작업 영역에서 사용할 수 있는 모든 양자 컴퓨팅 백 엔드를 출력할 수 있습니다.

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

간단한 회로 실행

먼저, 실행할 간단한 Qiskit 회로를 만듭니다.

# 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 

프로그램을 실행할 을 선택합니다.target

IonQ 시뮬레이터에서 실행

실제 하드웨어에서 실행하기 전에 시뮬레이터에서 회로를 테스트해 보겠습니다. 를 사용하여 get_backend IonQ 시뮬레이터 백 엔드에 연결할 개체를 만듭니 Backend 다.

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

IonQ 백 엔드는 하드웨어에서 최적으로 실행되도록 컴파일되는 정의된 게이트 집합의 게이트를 지원합니다. 회로에 이 목록에 없는 게이트가 포함된 경우 Qiskit에서 제공하는 함수를 사용하여 transpile 지원되는 gateset 로 전환해야 합니다.

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

transpile 함수는 지정된 백 엔드에서 지원되는 게이트로 게이트가 분해되는 새 회로 개체를 반환합니다.

이제 Azure Quantum 서비스를 통해 프로그램을 실행하고 결과를 가져올 수 있습니다. 다음 셀은 100샷으로 회로를 실행하는 작업을 제출합니다.

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

작업이 완료될 때까지 기다린 후 결과를 반환하려면 다음을 실행합니다.

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'))])

결과는 Qiskit 패키지의 네이티브 개체이므로 Qiskit의 result.get_countsplot_histogram을 사용하여 결과를 시각화할 수 있습니다. 가능한 모든 bitstring 레이블이 표시되는지 확인하기 위해 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}

IonQ 시뮬레이터의 Qiskit 회로 결과

작업 비용 예측

QPU에서 작업을 실행하기 전에 실행하는 데 드는 비용을 예측할 수 있습니다. QPU에서 작업을 실행하는 비용을 예측하기 위해 estimate_cost 메서드를 사용할 수 있습니다.

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

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

그러면 예상 비용이 USD로 출력됩니다.

최신 가격 책정 세부 정보는 IonQ 가격 책정을 참조하거나 aka.ms/aq/myworkspaces에서 작업 영역을 찾은 다음, 작업 영역의 "공급자" 탭에서 가격 책정 옵션을 확인합니다.

IonQ QPU에서 실행

실제 하드웨어(QPU( Quantum Processor Unit ))에 연결하려면 메서드에 의 target"ionq.qpu"get_backend 이름을 제공하기만 하면 됩니다.

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

회로를 제출하여 Azure Quantum에서 실행하고, 결과를 가져오고, 를 실행 plot_histogram 하여 결과를 표시합니다.

참고

QPU에서 회로를 실행하는 데 필요한 시간은 현재 큐 시간에 따라 다를 수 있습니다.

# 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}

IonQ QPU의 Qiskit 회로 결과

중요

단일 작업에서 여러 회로 제출은 현재 지원되지 않습니다. 해결 방법으로, 메서드를 backend.run 호출하여 각 회로를 비동기적으로 제출한 다음, 각 작업의 결과를 가져올 수 있습니다. 예:

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

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

사전 요구 사항

작업 영역에서 새 Notebook 만들기

  1. Azure Portal에 로그인하고 이전 단계에서 만든 작업 영역을 선택합니다.
  2. 왼쪽 블레이드에서 Notebooks를 선택합니다.
  3. 내 Notebooks를 클릭하고 새로 추가를 클릭합니다.
  4. 파일 이름(예: Qiskit.ipynb)을 입력하고 파일 만들기를 클릭합니다.

새 Notebook이 열리면 구독 및 작업 영역 정보에 따라 첫 번째 셀에 대한 코드가 자동으로 만들어집니다.

from azure.quantum import Workspace
workspace = Workspace ( 
    resource_id = "", # Add your resource_id 
    location = ""  # Add your workspace location (for example, "westus") 
)

참고

달리 명시되지 않는 한 컴파일 문제를 방지하기 위해 셀을 만들 때 각 셀을 순서대로 실행해야 합니다.

셀 왼쪽의 삼각형 "재생" 아이콘을 클릭하여 코드를 실행합니다.

필요한 가져오기 로드

먼저 몇 가지 추가 모듈을 가져와야 합니다.

+ 코드를 클릭하여 새 셀을 추가하고, 다음 코드를 추가하여 실행합니다.

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

Azure Quantum 서비스에 연결

다음으로, 이전 셀의 개체를 Workspace 사용하여 개체를 만들어 AzureQuantumProvider Azure Quantum 작업 영역에 연결합니다. 다음 코드를 사용하여 새 셀을 추가합니다.

provider = AzureQuantumProvider(workspace)

간단한 회로 정의

새 셀에서 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()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

모두 나열 targets

이제 작업 영역에서 사용할 수 있는 모든 양자 컴퓨팅 targets또는 백 엔드를 표시할 수 있습니다. 새 셀을 추가하고 다음 행을 실행합니다.

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

실제 양자 하드웨어에서 실행하기 전에 코드를 확인하려면 IonQ 양자 시뮬레이터 ionq.simulator를 사용할 수 있습니다.

새 셀을 추가하고 IonQ 양자 시뮬레이터 target를 나타내는 개체를 만듭니다.

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

IonQ 시뮬레이터에서 실행

시뮬레이터에서 회로를 실행하려면 다음 코드를 추가합니다. 이 예제에서는 의 runtarget 메서드를 사용하여 작업을 제출한 다음 작업 상태 모니터링합니다.

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

작업이 성공적으로 실행되면 작업 결과를 가져와서 표시합니다.

# 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'))])

result 형식은 Qiskit 패키지의 네이티브 개체이므로 Qiskit의 result.get_countsplot_histogram을 사용하여 결과를 시각화할 수 있습니다. 가능한 모든 bitstring 레이블이 표시되는지 확인하기 위해 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}

IonQ 시뮬레이터의 Qiskit 회로 결과

작업 비용 예측

실제 양자 하드웨어 또는 QPU( 양자 처리 장치 )에서 작업을 실행하기 전에 실행하는 데 드는 비용을 예측할 수 있습니다.

먼저 사용 가능한 공급자 목록을 다시 가져옵니다.

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

다음으로, IonQ 양자 컴퓨터를 나타내는 개체를 만듭니다.

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

QPU에서 작업을 실행하는 비용을 예측하려면 의 target메서드를 사용하여 새 셀을 estimate_cost 추가하고 실행합니다.

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

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

그러면 쿼리의 예상 비용이 달러로 표시됩니다.

최신 가격 책정 세부 정보는 IonQ 가격 책정을 참조하거나 작업 영역을 찾아 공급자 블레이드의 가격 책정 옵션을 확인합니다.

IonQ QPU에서 실행

IonQ 시뮬레이터에서 작업을 성공적으로 실행하고 QPU 비용을 예측한 후에는 하드웨어에서 회로를 실행할 차례입니다.

참고

QPU에서 회로를 실행하는 데 필요한 시간은 현재 큐 시간에 따라 다릅니다. 작업 영역의 공급자 블레이드를 target 선택하여 의 평균 큐 시간을 볼 수 있습니다.

이전에 API 유효성 검사기에서 사용한 것과 동일한 run 메서드 및 연산을 사용하여 작업을 제출 및 모니터링합니다.

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

작업이 완료되면 이전과 같이 작업 결과를 가져와서 차트에 표시합니다.

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}

IonQ QPU의 Qiskit 회로 결과

중요

단일 작업에서 여러 회로 제출은 현재 지원되지 않습니다. 해결 방법으로, 메서드를 backend.run 호출하여 각 회로를 비동기적으로 제출한 다음, 각 작업의 결과를 가져올 수 있습니다. 다음은 그 예입니다.

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

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

다음 단계