Modell mit dem OCI-Python-SDK erstellen und speichern
Erstellen Sie ein Modell mit Python, und speichern Sie es direkt im Modellkatalog.
Um ein Modell zu erstellen und zu speichern, müssen Sie zuerst das Modellartefakt erstellen.
Es wird empfohlen, Modelle stattdessen programmgesteuert mit ADS oder dem OCI-Python-SDK im Modellkatalog zu erstellen und zu speichern.
-
Es wird empfohlen, Modelle stattdessen programmgesteuert mit ADS oder dem OCI-Python-SDK im Modellkatalog zu erstellen und zu speichern.
-
Mit ADS können Sie große Modelle erstellen. Große Modelle haben Artefaktbeschränkungen von bis zu 400 GB.
- (Optional) Aktualisieren Sie das OCI-Python-SDK mit
.pip install oci –upgrade
-
Speichern Sie ein Modellobjekt auf dem Datenträger. Sie können ein Modell mit verschiedenen Tools speichern (Joblib, cloudpickle, Pickle, ONNX usw.). Es wird empfohlen, ein Modellobjekt im Verzeichnis der obersten Ebene des Modellartefakts und auf derselben Ebene wie die Dateien
score.py
undruntime.yaml
zu speichern. -
Ändern Sie die Datei
score.py
, um die Funktionenload_model()
undpredict()
zu definieren. Ändern Sie den Body beider Funktionen wie folgt, um Ihr Modell zu unterstützen:load_model()
-
Liest die Modelldatei auf dem Datenträger und gibt das Schätzerobjekt zurück. Stellen Sie sicher, dass Sie dieselbe Library zum Serialisieren und Deserialisieren des Modellobjekts verwenden.
predict()
-
Enthält zwei Parameter:
data
undmodel
. Der erforderliche Parameter istdata
, der eine Dataset Payload darstellt, während "model" ein optionaler Parameter ist. Standardmäßig istmodel
das vonload_model()
zurückgegebene Objekt. Stellen Sie sicher, dass der Datentyp des data-Parameters mit dem für das Modell-Deployment erwarteten Payload-Format übereinstimmt.Standardmäßig wird beim Modell-Deployment davon ausgegangen, dass
data
eine JSON-Payload ist (MIME type application/JSON
). Die Funktionpredict()
konvertiert die JSON-Payload in ein Modellobjektdatenformat. Beispiel: Ein Pandas-Datenframe oder ein Numpy-Array, wenn dieses Datenformat vom Modellobjekt unterstützt wird. Der Body vonpredict()
kann Datentransformationen und andere Datenmanipulationsaufgaben enthalten, bevor eine Modellvorhersage erstellt wird.
Weitere Hinweise:
- Sie können die Funktionssignaturen von
load_model()
undpredict()
nicht bearbeiten. Sie können nur den Body dieser Funktionen bearbeiten, um sie anzupassen. - Wenn benutzerdefinierte Python-Module in der Artefaktdatei verfügbar sind, können sie mit
score.py
oder als Teil der Conda-Umgebung, die für Inferenzzwecke verwendet wird, importiert werden. -
Sie können mehrere Modellobjekte in Ihrem Artefakt speichern. Sie können mehrere Schätzerobjekte in den Arbeitsspeicher laden, um eine Ensembleauswertung durchzuführen. In diesem Fall kann
load_model()
ein Array von Modellobjekten zurückgeben, die vonpredict()
verarbeitet werden.
- (Optional) Testen Sie die Funktion
score.predict()
.Es wird empfohlen, die Funktion
predict()
in Ihrer lokalen Umgebung zu testen, bevor Sie das Modell im Modellkatalog speichern. Im folgenden Code-Snippet wird dargestellt, wie Sie eine JSON-Payload an predict übergeben, die das Verhalten Ihres mit dem Modell-Deployment bereitgestellten Modells imitiert. Auf diese Weise können Sie sicherstellen, dass das Modellobjekt vonload_model()
gelesen wird. Außerdem stellen Sie so sicher, dass die von Ihren Modellen zurückgegebenen Vorhersagen korrekt sind und das erwartete Format aufweisen. Wenn Sie dieses Code-Snippet in einer Notizbuchsession ausführen, erhalten Sie auch die Ausgabe aller Logger, die Sie inscore.py
in der Ausgabezelle definieren.import sys from json import dumps # The local path to your model artifact directory is added to the Python path. # replace <your-model-artifact-path> sys.path.insert(0, f"
<your-model-artifact-path>
") # importing load_model() and predict() that are defined in score.py from score import load_model, predict # Loading the model to memory _ = load_model() # Take a sample of your training or validation dataset and store it as data. # Making predictions on a JSON string object (dumps(data)). Here we assume # that predict() is taking data in JSON format predictions_test = predict(dumps(data), _) # Compare the predictions captured in predictions_test with what you expect for data: predictions_test -
Ändern Sie die
runtime.yaml
-Datei.Diese Datei enthält eine Referenz zur Conda-Umgebung, die Sie für die Laufzeitumgebung für das Modell-Deployment verwenden möchten. Die Datei muss mindestens die folgenden Felder für ein Modell-Deployment enthalten:
MODEL_ARTIFACT_VERSION: '3.0' MODEL_DEPLOYMENT: INFERENCE_CONDA_ENV: INFERENCE_ENV_SLUG:
<the-slugname>
# for example mlcpuv1 see: https://docs.oracle.com/en-us/iaas/Content/data-science/using/conda-gml-fam.htm INFERENCE_ENV_TYPE:<env-type>
# can either be "published" or "data_science" INFERENCE_ENV_PATH:<conda-path-on-object-storage>
INFERENCE_PYTHON_VERSION:<python-version-of-conda-environment>
Im Folgenden sehen Sie ein Beispiel für eine
runtime.yaml
-Datei. Der Data Scientist wählt die Conda-Umgebung TensorFlow aus.MODEL_ARTIFACT_VERSION: '3.0' MODEL_DEPLOYMENT: INFERENCE_CONDA_ENV: INFERENCE_ENV_SLUG: tensorflow23_p37_cpu_v1 INFERENCE_ENV_TYPE: data_science INFERENCE_ENV_PATH: oci://service-conda-packs@id19sfcrra6z/service_pack/cpu/Tensorflow for CPU Python 3.7/1.0/tensorflow23_p37_cpu_v1 INFERENCE_PYTHON_VERSION: '3.7'
- (Optional) (Empfohlen) Bevor Sie ein Modell im Katalog speichern, sollten Sie eine Reihe von Introspektionstests für Ihr Modellartefakt ausführen.
Zweck dieser Tests ist es, Fehler zu identifizieren. Dazu werden die Dateien
score.py
undruntime.yaml
mit einer Gruppe von Prüfungen validiert, um sicherzustellen, dass sie die richtige Syntax, Parameter und Versionen haben. Introspektionstests werden als Teil der Modellartefakt-Codevorlage definiert.-
Python Version 3.5 oder höher ist zur Ausführung der Tests erforderlich. Bevor Sie die Tests lokal auf Ihrem Rechner ausführen, müssen Sie die Python-Librarys
pyyaml
undrequests
installieren. Diese Installation muss nur einmal ausgeführt werden.Gehen Sie zum Artefaktverzeichnis. Führen Sie den folgenden Befehl aus, um die erforderlichen Drittanbieterabhängigkeiten zu installieren:
python3 -m pip install --user -r artifact-introspection-test/requirements.txt
-
Führen Sie die Tests lokal aus, indem Sie
<artifact-directory>
durch den Pfad zum Modellartefaktverzeichnis ersetzen:python3 artifact-introspection-test/model_artifact_validate.py --artifact
<artifact-path>
-
Prüfen Sie die Testergebnisse.
Das Skript
model_artifact_validate.py
generiert zwei Ausgabedateien im obersten Verzeichnis Ihrer Modellartefakte:-
test_json_output.json
-
test_html_output.html
Sie können beide Dateien öffnen, um die Fehler zu prüfen. Wenn Sie die HTML-Datei öffnen, werden Fehlermeldungen im roten Hintergrund angezeigt.
-
- Führen Sie die Schritte 2 bis 6 aus, bis alle Tests erfolgreich ausgeführt werden. Nachdem die Tests erfolgreich ausgeführt wurden, kann das Modellartefakt im Modellkatalog gespeichert werden.
-
Python Version 3.5 oder höher ist zur Ausführung der Tests erforderlich. Bevor Sie die Tests lokal auf Ihrem Rechner ausführen, müssen Sie die Python-Librarys
-
Erstellen und speichern Sie das Modell mit dem OCI-SDK und einer OCI-Konfigurationsdatei, die Teil des standardmäßigen SDK-Zugriffsmanagements ist, im Modellkatalog.
-
Initialisieren Sie den Client mit:
# Create a default config using DEFAULT profile in default location # Refer to # https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File # for more info import oci from oci.data_science.models import CreateModelDetails, Metadata, CreateModelProvenanceDetails, UpdateModelDetails, UpdateModelProvenanceDetails config = oci.config.from_file() data_science_client = oci.data_science.DataScienceClient(config=config) # Initialize service client with user principal (config file) config = oci.config.from_file() data_science_client = oci.data_science.DataScienceClient(config=config) # Alternatively initialize service client with resource principal (for example in a notebook session) # auth = oci.auth.signers.get_resource_principals_signer() # data_science_client = oci.data_science.DataScienceClient({}, signer=auth)
- (Optional) Dokumentieren Sie die Modellherkunft.
Beispiel:
provenance_details = CreateModelProvenanceDetails(repository_url="EXAMPLE-repositoryUrl-Value", git_branch="EXAMPLE-gitBranch-Value", git_commit="EXAMPLE-gitCommit-Value", script_dir="EXAMPLE-scriptDir-Value", # OCID of the ML job Run or Notebook session on which this model was # trained training_id="
<Notebooksession or ML Job Run OCID>
" ) - (Optional) Dokumentieren Sie die Modelltaxonomie.
Beispiel:
# create the list of defined metadata around model taxonomy: defined_metadata_list = [ Metadata(key="UseCaseType", value="image_classification"), Metadata(key="Framework", value="keras"), Metadata(key="FrameworkVersion", value="0.2.0"), Metadata(key="Algorithm",value="ResNet"), Metadata(key="hyperparameters",value="{\"max_depth\":\"5\",\"learning_rate\":\"0.08\",\"objective\":\"gradient descent\"}") ]
- (Optional) Fügen Sie Ihre benutzerdefinierten Metadaten hinzu (Attribute).
Beispiel:
# Adding your own custom metadata: custom_metadata_list = [ Metadata(key="Image Accuracy Limit", value="70-90%", category="Performance", description="Performance accuracy accepted"), Metadata(key="Pre-trained environment", value="https://blog.floydhub.com/guide-to-hyperparameters-search-for-deep-learning-models/", category="Training environment", description="Environment link for pre-trained model"), Metadata(key="Image Sourcing", value="https://lionbridge.ai/services/image-data/", category="other", description="Source for image training data") ]
- (Optional) Dokumentieren Sie die Definitionen für die Eingabe- und Ausgabedatenschemas des Modells.
Wichtig
Die Schemadefinition für Eingabefeaturevektor und Modellvorhersagen wird zu Dokumentationszwecken verwendet. Diese Richtlinie gilt nur für tabellarische Datasets.
Beispiel:
import json from json import load # Declare input/output schema for our model - this is optional # It must be a valid json or yaml string # Schema like model artifact is immutable hence it is allowed only at the model creation time and cannot be updated # Schema json sample in appendix input_schema = load(open('SR_input_schema.json','rb')) input_schema_str= json.dumps(input_schema) output_schema = load(open('SR_output_schema.json','rb')) output_schema_str= json.dumps(output_schema)
- (Optional) Dokumentieren Sie die Ergebnisse des Introspektionstests.
Beispiel:
# Provide the introspection test results test_results = load(open('test_json_output.json','rb')) test_results_str = json.dumps(test_results) defined_metadata_list.extend([Metadata(key="ArtifactTestResults", value=test_results_str)])
- (Optional) Legen Sie den Clienttimeoutwert fest, um einen Timeoutfehler beim Speichern großer Modellartefakte zu vermeiden:
import oci config = oci.config.from_file() data_science_client = oci.data_science.DataScienceClient(config=config) # Change the timeout value to 1800 sec (30 mins) data_science_client.base_client.timeout = 30 * 60
-
Erstellen Sie ein ZIP-Archiv des Modellartefakts:
import zipfile import os def zipdir(target_zip_path, ziph, source_artifact_directory): ''' Creates a zip archive of a model artifact directory. Parameters: - target_zip_path: the path where you want to store the zip archive of your artifact - ziph: a zipfile.ZipFile object - source_artifact_directory: the path to the artifact directory. Returns a zip archive in the target_zip_path you specify. ''' for root, dirs, files in os.walk(source_artifact_directory): for file in files: ziph.write(os.path.join(root, file), os.path.relpath(os.path.join(root,file), os.path.join(target_zip_path,'.'))) zipf = zipfile.ZipFile('<relpath-to-artifact-directory>.zip', 'w', zipfile.zip_DEFLATED) zipdir('.', zipf, "<relpath-to-artifact-directory>") zipf.close()
-
Erstellen (speichern) Sie das Modell im Modellkatalog:
# creating a model details object: model_details = CreateModelDetails( compartment_id='<compartment-ocid-of-model>', project_id='<project-ocid>', display_name='<display-name-of-model>', description='<description-of-model>', custom_metadata_list=custom_metadata_list, defined_metadata_list=defined_metadata_list, input_schema=input_schema_str, output_schema=output_schema_str) # creating the model object: model = data_science_client.create_model(model_details) # adding the provenance: data_science_client.create_model_provenance(model.data.id, provenance_details) # adding the artifact: with open('<relpath-to-artifact-directory>.zip','rb') as artifact_file: artifact_bytes = artifact_file.read() data_science_client.create_model_artifact(model.data.id, artifact_bytes, content_disposition='attachment; filename="<relpath-to-artifact-directory>.zip"')
-
Initialisieren Sie den Client mit:
- Jetzt können Sie die Modelldetails und die Modellinformationen anzeigen, einschließlich optionaler Metadaten, die Sie definiert haben.
Verwenden Sie diese Beispielcodedateien und Notizbuchbeispiele, um einen Modellspeicher weiter zu entwerfen.