Receta para traer tu propio contenedor - 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.

Receta para traer tu propio contenedor

En esta sección, te ofrecemos una step-by-step guía con todo lo que necesitas bring your own container (BYOC) para utilizar Hybrid Jobs: los scripts, los archivos y los pasos para combinarlos y empezar a trabajar con tus Docker imágenes personalizadas. Proporcionamos recetas para dos casos comunes:

  1. Instale software adicional en una Docker imagen y utilice únicamente scripts de algoritmos de Python en sus trabajos.

  2. Utilice scripts de algoritmos escritos en un lenguaje que no sea Python con Hybrid Jobs o una arquitectura de CPU distinta de x86.

Definir el script de entrada del contenedor es más complejo en el caso 2.

Cuando Braket ejecuta tu Hybrid Job, lanza el número y el tipo de EC2 instancias de Amazon solicitados y, a continuación, ejecuta la Docker imagen especificada por el URI de la imagen para crear el trabajo en ellas. Al utilizar la función BYOC, debe especificar un URI de imagen alojado en un repositorio privado de Amazon ECR al que tiene acceso de lectura. Braket Hybrid Jobs utiliza esa imagen personalizada para ejecutar el trabajo.

Los componentes específicos que necesita para crear una Docker imagen que pueda usarse con Hybrid Jobs. Si no está familiarizado con la escritura y la creaciónDockerfiles, le sugerimos que consulte la documentación de Dockerfile y la Amazon ECR CLIdocumentación según sea necesario mientras lee estas instrucciones.

Una imagen base para tu Dockerfile

Si utilizas Python y quieres instalar software sobre lo que se proporciona en los contenedores proporcionados por Braket, una opción para una imagen base es una de las imágenes del contenedor de Braket, alojada en nuestro GitHub repositorio y en Amazon ECR. Tendrá que autenticarse en Amazon ECR para extraer la imagen y construir sobre ella. Por ejemplo, la primera línea del archivo BYOC Docker podría ser: FROM [IMAGE_URI_HERE]

A continuación, rellene el resto Dockerfile para instalar y configurar el software que desea añadir al contenedor. Las imágenes prediseñadas de Braket ya contienen el script de punto de entrada al contenedor adecuado, así que no tienes que preocuparte por incluirlo.

Si quieres usar un lenguaje que no sea Python, como C++, Rust o Julia, o si deseas crear una imagen para una arquitectura de CPU que no sea x86, como ARM, es posible que tengas que compilarla sobre una imagen pública básica. Puede encontrar muchas de estas imágenes en la galería pública de Amazon Elastic Container Registry. Asegúrese de elegir una que sea adecuada para la arquitectura de la CPU y, si es necesario, para la GPU que desee utilizar.

(Opcional) Un script de punto de entrada al contenedor modificado

nota

Si solo vas a añadir software adicional a una imagen de Braket prediseñada, puedes saltarte esta sección.

Para ejecutar código que no sea de Python como parte de su trabajo híbrido, tendrá que modificar el script de Python que define el punto de entrada del contenedor. Por ejemplo, el script de braket_container.py Python en Amazon Braket Github. Este es el script que utilizan las imágenes prediseñadas por Braket para lanzar el script de su algoritmo y establecer las variables de entorno adecuadas. El propio script del punto de entrada del contenedor debe estar en Python, pero puede lanzar scripts que no sean de Python. En el ejemplo prediseñado, puede ver que los scripts de algoritmos de Python se lanzan como un subproceso de Python o como un proceso completamente nuevo. Al modificar esta lógica, puede habilitar el script de punto de entrada para lanzar scripts de algoritmos que no sean de Python. Por ejemplo, puede modificar la thekick_off_customer_script()función para iniciar procesos de Rust en función del final de la extensión del archivo.

También puede optar por escribir una completamente nuevabraket_container.py. Debe copiar los datos de entrada, los archivos fuente y otros archivos necesarios de Amazon S3 al contenedor y definir las variables de entorno adecuadas.

Instale el software y el script de contenedor necesarios con Dockerfile

nota

Si utiliza una imagen Braket prediseñada como imagen Docker base, el script del contenedor ya está presente.

Si creó un script de contenedor modificado en el paso anterior, tendrá que copiarlo en el contenedor y definir la variable de entorno o el nombre SAGEMAKER_PROGRAM con braket_container.py el que ha denominado el nuevo script de punto de entrada del contenedor.

El siguiente es un ejemplo de un ejemplo Dockerfile que te permite usar Julia en instancias de Jobs aceleradas por la GPU:

