로컬 코드를 하이브리드 작업으로 실행하십시오. - Amazon Braket

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

로컬 코드를 하이브리드 작업으로 실행하십시오.

Amazon Braket Hybrid Jobs는 Amazon EC2 컴퓨팅 리소스를 Amazon Braket QPU (양자 처리 장치) 액세스와 결합하여 하이브리드 양자-고전 알고리즘의 완전 관리형 오케스트레이션을 제공합니다. 하이브리드 작업에서 생성된 양자 작업은 개별 양자 작업보다 우선 순위가 높아 양자 작업 대기열의 변동으로 인해 알고리즘이 중단되지 않습니다. 각 QPU는 별도의 하이브리드 작업 대기열을 유지하므로 한 번에 하나의 하이브리드 작업만 실행할 수 있습니다.

로컬 Python 코드에서 하이브리드 작업 생성

로컬 Python 코드를 Amazon Braket 하이브리드 Job으로 실행할 수 있습니다. 다음 코드 예제와 같이 @hybrid_job 데코레이터로 코드에 주석을 달면 이 작업을 수행할 수 있습니다. 사용자 지정 환경의 경우 Amazon Elastic 컨테이너 레지스트리 (ECR) 의 사용자 지정 컨테이너를 사용하도록 선택할 수 있습니다.

참고

기본적으로 Python 3.10만 지원됩니다.

@hybrid_job데코레이터를 사용하여 함수에 주석을 달 수 있습니다. Braket은 데코레이터 내부의 코드를 Braket 하이브리드 작업 알고리즘 스크립트로 변환합니다. 그런 다음 하이브리드 작업은 Amazon EC2 인스턴스의 데코레이터 내에서 함수를 호출합니다. Braket 콘솔을 job.state() 사용하거나 Braket 콘솔을 사용하여 작업 진행 상황을 모니터링할 수 있습니다. 다음 코드 예제는 에서 다섯 가지 상태의 시퀀스를 실행하는 방법을 보여줍니다. State Vector Simulator (SV1) device

from braket.aws import AwsDevice from braket.circuits import Circuit, FreeParameter, Observable from braket.devices import Devices from braket.jobs.hybrid_job import hybrid_job from braket.jobs.metrics import log_metric device_arn = Devices.Amazon.SV1 @hybrid_job(device=device_arn) # choose priority device def run_hybrid_job(num_tasks=1): device = AwsDevice(device_arn) # declare AwsDevice within the hybrid job # create a parametric circuit circ = Circuit() circ.rx(0, FreeParameter("theta")) circ.cnot(0, 1) circ.expectation(observable=Observable.X(), target=0) theta = 0.0 # initial parameter for i in range(num_tasks): task = device.run(circ, shots=100, inputs={"theta": theta}) # input parameters exp_val = task.result().values[0] theta += exp_val # modify the parameter (possibly gradient descent) log_metric(metric_name="exp_val", value=exp_val, iteration_number=i) return {"final_theta": theta, "final_exp_val": exp_val}

일반적인 Python 함수처럼 함수를 호출하여 하이브리드 작업을 생성합니다. 하지만 데코레이터 함수는 함수의 결과가 아닌 하이브리드 작업 핸들을 반환합니다. 완료 후 결과를 검색하려면 를 사용하십시오job.result().

job = run_hybrid_job(num_tasks=1) result = job.result()

@hybrid_job데코레이터의 기기 인수는 하이브리드 작업이 우선적으로 액세스할 수 있는 기기 (이 경우에는 SV1 시뮬레이터) 를 지정합니다. QPU 우선순위를 얻으려면 함수 내에서 사용된 기기 ARN이 데코레이터에 지정된 것과 일치하는지 확인해야 합니다. 편의를 위해 helper 함수를 사용하여 에서 선언한 기기 get_job_device_arn() ARN을 캡처할 수 있습니다. @hybrid_job

참고

Amazon EC2에 컨테이너식 환경을 생성하므로 각 하이브리드 작업의 시작 시간은 최소 1분입니다. 따라서 단일 회로나 회로 배치와 같이 매우 짧은 워크로드의 경우 양자 작업을 사용하는 것으로 충분할 수 있습니다.

