다음을 통해 공유


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

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

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

필수 조건

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

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

  • Python PipPython 설치된 환경입니다.

  • Azure Quantum Development Kit Python 확장이 설치된 VS Code

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

    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 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. 필드에 매개 변수를 복사합니다.

    Quantum 작업 영역의 개요 창을 확장하는 방법을 보여 주는 Visual Studio Code의 스크린샷

새 셀을 추가하고 계정 정보를 사용하여 만들고 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.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

필수 조건

  • 활성 구독이 있는 Azure 계정. Azure 계정이 없는 경우 무료로 등록하고 종량제 구독등록합니다.
  • Azure Quantum 작업 영역 자세한 내용은 Azure Quantum 작업 영역 만들기를 참조하세요.

작업 영역에서 새 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 서비스에 연결

다음으로, 이전 셀의 개체를 AzureQuantumService 사용하여 개체를 만들어 workspace 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.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(양자 처리 장치 )에서 작업을 실행하기 전에 실행하는 데 드는 비용을 예측해야 합니다.

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

IonQ QPU에서 실행

이전 작업은 기본 시뮬레이터 ionq.simulator에서 실행되었습니다. 그러나 IonQ의 하드웨어 프로세서 또는 QPU(Quantum Processor Unit)에서도 실행할 수 있습니다. 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
)

참고 항목

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

Important

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

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

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