Utilisation de votre propre conteneur pour les pipelines

Outre la définition d'étapes de pipeline basées sur des travaux et des scripts, vous pouvez utiliser des images de conteneur personnalisées pour définir l'exécution d'étape.

Vous pouvez sélectionner l'image, la commande ou le point d'entrée du conteneur à exécuter. Vous pouvez fournir le code personnalisé dans un script ou une archive compressée, ce qui vous permet de mettre à jour le code sans reconstruire l'image.

Configuration de l'étape BYOC

  1. (Facultatif) Sélectionnez Dans le conteneur.
  2. Sous Configuration de conteneur, sélectionnez Configurer.
  3. Dans le panneau Configurer l'environnement de conteneur, procédez comme suit :
    1. Sélectionnez un référentiel dans la liste. Si le référentiel se trouve dans un autre compartiment, sélectionnez Modifier le compartiment.
    2. Sélectionnez une image dans la liste.
    3. (Facultatif) Entrez un point d'entrée. Pour en ajouter un autre, sélectionnez paramètre +Add.
    4. (Facultatif) Entrez un CMD. Pour en ajouter un autre, sélectionnez paramètre +Add.
    5. (Facultatif) Entrez une synthèse d'image.
    6. (Facultatif) Si vous utilisez la vérification de signature, entrez l'OCID de la signature d'image. Par exemple, ocid1.containerimagesignature.oc1.iad.aaaaaaaaab....
    7. Sélectionnez Sélectionner.
  4. (Facultatif) Chargez l'artefact d'étape en le faisant glisser dans la zone. Cette étape est facultative uniquement si BYOC est configuré.

Artefact de modèle

Le téléchargement d'un artefact d'étape lorsque vous utilisez BYOC est facultatif. Cependant, il vous permet de modifier le code exécuté dans le conteneur sans reconstruire l'image.

Les artefacts d'étape sont montés dans le conteneur vers le dossier /home/datascience/. Si un artefact est une archive, son contenu est extrait dans le dossier /home/datascience/decompressed_artifact.

Image docker commune
Il est pratique de créer une image de conteneur générique avec l'environnement requis (par exemple, Python 3.8 et les bibliothèques de base comme indiqué dans Démarrage rapide) et d'ajouter des scripts Python plus tard en tant qu'artefacts d'étape.
Artefacts personnalisés - Remplacement de dossier
Lorsque vous utilisez un artefact d'étape personnalisé, le service monte un volume avec l'artefact dans le dossier /home/datascience, en remplaçant le dossier dans l'image de conteneur. Les artefacts d'archive (zip/tar/...) sont décompressés et le contenu est présenté dans le dossier /home/datascience/decompressed_artifact.

Création d'un pipeline de conteneur - Démarrage rapide

Pour créer une étape de pipeline de conteneur, procédez comme suit.

Création du conteneur

  1. Utilisez une image existante dans OCI Registry ou créez une image à l'aide de l'exemple de fichier Dockerfile. Voici l'exemple de code qui crée une image permettant d'exécuter des scripts Python.
    Dockerfile :
    FROM python:3.8-slim AS base
     
    ENV DATASCIENCE_USER datascience
    ENV DATASCIENCE_UID 1000
    ENV HOME /home/$DATASCIENCE_USER
     
    RUN python -m pip install \
            oci \
            ocifs
     
    COPY simplest.py .
    CMD ["python", "simplest.py"]
    Le fichier Dockerfile suppose que le script simplest.py se trouve dans le même dossier. Voici un exemple de code pour simplest.py :
    import datetime
    import os
    import time
     
    pipe_id = os.environ.get("PIPELINE_RUN_OCID", "LOCAL")
    print(f"Starting pipeline run: {pipe_id}")
    print(f"Current timestamp in UTC: {datetime.datetime.utcnow()}")
     
    print("Delay 5s")
     
    time.sleep(5)
     
    print("Environment variables:")
     
    for item, value in os.environ.items():
        print(f"\t {item}: {value}")
  2. Exécutez la commande de build docker :
    docker build -t byoc:1.0.0 .

Test du conteneur

Avant de propager l'image vers un registre de conteneurs, vous pouvez la tester localement.

  1. Exécutez l'image localement :
    docker run --rm -it -v "/home/lin/.oci:/home/datascience/.oci" byoc:1.0.0
  2. Vérifiez que la sortie est semblable à ce qui suit :
    Starting pipeline run: LOCAL
    Current timestamp in UTC: 2024-03-07 14:44:08.506191
    Delay 5s
    Environment variables:
             PATH: /usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
             HOSTNAME: ae441d10f33e
             TERM: xterm
             LANG: C.UTF-8
             GPG_KEY: E3FF2839C048B25C084DEBE9B26995E310250568
             PYTHON_VERSION: 3.8.18
             PYTHON_PIP_VERSION: 23.0.1
             PYTHON_SETUPTOOLS_VERSION: 57.5.0
             PYTHON_GET_PIP_URL: https://github.com/pypa/get-pip/raw/dbf0c85f76fb6e1ab42aa672ffca6f0a675d9ee4/public/get-pip.py
             PYTHON_GET_PIP_SHA256: dfe9fd5c28dc98b5ac17979a953ea550cec37ae1b47a5116007395bfacff2ab9
             DATASCIENCE_USER: datascience
             DATASCIENCE_UID: 1000
             HOME: /home/datascience

