Ejecute su código local como un trabajo híbrido - Amazon Braket

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Ejecute su código local como un trabajo híbrido

Amazon Braket Hybrid Jobs proporciona una orquestación totalmente gestionada de algoritmos híbridos cuántico-clásicos, que combina los recursos informáticos de Amazon EC2 con el acceso a la unidad de procesamiento cuántico (QPU) de Amazon Braket. Las tareas cuánticas creadas en un trabajo híbrido tienen prioridad sobre las tareas cuánticas individuales para que sus algoritmos no se vean interrumpidos por las fluctuaciones de la cola de tareas cuánticas. Cada QPU mantiene una cola de trabajos híbridos independiente, lo que garantiza que solo se pueda ejecutar un trabajo híbrido en un momento dado.

Cree un trabajo híbrido a partir del código Python local

Puede ejecutar su código Python local como un Amazon Braket Hybrid Job. Para ello, anote el código con un @hybrid_job decorador, como se muestra en el siguiente ejemplo de código. Para entornos personalizados, puede optar por utilizar un contenedor personalizado de Amazon Elastic Container Registry (ECR).

nota

De forma predeterminada, solo se admite Python 3.10.

Puede usar el @hybrid_job decorador para anotar una función. Braket transforma el código del decorador en un script de algoritmo de trabajo híbrido de Braket. A continuación, el trabajo híbrido invoca la función dentro del decorador en una instancia de Amazon EC2. Puede supervisar el progreso del trabajo con job.state() o con la consola Braket. El siguiente ejemplo de código muestra cómo ejecutar una secuencia de cinco estados en. 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}

El trabajo híbrido se crea invocando la función como lo haría con las funciones normales de Python. Sin embargo, la función decoradora devuelve el identificador de trabajo híbrido en lugar del resultado de la función. Para recuperar los resultados una vez que se haya completado, utilicejob.result().

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

El argumento dispositivo del @hybrid_job decorador especifica el dispositivo al que la tarea híbrida tiene acceso prioritario, en este caso, el SV1 simulador. Para obtener la prioridad de la QPU, debe asegurarse de que el ARN del dispositivo utilizado en la función coincida con el especificado en el decorador. Para mayor comodidad, puede utilizar la función de ayuda get_job_device_arn() para capturar el ARN del dispositivo declarado en. @hybrid_job

nota

Cada trabajo híbrido tiene un tiempo de inicio de al menos un minuto, ya que crea un entorno contenerizado en Amazon EC2. Por lo tanto, para cargas de trabajo muy cortas, como un circuito único o un lote de circuitos, puede bastar con utilizar tareas cuánticas.

Hiperparámetros

La run_hybrid_job() función utiliza el argumento num_tasks para controlar el número de tareas cuánticas creadas. El trabajo híbrido lo captura automáticamente como un hiperparámetro.

nota

Los hiperparámetros se muestran en la consola Braket como cadenas, con un límite de 2500 caracteres.

Métricas y registro

Dentro de la run_hybrid_job() función, se registran las métricas de los algoritmos iterativos. log_metrics Las métricas se grafican automáticamente en la página de la consola de Braket, en la pestaña de tareas híbridas. Puede utilizar las métricas para realizar un seguimiento de los costes de las tareas cuánticas prácticamente en tiempo real durante la ejecución de un trabajo híbrido con el rastreador de costes de Braket. En el ejemplo anterior, se utiliza el nombre de métrica «probabilidad», que registra la primera probabilidad del tipo de resultado.

Recuperando los resultados

Una vez finalizado el trabajo híbrido, se utiliza job.result() para recuperar los resultados del trabajo híbrido. Braket captura automáticamente todos los objetos de la declaración de devolución. Tenga en cuenta que los objetos devueltos por la función deben ser una tupla y cada elemento debe ser serializable. Por ejemplo, el código siguiente muestra un ejemplo que funciona y otro que no funciona.

@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

Nombre del trabajo

De forma predeterminada, el nombre de este trabajo híbrido se deduce del nombre de la función. También puede especificar un nombre personalizado de hasta 50 caracteres. Por ejemplo, en el código siguiente, el nombre del trabajo es «my-job-name».

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

Modo local

Los trabajos locales se crean añadiendo el argumento local=True al decorador. Esto ejecuta el trabajo híbrido en un entorno contenerizado en su entorno informático local, como un portátil. Los trabajos locales no tienen prioridad en las colas para las tareas cuánticas. En casos avanzados, como los de varios nodos o MPI, los trabajos locales pueden tener acceso a las variables de entorno Braket requeridas. El siguiente código crea un trabajo híbrido local con el dispositivo como simulador SV1.

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

Se admiten todas las demás opciones de trabajos híbridos. Para ver una lista de opciones, consulte el módulo braket.jobs.quantum_job_creation.

Instalar paquetes y código fuente de Python adicionales

Puede personalizar su entorno de ejecución para usar sus paquetes de Python preferidos. Puedes usar un requirements.txt archivo, una lista de nombres de paquetes o traer tu propio contenedor (BYOC). Para personalizar un entorno de ejecución mediante un requirements.txt archivo, consulte el siguiente ejemplo de código.

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

Por ejemplo, el requirements.txt archivo puede incluir otros paquetes para instalar.

qiskit pennylane >= 0.31 mitiq == 0.29

Como alternativa, puede proporcionar los nombres de los paquetes como una lista de Python de la siguiente manera.

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