FROM nvidia/cuda:12.2.0-devel-ubuntu22.04 ARG DEBIAN_FRONTEND=noninteractive ARG JULIA_RELEASE=1.8 ARG JULIA_VERSION=1.8.3 ARG PYTHON=python3.11 ARG PYTHON_PIP=python3-pip ARG PIP=pip ARG JULIA_URL = https://julialang-s3.julialang.org/bin/linux/x64/${JULIA_RELEASE}/ ARG TAR_NAME = julia-${JULIA_VERSION}-linux-x86_64.tar.gz ARG PYTHON_PKGS = # list your Python packages and versions here RUN curl -s -L ${JULIA_URL}/${TAR_NAME} | tar -C /usr/local -x -z --strip-components=1 -f - RUN apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ tzdata \ openssh-client \ openssh-server \ ca-certificates \ curl \ git \ libtemplate-perl \ libssl1.1 \ openssl \ unzip \ wget \ zlib1g-dev \ ${PYTHON_PIP} \ ${PYTHON}-dev \ RUN ${PIP} install --no-cache --upgrade ${PYTHON_PKGS} RUN ${PIP} install --no-cache --upgrade sagemaker-training==4.1.3 # Add EFA and SMDDP to LD library path ENV LD_LIBRARY_PATH="/opt/conda/lib/python${PYTHON_SHORT_VERSION}/site-packages/smdistributed/dataparallel/lib:$LD_LIBRARY_PATH" ENV LD_LIBRARY_PATH=/opt/amazon/efa/lib/:$LD_LIBRARY_PATH # Julia specific installation instructions COPY Project.toml /usr/local/share/julia/environments/v${JULIA_RELEASE}/ RUN JULIA_DEPOT_PATH=/usr/local/share/julia \ julia -e 'using Pkg; Pkg.instantiate(); Pkg.API.precompile()' # generate the device runtime library for all known and supported devices RUN JULIA_DEPOT_PATH=/usr/local/share/julia \ julia -e 'using CUDA; CUDA.precompile_runtime()' # Open source compliance scripts RUN HOME_DIR=/root \ && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \ && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \ && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \ && chmod +x /usr/local/bin/testOSSCompliance \ && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \ && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} ${PYTHON} \ && rm -rf ${HOME_DIR}/oss_compliance* # Copying the container entry point script COPY braket_container.py /opt/ml/code/braket_container.py ENV SAGEMAKER_PROGRAM braket_container.py

En este ejemplo, se descargan y ejecutan los scripts proporcionados por AWS para garantizar el cumplimiento de todas las licencias de código abierto pertinentes. Por ejemplo, atribuyendo correctamente cualquier código instalado regido por una. MIT license

Si necesitas incluir código no público, por ejemplo, código alojado en un repositorio privado GitHub o en un GitLab repositorio, no insertes claves SSH en la Docker imagen para acceder a él. En su lugar, Docker Compose utilízalas al compilar para permitir Docker el acceso a SSH en la máquina host en la que está integrado. Para obtener más información, consulta la guía Cómo usar claves SSH de forma segura en Docker para acceder a los repositorios privados de Github.

Cómo crear y cargar una imagen Docker

Una vez definido correctamenteDockerfile, ya puede seguir los pasos para crear un repositorio privado de Amazon ECR, si aún no existe uno. También puede crear, etiquetar y cargar la imagen de su contenedor en el repositorio.

Estás listo para crear, etiquetar e insertar la imagen. Consulta la documentación de compilación de Docker para obtener una explicación completa de las opciones docker build y algunos ejemplos.

Para el archivo de muestra definido anteriormente, puedes ejecutar:

aws ecr get-login-password --region ${your_region} | docker login --username AWS --password-stdin ${aws_account_id}.dkr.ecr.${your_region}.amazonaws.com docker build -t braket-julia . docker tag braket-julia:latest ${aws_account_id}.dkr.ecr.${your_region}.amazonaws.com/braket-julia:latest docker push ${aws_account_id}.dkr.ecr.${your_region}.amazonaws.com/braket-julia:latest

Asignación de los permisos de Amazon ECR adecuados

Braket Hybrid Jobs Dockerlas imágenes deben estar alojadas en repositorios privados de Amazon ECR. De forma predeterminada, un repositorio privado de Amazon ECR no proporciona acceso de lectura Braket Hybrid Jobs IAM role ni a ningún otro usuario que quiera usar su imagen, como un colaborador o un estudiante. Debe establecer una política de repositorio para conceder los permisos adecuados. Por lo general, solo debes dar permiso a los usuarios y IAM roles específicos a los que desees acceder a tus imágenes, en lugar de permitir que cualquier persona que tenga los permisos image URI los extraiga.