하이퍼파라미터

run_hybrid_job() 함수는 num_tasks 인수를 받아 생성되는 양자 작업의 수를 제어합니다. 하이브리드 작업은 이를 하이퍼파라미터로 자동 캡처합니다.

참고

하이퍼파라미터는 Braket 콘솔에 2500자로 제한되는 문자열로 표시됩니다.

지표 및 로깅

run_hybrid_job()함수 내에는 반복 알고리즘의 메트릭이 함께 log_metrics 기록됩니다. 지표는 하이브리드 작업 탭 아래의 Braket 콘솔 페이지에 자동으로 플로팅됩니다. Braket 비용 추적기로 하이브리드 작업을 실행하는 동안 메트릭을 사용하여 양자 작업 비용을 거의 실시간으로 추적할 수 있습니다. 위 예시에서는 결과 유형에서 첫 번째 확률을 기록하는 지표 이름 “확률”을 사용합니다.

결과 검색

하이브리드 작업이 완료된 후 하이브리드 작업 결과를 검색하는 job.result() 데 사용합니다. 반환 명령문의 모든 객체는 Braket에 의해 자동으로 캡처됩니다. 참고로, 함수에서 반환되는 객체는 튜플이어야 하며 각 요소는 직렬화 가능해야 합니다. 예를 들어, 다음 코드는 작동하는 예제와 실패한 예제를 보여줍니다.

@hybrid_job(device=Devices.Amazon.SV1) def passing(): np_array = np.random.rand(5) return np_array # serializable @hybrid_job(device=Devices.Amazon.SV1) def failing(): return MyObject() # not serializable

Job 이름

기본적으로 이 하이브리드 작업의 이름은 함수 이름에서 유추됩니다. 최대 50자까지 사용자 정의 이름을 지정할 수도 있습니다. 예를 들어, 다음 코드에서 작업 이름은 “my-job-name”입니다.

@hybrid_job(device=Devices.Amazon.SV1, job_name="my-job-name") def function(): pass

로컬 모드

로컬 작업은 데코레이터에 인수를 local=True 추가하여 생성됩니다. 이렇게 하면 랩톱과 같은 로컬 컴퓨팅 환경의 컨테이너화된 환경에서 하이브리드 작업이 실행됩니다. 로컬 작업에는 양자 작업에 대한 우선 순위 대기열이 없습니다. 다중 노드 또는 MPI와 같은 고급 사례의 경우 로컬 작업에서 필수 Braket 환경 변수에 액세스할 수 있습니다. 다음 코드는 디바이스를 SV1 시뮬레이터로 사용하는 로컬 하이브리드 작업을 생성합니다.

@hybrid_job(device=Devices.Amazon.SV1, local=True) def run_hybrid_job(num_tasks = 1): return ...

다른 모든 하이브리드 작업 옵션이 지원됩니다. 옵션 목록은 braket.jobs.quantum_job_create 모듈을 참조하십시오.

추가 Python 패키지 및 소스 코드 설치

선호하는 Python 패키지를 사용하도록 런타임 환경을 사용자 정의할 수 있습니다. requirements.txt파일, 패키지 이름 목록 또는 자체 컨테이너 가져오기 (BYOC) 를 사용할 수 있습니다. requirements.txt파일을 사용하여 런타임 환경을 사용자 지정하려면 다음 코드 예제를 참조하십시오.

@hybrid_job(device=Devices.Amazon.SV1, dependencies="requirements.txt") def run_hybrid_job(num_tasks = 1): return ...

예를 들어, requirements.txt 파일에는 설치할 다른 패키지가 포함될 수 있습니다.

qiskit pennylane >= 0.31 mitiq == 0.29

또는 다음과 같이 패키지 이름을 Python 목록으로 제공할 수 있습니다.

@hybrid_job(device=Devices.Amazon.SV1, dependencies=["qiskit", "pennylane>=0.31", "mitiq==0.29"]) def run_hybrid_job(num_tasks = 1): return ...

