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

패키지를 사용하여 Cirq 양자 회로를 제출하는 방법을 알아봅니다 azure-quantumPython . 기본 제공 패키지가 있는 Azure Quantum Notebook 또는 로컬 컴퓨터에서 Cirq 회로를 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.

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

    python -m pip install --upgrade azure-quantum[cirq] 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 azure.quantum.cirq import AzureQuantumService

Azure Quantum 서비스에 연결

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

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

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

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

service = AzureQuantumService(workspace)

모두 나열 targets

메서드를 targets()사용하여 현재 큐 시간 및 가용성을 포함하여 회로를 실행할 수 있는 작업 영역의 모든 targets 를 나열합니다.

참고

작업 영역의 모든 가 targets 나열되지 않을 수 있습니다. Cirq 또는 OpenQASM 회로를 수락할 수 있는 만 targets 여기에 나열됩니다.

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.qpu", avg. queue time=229 s, Available>,
<Target name="ionq.simulator", avg. queue time=3 s, Available>,
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>]

간단한 회로 만들기

다음으로, 실행할 간단한 Cirq 회로를 만듭니다. 이 회로는 IonQ 하드웨어 시스템의 네이티브인 X 게이트의 제곱근을 사용합니다.

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

IonQ 시뮬레이터에서 실행

이제 Azure Quantum 서비스를 통해 프로그램을 실행하고 결과를 가져올 수 있습니다. 다음 셀은 100샷으로 회로를 실행하고, 작업이 완료될 때까지 대기하며, 결과를 반환하는 작업을 (기본 IonQ 시뮬레이터에) 제출합니다.

result = service.run(program=circuit, repetitions=100, target="ionq.simulator")

반환 된 cirq.Result 개체입니다.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

작업 비용 예측

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

cost = service.estimate_cost(
    program=circuit,
    repetitions=100,
    target="ionq.qpu"
)

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

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

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

IonQ QPU에서 실행

이전 작업은 기본 시뮬레이터인 "ionq.simulator"에서 실행되었습니다. 그러나 IonQ의 하드웨어 프로세서(QPU(Quantum Processor Unit))에서도 실행할 수 있습니다. IonQ QPU를 실행하려면 "ionq.qpu"target 인수로 제공합니다.

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

다시 이것은 cirq.Result 개체를 반환합니다.

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

작업을 사용하는 비동기 모델

장기 실행 회로의 경우 비동기적으로 실행하는 것이 유용할 수 있습니다. service.create_job 메서드는 작업이 성공적으로 실행된 후 결과를 가져오는 데 사용할 수 있는 Job 개체를 반환합니다.

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

작업 상태를 사용하려면 job.status()를 사용합니다.

print(job.status())
'completed'

작업이 완료 될 때까지 기다린 후 결과를 가져오려면 차단 호출 job.results()를 사용합니다.

result = job.results()
print(result)
00: 0.5
11: 0.5

여기에서는 cirq.Result 개체를 반환하지 않습니다. 대신, IonQ 시뮬레이터 고유의 결과 개체를 반환하고, 샷 데이터 대신 상태 확률을 사용합니다.

type(result)
cirq_ionq.results.SimulatorResult

이것을 cirq.Result 개체로 변환하려면 result.to_cirq_result()를 사용합니다.

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100

사전 요구 사항

작업 영역에서 새 Notebook 만들기

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

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

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

참고

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

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

필요한 가져오기 로드

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

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

from azure.quantum.cirq import AzureQuantumService

Azure Quantum 서비스에 연결

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

provider = AzureQuantumService(workspace)

간단한 회로 정의

다음으로, 실행할 간단한 Cirq 회로를 만듭니다. 이 회로는 IonQ 하드웨어 시스템의 네이티브인 X 게이트의 제곱근을 사용합니다.

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────────

모두 나열 targets

메서드를 targets()사용하여 현재 큐 시간 및 가용성을 포함하여 회로를 실행할 수 있는 작업 영역의 모든 targets 를 나열합니다.

참고

작업 영역의 targets 모든 가 나열되지 않을 수 있습니다. Cirq 또는 OpenQASM 회로를 수락할 수 있는 만 targets 여기에 나열됩니다.

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.qpu", avg. queue time=229 s, Available>
<Target name="ionq.simulator", avg. queue time=3 s, Available>
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>

참고

의 전체 목록은 target 작업 영역에 따라 다를 수 있습니다.

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

IonQ 시뮬레이터에서 실행

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

다음 셀은 100샷으로 회로를 실행하고, 작업이 완료될 때까지 대기하며, 결과를 반환하는 작업을 제출합니다.

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

반환 된 cirq.Result 개체입니다.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

결과를 히스토그램에 그릴 수 있습니다.

import pylab as pl

pl.hist(result.data)
pl.ylabel("Counts")
pl.xlabel("Result")

작업 비용 예측

실제 양자 하드웨어 또는 QPU(Quantum Processing Unit)에서 작업을 실행하기 전에 실행에 드는 비용을 예측할 수 있습니다. QPU에서 작업을 실행하는 비용을 예측하기 위해 estimate_cost 메서드를 사용할 수 있습니다.

cost = service.estimate_cost(
    program=circuit,
    repetitions=100,
    target="ionq.qpu"
)

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

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

최신 가격 책정 세부 정보는 IonQ 가격 책정을 참조하거나 작업 영역의 공급자 블레이드에서 가격 책정 옵션을 확인합니다. 현재 크레딧 상태 및 사용량을 보려면 크레딧 및 할당량을 선택합니다.

IonQ QPU에서 실행

이전 작업은 기본 시뮬레이터인 ionq.simulator에서 실행되었습니다. 그러나 IonQ의 하드웨어 프로세서 또는 QPU(Quantum Processor Unit)에서도 실행할 수 있습니다. IonQ QPU를 실행하려면 ionq.qputarget 인수로 제공합니다.

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

참고

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

다시 이것은 cirq.Result 개체를 반환합니다.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

작업을 사용하는 비동기 모델

장기 실행 회로의 경우 비동기적으로 실행하는 것이 유용할 수 있습니다. service.create_job 메서드는 작업이 성공적으로 실행된 후 결과를 가져오는 데 사용할 수 있는 Job 개체를 반환합니다.

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

작업 상태를 사용하려면 job.status()를 사용합니다.

print(job.status())
'completed'

작업이 완료 될 때까지 기다린 후 결과를 가져오려면 차단 호출 job.results()를 사용합니다.

result = job.results()
print(result)
00: 0.5
11: 0.5

참고

job.results() 함수는 cirq.Result 개체를 반환하지 않습니다. 대신, IonQ 시뮬레이터 고유의 결과 개체를 반환하고, 샷 데이터 대신 상태 확률을 사용합니다.

type(result)
cirq_ionq.results.SimulatorResult

이것을 cirq.Result 개체로 변환하려면 result.to_cirq_result()를 사용합니다.

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100

중요

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

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

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

다음 단계