

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Recette pour apporter votre propre contenant
<a name="bring-own-container-recipe"></a>

Dans cette section, nous vous expliquons étape par étape ce dont vous avez besoin bring your own container (BYOC) pour utiliser Braket Hybrid Jobs : les scripts, les fichiers et les étapes à suivre pour les combiner pour être opérationnel avec vos images personnaliséesDocker. Les recettes pour deux cas courants :

1. Installez des logiciels supplémentaires dans une Docker image et utilisez uniquement des scripts d'algorithme Python dans vos tâches.

1. Utilisez des scripts d'algorithme écrits dans un langage autre que Python avec Hybrid Jobs, ou utilisez une architecture de processeur autre que x86.

La définition du script de saisie du * conteneur * est plus complexe dans le cas 2.

Lorsque Braket exécute votre tâche hybride, il lance le nombre et le type d'instances Amazon EC2 demandés, puis exécute l'Dockerimage spécifiée par l'URI de l'image pour créer une tâche sur celles-ci. Lorsque vous utilisez la fonctionnalité BYOC, vous spécifiez un URI d'image hébergé dans un référentiel Amazon ECR [ privé ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html) auquel vous avez un accès en lecture. Braket Hybrid Jobs utilise cette image personnalisée pour exécuter la tâche.

Les composants spécifiques dont vous avez besoin pour créer une Docker image utilisable avec Hybrid Jobs. Si vous n'êtes pas familiarisé avec l'écriture et la création`Dockerfiles`, reportez-vous à la documentation [ Dockerfile ](https://docs.docker.com/reference/dockerfile/) et à la documentation. [Amazon ECR CLI](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)

**Topics**
+ [Une image de base pour votre Dockerfile](#base-image-dockerfile)
+ [(Facultatif) Un script de point d'entrée de conteneur modifié](#modified-container-entry-point)
+ [Installez le logiciel et le script de conteneur nécessaires avec `Dockerfile`](#install-docketfile)

## Une image de base pour votre Dockerfile
<a name="base-image-dockerfile"></a>

Si vous utilisez Python et que vous souhaitez installer un logiciel en plus de ce qui est fourni dans les conteneurs fournis par Braket, une option pour une image de base est l'une des images du conteneur Braket, hébergées dans notre [ GitHub dépôt et sur ](https://github.com/amazon-braket/amazon-braket-containers) Amazon ECR. Vous devrez vous [ authentifier auprès d'Amazon ECR ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-authenticate-registry) pour extraire l'image et la construire à partir de celle-ci. Par exemple, la première ligne de votre Docker fichier BYOC peut être : `FROM [IMAGE_URI_HERE]`

Ensuite, remplissez le reste des informations Dockerfile pour installer et configurer le logiciel que vous souhaitez ajouter au conteneur. Les images Braket prédéfinies contiennent déjà le script de point d'entrée du conteneur approprié, vous n'avez donc pas à vous soucier de l'inclure.

Si vous souhaitez utiliser un langage autre que Python, tel que C\+\+, Rust ou Julia, ou si vous souhaitez créer une image pour une architecture de processeur non x86, comme ARM, vous devrez peut-être créer à partir d'une image publique simple. Vous trouverez de nombreuses images de ce type dans la galerie publique [ Amazon Elastic Container Registry](https://gallery.ecr.aws/). Assurez-vous de choisir celui qui convient à l'architecture du processeur et, si nécessaire, au GPU que vous souhaitez utiliser.

## (Facultatif) Un script de point d'entrée de conteneur modifié
<a name="modified-container-entry-point"></a>

**Note**  
Si vous ajoutez uniquement des logiciels supplémentaires à une image Braket prédéfinie, vous pouvez ignorer cette section.

Pour exécuter du code non Python dans le cadre de votre tâche hybride, modifiez le script Python qui définit le point d'entrée du conteneur. Par exemple, le script [`braket_container.py` python sur Amazon Braket Github. ](https://github.com/amazon-braket/amazon-braket-containers/blob/main/src/braket_container.py) Il s'agit du script que les images pré-créées par Braket utilisent pour lancer le script de votre algorithme et définir les variables d'environnement appropriées. Le script du point d'entrée du conteneur lui-même ** doit ** être en Python, mais il peut lancer des scripts non Python. Dans l'exemple prédéfini, vous pouvez voir que les scripts d'algorithmes Python sont lancés soit en tant que sous-processus [ Python, ](https://github.com/amazon-braket/amazon-braket-containers/blob/main/src/braket_container.py#L274) soit en tant que processus [ entièrement nouveau. ](https://github.com/amazon-braket/amazon-braket-containers/blob/main/src/braket_container.py#L257) En modifiant cette logique, vous pouvez activer le script du point d'entrée pour lancer des scripts d'algorithme non Python. Par exemple, vous pouvez modifier la [`thekick_off_customer_script()`](https://github.com/amazon-braket/amazon-braket-containers/blob/main/src/braket_container.py#L139) fonction pour lancer les processus Rust en fonction de la fin de l'extension du fichier.

Vous pouvez également choisir d'en écrire un tout nouveau`braket_container.py`. Il doit copier les données d'entrée, les archives sources et les autres fichiers nécessaires depuis Amazon S3 dans le conteneur, et définir les variables d'environnement appropriées.

## Installez le logiciel et le script de conteneur nécessaires avec `Dockerfile`
<a name="install-docketfile"></a>

**Note**  
Si vous utilisez une image Braket prédéfinie comme image de Docker base, le script de conteneur est déjà présent.

Si vous avez créé un script de conteneur modifié à l'étape précédente, vous devez le copier dans le conteneur ** et ** définir la variable d'environnement ou le nom que vous avez donné `SAGEMAKER_PROGRAM` à `braket_container.py` votre nouveau script de point d'entrée de conteneur.

Voici un exemple `Dockerfile` qui vous permet d'utiliser Julia sur les instances GPU-accelerated Jobs :

```
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
```

Cet exemple télécharge et exécute les scripts fournis par AWS pour garantir la conformité avec toutes les Open-Source licences pertinentes. Par exemple, en attribuant correctement tout code installé régi par unMIT license.

Si vous devez inclure du code non public, par exemple du code hébergé dans un espace privé GitHub ou un GitLab référentiel, n'**intégrez ** pas de clés SSH dans l'Dockerimage pour y accéder. Utilisez-le plutôt Docker Compose lors de la compilation pour autoriser Docker l'accès à SSH sur la machine hôte sur laquelle il est construit. Pour plus d'informations, consultez le guide Utilisation [ sécurisée des clés SSH dans Docker pour accéder aux dépôts ](https://www.fastruby.io/blog/docker/docker-ssh-keys.html) Github privés.

**Création et téléchargement de votre image Docker **

Une fois que vous avez correctement défini`Dockerfile`, vous êtes maintenant prêt à suivre les étapes pour [ créer un référentiel Amazon ECR privé](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html), s'il n'en existe pas déjà un. Vous pouvez également créer, baliser et télécharger votre image de conteneur dans le référentiel.

Vous êtes prêt à créer, baliser et diffuser l'image. Consultez la documentation de compilation de [ Docker ](https://docs.docker.com/reference/cli/docker/buildx/build/) pour une explication complète des options `docker build` et quelques exemples.

Pour le fichier d'exemple défini ci-dessus, vous pouvez exécuter :

```
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
```

**Attribution des autorisations Amazon ECR appropriées **

Braket Hybrid Jobs Dockerles images doivent être hébergées dans des référentiels Amazon ECR privés. Par défaut, un dépôt Amazon ECR privé ne ** fournit ** pas d'accès en lecture à Braket Hybrid Jobs IAM role ni à aucun autre utilisateur souhaitant utiliser votre image, tel qu'un collaborateur ou un étudiant. Vous devez [ définir une politique de référentiel ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/set-repository-policy.html) pour accorder les autorisations appropriées. En général, n'autorisez que les utilisateurs et les IAM rôles spécifiques auxquels vous souhaitez accéder à vos images, au lieu de permettre image URI à quiconque les détient de les extraire.