추가 소스 코드는 다음 코드 예제와 같이 모듈 목록 또는 단일 모듈로 지정할 수 있습니다.

@hybrid_job(device=Devices.Amazon.SV1, include_modules=["my_module1", "my_module2"]) def run_hybrid_job(num_tasks = 1): return ...

하이브리드 작업 인스턴스로 데이터를 저장하고 로드합니다.

입력 교육 데이터 지정

하이브리드 작업을 생성할 때 Amazon Simple Storage Service (Amazon S3) 버킷을 지정하여 입력 교육 데이터세트를 제공할 수 있습니다. 로컬 경로를 지정할 수도 있습니다. 그러면 Braket이 Amazon S3에서 자동으로 데이터를 업로드합니다. s3://<default_bucket_name>/jobs/<job_name>/<timestamp>/data/<channel_name> 로컬 경로를 지정하는 경우 채널 이름의 기본값은 “input”입니다. 다음 코드는 로컬 경로의 numpy 파일을 보여줍니다. data/file.npy

@hybrid_job(device=Devices.Amazon.SV1, input_data="data/file.npy") def run_hybrid_job(num_tasks = 1): data = np.load("data/file.npy") return ...

S3의 경우 get_input_data_dir() 도우미 함수를 사용해야 합니다.

s3_path = "s3://amazon-braket-us-west-1-961591465522/job-data/file.npy" @hybrid_job(device=None, input_data=s3_path) def job_s3_input(): np.load(get_input_data_dir() + "/file.npy") @hybrid_job(device=None, input_data={"channel": s3_path}) def job_s3_input_channel(): np.load(get_input_data_dir("channel") + "/file.npy")

채널 값 사전과 S3 URI 또는 로컬 경로를 제공하여 여러 입력 데이터 소스를 지정할 수 있습니다.

input_data = { "input": "data/file.npy", "input_2": "s3://my-bucket/data.json" } @hybrid_job(device=None, input_data=input_data) def multiple_input_job(): np.load(get_input_data_dir("input") + "/file.npy") np.load(get_input_data_dir("input_2") + "/data.json")
참고

입력 데이터가 크면 (>1GB) 작업이 생성되기까지 대기 시간이 오래 걸립니다. 이는 로컬 입력 데이터를 S3 버킷에 처음 업로드한 후 S3 경로가 작업 요청에 추가되기 때문입니다. 마지막으로 작업 요청이 Braket 서비스에 제출됩니다.

S3에 결과 저장

데코레이트된 함수의 return 문에 포함되지 않은 결과를 저장하려면 모든 파일 쓰기 작업에 올바른 디렉토리를 추가해야 합니다. 다음 예제는 numpy 배열과 matplotlib 그림을 저장하는 방법을 보여줍니다.

@hybrid_job(device=Devices.Amazon.SV1) def run_hybrid_job(num_tasks = 1): result = np.random.rand(5) # save a numpy array np.save("result.npy", result) # save a matplotlib figure plt.plot(result) plt.savefig("fig.png") return ...

모든 결과는 라는 이름의 파일로 압축됩니다. model.tar.gz Python 함수를 job.result() 사용하거나 Braket 관리 콘솔의 하이브리드 작업 페이지에서 결과 폴더로 이동하여 결과를 다운로드할 수 있습니다.

체크포인트에서 저장 및 재개

장기 실행 하이브리드 작업의 경우 알고리즘의 중간 상태를 주기적으로 저장하는 것이 좋습니다. 내장된 save_job_checkpoint() 도우미 함수를 사용하거나 파일을 경로에 저장할 수 있습니다. AMZN_BRAKET_JOB_RESULTS_DIR 나중 함수는 헬퍼 함수와 함께 사용할 수 있습니다. get_job_results_dir()

다음은 하이브리드 작업 데코레이터를 사용하여 체크포인트를 저장하고 로드하는 간단한 작업 예제입니다.