El código fuente adicional se puede especificar como una lista de módulos o como un solo módulo, como en el siguiente ejemplo de código.

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

Guarde y cargue datos en una instancia de trabajo híbrida

Especificar los datos de entrenamiento de entrada

Al crear un trabajo híbrido, puede proporcionar una entrada para los conjuntos de datos de entrenamiento especificando un bucket de Amazon Simple Storage Service (Amazon S3). También puede especificar una ruta local y, a continuación, Braket carga automáticamente los datos a Amazon S3 en. s3://<default_bucket_name>/jobs/<job_name>/<timestamp>/data/<channel_name> Si especificas una ruta local, el nombre del canal será «input» por defecto. El siguiente código muestra un archivo numérico de la ruta local. 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 ...

En el caso de S3, debe utilizar la función get_input_data_dir() auxiliar.

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")

Puede especificar varias fuentes de datos de entrada proporcionando un diccionario de valores de canal y URI de S3 o rutas locales.

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")
nota

Cuando los datos de entrada son grandes (más de 1 GB), hay un largo tiempo de espera antes de que se cree el trabajo. Esto se debe a que los datos de entrada locales se cargan por primera vez en un bucket de S3 y, a continuación, se añade la ruta de S3 a la solicitud de trabajo. Por último, la solicitud de trabajo se envía al servicio Braket.

Guardar los resultados en S3

Para guardar los resultados no incluidos en la declaración de devolución de la función decorada, debe añadir el directorio correcto a todas las operaciones de escritura de archivos. En el siguiente ejemplo, se muestra cómo guardar una matriz numérica y una figura de 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 ...

Todos los resultados se comprimen en un archivo denominado. model.tar.gz Puede descargar los resultados con la función job.result() Python o navegando a la carpeta de resultados desde la página de trabajos híbridos de la consola de administración de Braket.

Guardar y reanudar desde los puntos de control

Para trabajos híbridos de larga duración, se recomienda guardar periódicamente el estado intermedio del algoritmo. Puede utilizar la función de save_job_checkpoint() ayuda integrada o guardar los archivos en la AMZN_BRAKET_JOB_RESULTS_DIR ruta. Esta última opción está disponible con la función auxiliar. get_job_results_dir()

El siguiente es un ejemplo práctico mínimo para guardar y cargar puntos de control con un decorador de trabajos híbrido:

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()

En el primer trabajo híbrido, save_job_checkpoint() se invoca con un diccionario que contiene los datos que queremos guardar. De forma predeterminada, todos los valores deben poder serializarse como texto. Para comprobar objetos de Python más complejos, como matrices numéricas, puede configurar. data_format = PersistedJobDataFormat.PICKLED_V4 Este código crea y sobrescribe un archivo de puntos de control con el nombre predeterminado <jobname>.json en tus artefactos de trabajo híbridos, en una subcarpeta llamada «puntos de control».

Para crear un nuevo trabajo híbrido para continuar desde el punto de control, debemos pasar por copy_checkpoints_from_job=job_arn dónde job_arn está el ARN del trabajo híbrido del trabajo anterior. Luego solemos load_job_checkpoint(job_name) cargar desde el punto de control.

Mejores prácticas para decoradores de trabajos híbridos

Adopte la asincronicidad

Los trabajos híbridos creados con la anotación decorator son asíncronos: se ejecutan una vez que están disponibles los recursos clásicos y cuánticos. Usted monitorea el progreso del algoritmo utilizando Amazon Braket Management Console o Amazon CloudWatch. Cuando envías tu algoritmo para su ejecución, Braket lo ejecuta en un entorno contenerizado escalable y los resultados se recuperan cuando el algoritmo está completo.

Ejecuta algoritmos variacionales iterativos

Hybrid Jobs le proporciona las herramientas para ejecutar algoritmos iterativos clásicos cuánticos. Para problemas puramente cuánticos, utilice tareas cuánticas o un lote de tareas cuánticas. El acceso prioritario a determinadas QPU es más beneficioso para los algoritmos variacionales de larga duración que requieren múltiples llamadas iterativas a las QPU con el procesamiento clásico intermedio.

Depure utilizando el modo local

Antes de ejecutar un trabajo híbrido en una QPU, se recomienda ejecutar primero el simulador SV1 para confirmar que se ejecuta según lo esperado. Para pruebas a pequeña escala, puede ejecutarlas en modo local para una iteración y depuración rápidas.

Mejore la reproducibilidad con Bring your own container (BYOC)

Cree un experimento reproducible encapsulando su software y sus dependencias en un entorno contenerizado. Al empaquetar todo el código, las dependencias y la configuración en un contenedor, se evitan posibles conflictos y problemas de control de versiones.

Simuladores distribuidos de varias instancias

Para ejecutar una gran cantidad de circuitos, considere la posibilidad de utilizar el soporte MPI integrado para ejecutar simuladores locales en varias instancias dentro de un solo trabajo híbrido. Para obtener más información, consulte simuladores integrados.

Utilice circuitos paramétricos

Los circuitos paramétricos que envíe a partir de un trabajo híbrido se compilan automáticamente en determinadas QPU mediante la compilación paramétrica para mejorar los tiempos de ejecución de los algoritmos.

Compruebe periódicamente

Para trabajos híbridos de larga duración, se recomienda guardar periódicamente el estado intermedio del algoritmo.

Para ver más ejemplos, casos de uso y mejores prácticas, consulta los ejemplos de Amazon GitHub Braket.