다음을 통해 공유


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

패키지를 사용하여 Cirq 양자 회로를 제출하는 방법을 알아봅니다 azure-quantumPython . 로컬 컴퓨터에서 Azure QDK(Quantum Development Kit) 및 Vs Code(Visual Studio Code)의 Jupyter Notebook을 사용하여 Azure Quantum에 Cirq 회로를 제출할 수 있습니다.

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

필수 조건

설치 세부 정보는 QDK 확장설정을 참조하세요.

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

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

  • VS Code에 Azure Quantum Development Kit, Python 확장이 설치됨.

  • Azure Quantum azure-quantum 패키지에는 cirq 추가 항목과 qdkipykernel 패키지가 포함되어 있습니다.

    python -m pip install --upgrade "azure-quantum[cirq]" qdk ipykernel 
    

    참고

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

새 Jupyter Notebook 만들기

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

필요한 임포트 로드

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

import azure.quantum
from azure.quantum.cirq import AzureQuantumService

Azure Quantum 서비스에 연결

Azure Quantum 서비스에 연결하려면 프로그램에서 리소스 ID와 Azure Quantum 작업 영역 위치가 필요합니다.

  1. Azure 계정에 로그인합니다 https://portal.azure.com.
  2. Azure Quantum 작업 영역을 선택하고 개요로 이동합니다.
  3. 필드에 매개 변수를 복사합니다.

새 셀을 추가한 다음, 계정 정보를 사용하여 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.h2-1", avg. queue time=0 s, Degraded>,
<Target name="quantinuum.sim.h2-1sc", avg. queue time=1 s, Available>,
<Target name="quantinuum.sim.h2-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>]

간단한 회로 만들기

다음으로 실행할 간단한 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에서 작업을 실행하기 전에 실행하는 데 드는 비용을 예측해야 합니다.

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

IonQ QPU에서 실행

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

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1",
    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