Hello Pulse 작업 - Amazon Braket

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Hello Pulse 작업

이 섹션에서는 Rigetti 디바이스에서 펄스를 사용하여 직접 단일 큐비트 게이트를 특성화하고 구성하는 방법을 알아봅니다. 큐비트에 전자기장을 가하면 Rabi 진동이 발생하여 큐비트가 0 상태와 1 상태 사이를 전환합니다. 펄스의 보정된 길이와 위상을 사용하면 Rabi 진동이 단일 큐비트 게이트를 계산할 수 있습니다. 여기서는 보다 복잡한 펄스 시퀀스를 빌드하는 데 사용되는 기본 블록인 pi/2 펄스를 측정하기 위한 최적의 펄스 길이를 결정합니다.

먼저 펄스 시퀀스를 빌드하려면 PulseSequence 클래스를 가져옵니다.

from braket.aws import AwsDevice from braket.circuits import FreeParameter from braket.devices import Devices from braket.pulse import PulseSequence, GaussianWaveform import numpy as np

그런 다음 QPU의 Amazon Resource Name(ARN)을 사용하여 새 Braket 디바이스를 인스턴스화합니다. 다음 코드 블록은 Rigetti Ankaa-3을 사용합니다.

device = AwsDevice(Devices.Rigetti.Ankaa3)

다음 펄스 시퀀스에는 파형 재생과 큐비트 측정이라는 두 가지 구성 요소가 포함됩니다. 펄스 시퀀스는 일반적으로 프레임에 적용할 수 있습니다. 장벽 및 지연과 같은 몇 가지 예외를 제외하고, 큐비트에 적용할 수 있습니다. 펄스 시퀀스를 구성하기 전에 사용 가능한 프레임을 검색해야 합니다. 드라이브 프레임은 Rabi 진동에 대한 펄스를 적용하는 데 사용되며, 판독 프레임은 큐비트 상태를 측정하는 데 사용됩니다. 이 예제에서는 큐비트 25의 프레임을 사용합니다.

drive_frame = device.frames["Transmon_25_charge_tx"] readout_frame = device.frames["Transmon_25_readout_rx"]

이제 드라이브 프레임에서 재생할 파형을 생성합니다. 목표는 다양한 펄스 길이에 대한 큐비트의 동작을 특성화하는 것입니다. 매번 길이가 다른 파형을 재생합니다. 매번 새 파형을 인스턴스화하는 대신, Braket에서 지원하는 펄스 시퀀스 내 FreeParameter를 사용합니다. 자유 파라미터로 파형과 펄스 시퀀스를 한 번 생성한 다음, 다른 입력 값으로 동일한 펄스 시퀀스를 실행할 수 있습니다.

waveform = GaussianWaveform(FreeParameter("length"), FreeParameter("length") * 0.25, 0.2, False)

마지막으로, 펄스 시퀀스로 결합합니다. 펄스 시퀀스에서 play는 드라이브 프레임에서 지정된 파형을 재생하고 capture_v0은 판독 프레임에서 상태를 측정합니다.

pulse_sequence = ( PulseSequence() .play(drive_frame, waveform) .capture_v0(readout_frame) )

다양한 펄스 길이를 스캔하여 QPU에 제출합니다. QPU에서 펄스 시퀀스를 실행하기 전에 자유 파라미터의 값을 바인딩합니다.

start_length = 12e-9 end_length = 2e-7 lengths = np.arange(start_length, end_length, 12e-9) N_shots = 100 tasks = [ device.run(pulse_sequence(length=length), shots=N_shots) for length in lengths ] probability_of_zero = [ task.result().measurement_counts['0']/N_shots for task in tasks ]

큐비트 측정의 통계는 0 상태와 1 상태 사이에서 진동하는 큐비트의 진동 역학을 보여줍니다. 측정 데이터에서 Rabi 주파수를 추출하고 펄스 길이를 미세 조정하여 특정 1큐비트 게이트를 구현할 수 있습니다. 예를 들어 아래 그림의 데이터에서 주기성은 약 154ns입니다. 따라서 pi/2 회전 게이트는 길이=38.5ns인 펄스 시퀀스에 해당합니다.

펄스 지속 시간에 대한 모집단 양을 초 단위로 보여주는 선 그래프입니다. 그래프에는 2개의 최고점과 1개의 최저점이 있습니다.

OpenPulse를 사용한 Hello Pulse

OpenPulse는 일반 양자 디바이스의 펄스 수준 제어를 지정하는 언어이며 OpenQASM 3.0 사양의 일부입니다. Amazon Braket은 OpenQASM 3.0 표현을 사용하여 펄스를 직접 프로그래밍할 수 있도록 OpenPulse를 지원합니다.

Braket은 네이티브 명령에서 펄스를 표현하기 위한 기본 중간 표현으로 OpenPulse를 사용합니다. OpenPulse는 defcal(“define calibration”의 줄임말) 선언 형태로 명령 보정 추가를 지원합니다. 이러한 선언을 사용하면 저수준 제어 문법 내에서 게이트 명령의 구현을 지정할 수 있습니다.

다음 명령을 사용하여 Braket PulseSequence의 OpenPulse 프로그램을 볼 수 있습니다.

print(pulse_sequence.to_ir())

OpenPulse 프로그램을 직접 구성할 수도 있습니다.

from braket.ir.openqasm import Program openpulse_script = """ OPENQASM 3.0; cal { bit[1] psb; waveform my_waveform = gaussian(12.0ns, 3.0ns, 0.2, false); play(Transmon_25_charge_tx, my_waveform); psb[0] = capture_v0(Transmon_25_readout_rx); } """

스크립트로 Program 객체를 생성합니다. 그런 다음 프로그램을 QPU에 제출합니다.

from braket.aws import AwsDevice from braket.devices import Devices from braket.ir.openqasm import Program program = Program(source=openpulse_script) device = AwsDevice(Devices.Rigetti.Ankaa3) task = device.run(program, shots=100)