Bring Your Own Container (BYOC) für Pipelines

Neben der Definition von Pipelineschritten auf Basis von Jobs und Skripten können Sie benutzerdefinierte Containerimages verwenden, um die Schrittlaufzeit zu definieren.

Sie können das Containerimage, den Befehl oder den Einstiegspunkt für die Containerausführung auswählen. Sie können den benutzerdefinierten Code in einem Skript oder einem komprimierten Archiv angeben, mit dem Sie den Code aktualisieren können, ohne das Image neu zu erstellen.

BYOC-Schrittkonfiguration

  1. (Optional) Wählen Sie Aus Container aus.
  2. Wählen Sie unter Containerkonfiguration die Option Konfigurieren aus.
  3. Führen Sie im Bereich Containerumgebung konfigurieren folgende Schritte aus:
    1. Wählen Sie ein Repository aus der Liste. Wenn sich das Repository in einem anderen Compartment befindet, wählen Sie Compartment ändern aus.
    2. Wählen Sie ein Image aus der Liste.
    3. (Optional) Geben Sie einen Einstiegspunkt ein. Um einen weiteren hinzuzufügen, wählen Sie Parameter +Add aus.
    4. (Optional) Geben Sie eine CMD ein. Um einen weiteren hinzuzufügen, wählen Sie Parameter +Add aus.
    5. (Optional) Geben Sie einen Image-Digest ein.
    6. (Optional) Wenn Sie die Signaturüberprüfung verwenden, geben Sie die OCID der Imagesignatur ein. Beispiel: ocid1.containerimagesignature.oc1.iad.aaaaaaaaab....
    7. Wählen Sie Auswählen aus.
  4. (Optional) Laden Sie das Schrittartefakt hoch, indem Sie es in das Feld ziehen. Dieser Schritt ist nur optional, wenn BYOC konfiguriert ist.

Modellartefakt

Das Hochladen eines Schrittartefakts bei Verwendung von BYOC ist optional. Sie können jedoch den Code ändern, der im Container ausgeführt wird, ohne das Image neu zu erstellen.

Die Schrittartefakte werden im Container im Ordner /home/datascience/ gemountet. Wenn ein Artefakt ein Archiv ist, wird sein Inhalt in den Ordner /home/datascience/decompressed_artifact extrahiert.

Allgemeines Docker-Bild
Es ist praktisch, ein generisches Containerimage mit der erforderlichen Umgebung zu erstellen (z.B. Python 3.8 und Basisbibliotheken, wie im Schnellstart gezeigt), und Python-Skripte später als Schrittartefakte hinzuzufügen.
Benutzerdefinierte Artefakte - Ordnerüberschreibung
Wenn Sie ein benutzerdefiniertes Schrittartefakt verwenden, hängt der Service ein Volume mit dem Artefakt in den Ordner /home/datascience ein und überschreibt den Ordner in Ihrem Containerimage. Archivartefakte (zip/tar/...) werden dekomprimiert, und der Inhalt wird im Ordner /home/datascience/decompressed_artifact angezeigt.

Containerpipeline erstellen - Schnellstart

So erstellen Sie einen Container-Pipeline-Schritt:

Container erstellen

  1. Verwenden Sie ein vorhandenes Image in der OCI-Registry, oder erstellen Sie ein neues Image mit der Beispiel-Dockerfile. Im Folgenden finden Sie den Beispielcode, der ein Image erstellt, mit dem Sie Python-Skripte ausführen können.
    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"]
    Die Dockerfile geht davon aus, dass sich das Skript simplest.py im selben Ordner befindet. Hier ist ein Beispielcode für 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. Führen Sie den Befehl docker build aus:
    docker build -t byoc:1.0.0 .

Container testen

Bevor Sie das Image in eine Container-Registry übertragen, können Sie es lokal testen.

  1. Führen Sie das Image lokal aus:
    docker run --rm -it -v "/home/lin/.oci:/home/datascience/.oci" byoc:1.0.0
  2. Vergewissern Sie sich, dass die Ausgabe ähnlich ist:
    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

Container an OCIR übergeben