from braket.jobs import save_job_checkpoint, load_job_checkpoint, hybrid_job @hybrid_job(device=None, wait_until_complete=True) def function(): save_job_checkpoint({"a": 1}) job = function() job_name = job.name job_arn = job.arn @hybrid_job(device=None, wait_until_complete=True, copy_checkpoints_from_job=job_arn) def continued_function(): load_job_checkpoint(job_name) continued_job = continued_function()

첫 번째 하이브리드 작업에서는 save_job_checkpoint() 저장하려는 데이터가 들어 있는 사전을 사용하여 를 호출합니다. 기본적으로 모든 값은 텍스트로 직렬화할 수 있어야 합니다. numpy 배열과 같은 더 복잡한 Python 객체를 체크포인팅하기 위해 설정할 수 있습니다. data_format = PersistedJobDataFormat.PICKLED_V4 이 코드는 하이브리드 작업 아티팩트의 “checkpoints”라는 하위 폴더 아래에 있는 기본 이름을 <jobname>.json 가진 체크포인트 파일을 만들고 덮어씁니다.

체크포인트에서 계속할 새 하이브리드 작업을 생성하려면 이전 작업의 하이브리드 작업 job_arn ARN이 copy_checkpoints_from_job=job_arn 어디에 있는지 전달해야 합니다. 그런 다음 체크포인트에서 load_job_checkpoint(job_name) 로드하는 데 사용합니다.

하이브리드 잡 데코레이터를 위한 베스트 프랙티스

비동기성 수용하기

데코레이터 어노테이션으로 생성된 하이브리드 작업은 비동기식이므로 기존 리소스와 양자 리소스를 사용할 수 있게 되면 실행됩니다. Braket Management Console또는 Amazon을 사용하여 알고리즘 진행 상황을 CloudWatch 모니터링합니다. 실행을 위해 알고리즘을 제출하면 Braket은 확장 가능한 컨테이너식 환경에서 알고리즘을 실행하고 알고리즘이 완료되면 결과가 검색됩니다.

반복적 변형 알고리즘 실행

하이브리드 작업은 반복적인 양자-고전 알고리즘을 실행할 수 있는 도구를 제공합니다. 순수 양자 문제의 경우 양자 작업 또는 일련의 양자 작업을 사용하십시오. 특정 QPU에 대한 우선 순위 액세스는 QPU를 여러 번 반복해서 호출하고 그 사이에 클래식 처리를 적용해야 하는 장기 실행 변형 알고리즘에 가장 유용합니다.

로컬 모드를 사용하여 디버그합니다.

QPU에서 하이브리드 작업을 실행하기 전에 먼저 시뮬레이터 SV1에서 실행하여 예상대로 실행되는지 확인하는 것이 좋습니다. 소규모 테스트의 경우 빠른 반복 및 디버깅을 위해 로컬 모드로 실행할 수 있습니다.

BYOC (Bring Your Own Container) 로 재현성을 개선하세요.

소프트웨어와 해당 종속성을 컨테이너화된 환경 내에 캡슐화하여 재현 가능한 실험을 만들어 보세요. 모든 코드, 종속성 및 설정을 컨테이너에 패키징하여 잠재적 충돌 및 버전 관리 문제를 방지할 수 있습니다.

멀티인스턴스 분산 시뮬레이터

많은 회로를 실행하려면 내장된 MPI 지원을 사용하여 단일 하이브리드 작업 내의 여러 인스턴스에서 로컬 시뮬레이터를 실행하는 것이 좋습니다. 자세한 내용은 임베디드 시뮬레이터를 참조하십시오.

파라메트릭 회로 사용

하이브리드 작업에서 제출하는 파라메트릭 회로는 파라메트릭 컴파일을 사용하여 특정 QPU에서 자동으로 컴파일되어 알고리즘의 런타임을 개선합니다.

정기적으로 체크포인트를 지정합니다.

장기 실행 하이브리드 작업의 경우 알고리즘의 중간 상태를 주기적으로 저장하는 것이 좋습니다.

추가 예제, 사용 사례 및 모범 사례는 Amazon GitHub Braket 예제를 참조하십시오.