기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
로컬 코드를 하이브리드 작업으로 실행
Amazon Braket Hybrid Jobs는 Amazon EC2 컴퓨팅 리소스를 Amazon Braket Quantum Processing Unit(QPU) 액세스와 결합하여 하이브리드 양자-클래식 알고리즘의 완전 관리형 오케스트레이션을 제공합니다. 하이브리드 작업에서 생성된 양자 태스크는 개별 양자 태스크보다 대기열에 우선하므로 양자 태스크 대기열의 변동으로 인해 알고리즘이 중단되지 않습니다. 각 는 별도의 하이브리드 작업 대기열을 QPU 유지 관리하므로 한 번에 하나의 하이브리드 작업만 실행할 수 있습니다.
이 섹션:
로컬 Python 코드에서 하이브리드 작업 생성
로컬 Python 코드를 Amazon Braket 하이브리드 작업으로 실행할 수 있습니다. 다음 코드 예제와 같이 @hybrid_job
데코레이터로 코드에 주석을 달면 됩니다. 사용자 지정 환경의 경우 Amazon Elastic Container Registry()에서 사용자 지정 컨테이너를 사용하도록 선택할 수 있습니다ECR.
참고
Python 3.10만 기본적으로 지원됩니다.
@hybrid_job
데코레이터를 사용하여 함수에 주석을 달 수 있습니다. Braket는 데코레이터 내부의 코드를 Braket 하이브리드 작업 알고리즘 스크립트 로 변환합니다. 그런 다음 하이브리드 작업은 Amazon EC2 인스턴스의 데코레이터 내에서 함수를 호출합니다. job.state()
또는 Braket 콘솔을 사용하여 작업 진행 상황을 모니터링할 수 있습니다. 다음 코드 예제는 에서 5개 상태의 시퀀스를 실행하는 방법을 보여줍니다.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 사용되는 디바이스가 데코레이터에 지정된 디바이스와 일치하는지 확인해야 합니다. 편의를 위해 헬퍼 함수를 사용하여 에 ARN 선언된 디바이스를 캡처get_job_device_arn()
할 수 있습니다@hybrid_job
.
참고
각 하이브리드 작업은 Amazon 에서 컨테이너화된 환경을 생성하기 때문에 시작 시간이 1분 이상입니다EC2. 따라서 단일 회로 또는 회로 배치와 같은 매우 짧은 워크로드의 경우 양자 작업을 사용하기에 충분할 수 있습니다.
하이퍼파라미터
run_hybrid_job()
함수는 인수를 num_tasks
사용하여 생성된 양자 작업 수를 제어합니다. 하이브리드 작업은 이를 하이퍼파라미터 로 자동으로 캡처합니다.
참고
하이퍼파라미터는 Braket 콘솔에 문자열로 표시되며, 문자열은 2,500자로 제한됩니다.
지표 및 로깅
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
작업 이름
기본적으로 이 하이브리드 작업의 이름은 함수 이름에서 추론됩니다. 최대 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_creation 모듈
추가 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가 s3://<default_bucket_name>/jobs/<job_name>/<timestamp>/data/<channel_name>
에서 Amazon S3에 데이터를 자동으로 업로드합니다. 로컬 경로를 지정하는 경우 채널 이름은 기본적으로 “입력”으로 설정됩니다. 다음 코드는 로컬 경로 의 무감각한 파일을 보여줍니다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 URIs 또는 로컬 경로 사전을 제공하여 여러 입력 데이터 소스를 지정할 수 있습니다.
input_data = { "input": "data/file.npy", "input_2": "s3://amzn-s3-demo-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에 결과 저장
지정된 함수의 반환 문에 포함되지 않은 결과를 저장하려면 모든 파일 쓰기 작업에 올바른 디렉터리를 추가해야 합니다. 다음 예제에서는 무감각 배열과 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()
가 저장하려는 데이터가 포함된 사전과 함께 호출됩니다. 기본적으로 모든 값은 텍스트로 직렬화할 수 있어야 합니다. 마비 배열과 같은 더 복잡한 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는 확장 가능한 컨테이너화된 환경에서 알고리즘을 실행하고 알고리즘이 완료되면 결과가 검색됩니다.
반복 변형 알고리즘 실행
하이브리드 작업은 반복적 양자-전형 알고리즘을 실행할 수 있는 도구를 제공합니다. 순수 양자 문제의 경우 양자 태스크 또는 양자 태스크 배치를 사용합니다. 특정 에 대한 우선 액세스는 그 사이에 클래식 처리QPUs가 있는 에 대한 여러 반복 호출이 필요한 장기 실행 변형 알고리즘에 QPUs 가장 유용합니다.
로컬 모드를 사용하여 디버깅
에서 하이브리드 작업을 실행하기 전에 시뮬레이터에서 먼저 실행SV1하여 예상대로 실행되고 있는지 확인하는 것이 QPU좋습니다. 소규모 테스트의 경우 빠른 반복 및 디버깅을 위해 로컬 모드로 실행할 수 있습니다.
자체 컨테이너 가져오기(BYOC)를 사용하여 재현성 향상
컨테이너화된 환경 내에서 소프트웨어와 해당 종속성을 캡슐화하여 재현 가능한 실험을 생성합니다. 컨테이너에 모든 코드, 종속성 및 설정을 패키징하면 잠재적 충돌 및 버전 관리 문제를 방지할 수 있습니다.
다중 인스턴스 분산 시뮬레이터
많은 수의 회로를 실행하려면 내장 MPI 지원을 사용하여 단일 하이브리드 작업 내의 여러 인스턴스에서 로컬 시뮬레이터를 실행하는 것이 좋습니다. 자세한 내용은 임베디드 시뮬레이터 를 참조하세요.
파라미터 회로 사용
하이브리드 작업에서 제출하는 파라미터 회로는 알고리즘의 런타임을 개선하기 위해 파라미터 컴파일을 QPUs 사용하여 특정 에서 자동으로 컴파일됩니다. 파라미터 컴파일을 사용하여 하이브리드 작업 속도 향상
정기적으로 체크포인트
장기 실행 하이브리드 작업의 경우 알고리즘의 중간 상태를 주기적으로 저장하는 것이 좋습니다.
추가 예제, 사용 사례 및 모범 사례는 Amazon Braket 예제를 GitHub