Befolgen Sie die Schritte in der Container Registry-Dokumentation, um ein Authentifizierungstoken zu generieren, um sich bei OCIR anzumelden.

  1. Melden Sie sich bei Oracle Container Repository (OCIR) an:
    docker login -u '<tenant_namespace>/<username>' <region>.ocir.io
    Weitere Informationen finden Sie in der Container Registry-Dokumentation.
  2. Lokales Containerimage taggen:
    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
    Weitere Informationen finden Sie in der Container Registry-Dokumentation.
  3. Verschicken Sie das getaggte Image per Push an 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
    Weitere Informationen finden Sie in der Container Registry-Dokumentation.

Pipeline erstellen

Im Abschnitt Pipeline-Policys können Sie sicherstellen, dass Sie über Policys verfügen, mit denen die Pipeline Containerimages aus der Container-Registry abrufen kann.

Erstellen Sie eine Pipeline zur Verwendung des Containers.
  1. Erstellen Sie eine Pipeline mit einem entsprechenden Namen, z.B. BYOC Demo name.
  2. Wählen Sie Pipelineschritte hinzufügen aus.
  3. Benennen Sie den Schritt, z.B. Step 1.
  4. Um "Eigenen Container verwenden" zu verwenden, wählen Sie Aus Container aus.
  5. Wählen Sie unter Containerkonfiguration die Option Konfigurieren aus.
  6. Gehen Sie unter Containerumgebung konfigurieren wie folgt vor:
    1. Wählen Sie den Repository-Schnellstart oder das Byoc aus der Liste aus. Wenn sich das Repository in einem anderen Compartment befindet, wählen Sie Compartment ändern aus.
    2. Wählen Sie das Bild iad.ocir.io/idtlxnfdweil/quickstart/byoc:1.0.0 aus der Liste aus.
    3. Wählen Sie Auswählen aus.
  7. Klicken Sie auf Speichern.
  8. Optional: Logging definieren.
  9. Wählen Sie Erstellen.

Pipelinelogs aktivieren

Erstellen Sie eine Pipeline, und starten Sie sie.
Diese Aufgabe ist optional. Wenn Sie die Logs nicht generieren möchten, können Sie sie ignorieren.
  1. Wählen Sie aus der Liste der Pipelines die Pipeline aus, die Sie aktivieren möchten.
  2. Wählen Sie auf der Seite mit den Pipelinedetails die Option Logs aus.
  3. Wählen Sie Logs aktivieren.

Unterstützte Konfigurationen

Wichtige Informationen zu unterstützten Konfigurationen.

  • ML-Pipelines unterstützen nur Containerimages, die sich in der OCI-Registry befinden.
  • Die Größe des Containerimages ist in unkomprimierter Form auf 40 GB begrenzt.
  • Der Benutzer, der die ML-Pipelineressource erstellt, muss Zugriff auf das Containerimage in der OCI-Registry haben. Falls nicht, erstellen Sie eine IAM-Policy für den Benutzerzugriff, bevor Sie die ML-Pipelineressource erstellen.

Container-Images auf Apple Silicon M1 Mac

Weitere Informationen finden Sie unter Docker-Image auf Apple an M1 MacBook.

Imagedigests

Images in einer Container-Registry werden durch Repository, Name und Tag identifiziert. Außerdem gibt Docker jeder Version eines Images einen eindeutigen alphanumerischen Digest. Beim Push eines aktualisierten Containerimages wird empfohlen, dem aktualisierten Image ein neues Tag zur Identifizierung zu geben, anstatt ein vorhandenes Tag als Best Practice wiederzuverwenden. Selbst wenn Sie ein aktualisiertes Image übertragen und diesem den Namen und das Tag einer früheren Version geben, hat die neu übertragene Version einen anderen Digest als die frühere Version.

Wenn Sie eine Pipelineressource erstellen, geben Sie den Namen und das Tag einer bestimmten Version eines Images an. Um später Inkonsistenzen zu vermeiden, zeichnen Pipelines auch den eindeutigen Digest dieser bestimmten Version des Images auf. Sie können auch den Digest des Images beim Erstellen der Pipelineressource angeben.

Wenn Sie eine aktualisierte Version eines Images mit demselben Namen und Tag wie die ursprüngliche Version des Images in die Docker-Registry übertragen, verwenden Pipelines standardmäßig weiterhin den ursprünglichen Digest, um die ursprüngliche Version des Images abzurufen. Dies könnte das gewünschte Verhalten sein. Wenn Sie jedoch möchten, dass Pipelines die spätere Version des Images abrufen, können Sie den Imagenamen mit dem Tag explizit ändern und verdauen, mit dem Pipelines die abzurufende Version des Images identifizieren.