Transmission du conteneur vers OCIR

Suivez les étapes décrites dans la documentation Container Registry pour générer un jeton d'authentification afin de vous connecter à OCIR.

  1. Connectez-vous à Oracle Container Repository (OCIR) :
    docker login -u '<tenant_namespace>/<username>' <region>.ocir.io
    Pour plus d'informations, reportez-vous à la documentation Container Registry.
  2. Balisez l'image de conteneur local :
    docker tag <local_image_name>:<local_version>
     <region>.ocir.io/<tenancy_ocir_namespace>/<repo>:<version>
    docker tag byoc:1.0.0 iad.ocir.io/testtenancy/byoc:1.0.0
    Pour plus d'informations, reportez-vous à la documentation Container Registry.
  3. Poussez l'image balisée vers OCI :
    docker push <region>.ocir.io/<tenancy_ocid_namespace>/<repo>:<version>
    docker push byoc:1.0.0 iad.ocir.io/testtenancy/byoc:1.0.0
    Pour plus d'informations, reportez-vous à la documentation Container Registry.

Création du pipeline

Reportez-vous à la section Stratégies de pipeline pour vous assurer que vous disposez de stratégies qui permettent à la ressource d'exécution de pipeline d'extraire des images de conteneur à partir du registre de conteneurs.

Créez un pipeline pour utiliser le conteneur.
  1. Créez un pipeline avec le nom approprié, par exemple BYOC Demo name.
  2. Sélectionnez Ajouter des étapes de pipeline.
  3. Indiquez le nom de l'étape, par exemple Step 1.
  4. Pour utiliser votre propre conteneur, sélectionnez A partir du conteneur.
  5. Dans Configuration de conteneur, sélectionnez Configurer.
  6. Dans Configurer l'environnement de conteneur, procédez comme suit :
    1. Sélectionnez le démarrage rapide ou le byoc du référentiel dans la liste. Si le référentiel se trouve dans un autre compartiment, sélectionnez Modifier le compartiment.
    2. Sélectionnez l'image iad.ocir.io/idtlxnfdweil/quickstart/byoc:1.0.0 dans la liste.
    3. Sélectionnez Sélectionner.
  7. Sélectionnez Enregistrer.
  8. Facultatif : Définissez la journalisation.
  9. Choisissez Créer.

Activation des journaux de pipeline

Créez un pipeline et démarrez-le.
Cette tâche est facultative, si vous ne voulez pas générer les journaux, vous pouvez l'ignorer.
  1. Dans la liste des pipelines, sélectionnez le pipeline à activer.
  2. Sur la page de détails du pipeline, sélectionnez Journaux.
  3. Sélectionnez Activer les journaux.

Configurations prises en charge

Informations importantes sur les configurations prises en charge.

  • Les pipelines ML prennent uniquement en charge les images de conteneur résidant dans OCI Registry.
  • La taille de l'image de conteneur est limitée à 40 Go sous forme non compressée.
  • L'utilisateur qui crée la ressource de pipeline d'apprentissage automatique doit avoir accès à l'image de conteneur dans OCI Registry. Sinon, créez une stratégie IAM d'accès utilisateur avant de créer la ressource de pipeline d'apprentissage automatique.

Images de conteneurs sur Apple Silicon M1 Mac

Pour plus d'informations, reportez-vous à Image Docker sur Apple sur M1 MacBook.

Condensé d'image

Les images d'un registre de conteneurs sont identifiées par un référentiel, un nom et une balise. En outre, Docker attribue à chaque version d'image un condensé alphanumérique unique. Lors de la propagation d'une image de conteneur mise à jour, nous vous recommandons d'attribuer à l'image mise à jour une nouvelle balise pour l'identifier, plutôt que de réutiliser une balise existante, comme meilleure pratique. Toutefois, même si vous propagez une image mise à jour avec le même nom et la même balise qu'une version antérieure, la nouvelle version propagée dispose d'un condensé différent de la version précédente.

Lorsque vous créez une ressource de pipeline, vous indiquez le nom et la balise d'une version particulière d'une image. Pour éviter les incohérences ultérieurement, les pipelines enregistrent également le condensé unique de cette version particulière de l'image. Vous pouvez également fournir la synthèse de l'image lors de la création de la ressource de pipeline.

Par défaut, si vous propagez une version mise à jour d'une image vers le registre Docker avec les mêmes nom et balise que la version d'origine de l'image, les pipelines continuent à utiliser le condensé d'origine pour extraire la version d'origine de l'image. Ce comportement peut être celui dont vous avez besoin. Toutefois, si vous voulez que les pipelines extraient la version ultérieure de l'image, vous pouvez modifier explicitement le nom de l'image avec la balise et le condensé utilisés par les pipelines pour identifier la version de l'image à extraire.