Compartir a través de


Tutorial 2: Experimentación y entrenamiento de modelos mediante características

Esta serie de tutoriales muestra cómo las características integran a la perfección todas las fases del ciclo de vida del aprendizaje automático: creación de prototipos, entrenamiento y operacionalización.

El primer tutorial mostraba cómo crear una especificación de conjunto de características con transformaciones personalizadas, y después usar ese conjunto de características para generar datos de entrenamiento, habilitar la materialización y realizar una reposición. Este tutorial muestra cómo habilitar la materialización y realizar un reposición. También muestra cómo experimentar con características, como una manera de mejorar el rendimiento del modelo.

En este tutorial, aprenderá a:

  • Crear un prototipo de una nueva especificación de conjunto de características accounts con los valores precalculados existentes como características. Después, registrar la especificación del conjunto de características local como conjunto de características en el almacén de características. Este proceso difiere del primer tutorial, en el que ha creado un conjunto de características que tenía transformaciones personalizadas.
  • Seleccione las características del modelo de los conjuntos de características transactions y accounts, y guárdelas como especificación de recuperación de características.
  • Ejecutar una canalización de entrenamiento que use la especificación de recuperación de características para entrenar un nuevo modelo. Esta canalización usa el componente integrado de recuperación de características para generar los datos de entrenamiento.

Requisitos previos

Antes de continuar con este tutorial, asegúrate de completar el primero de la serie.

Configurar

  1. Configure el cuaderno de Spark de Azure Machine Learning.

    Puede crear un cuaderno y ejecutar las instrucciones de este tutorial paso a paso. También puedes abrir y ejecutar el cuaderno denominado 2. Experimentación y entrenamiento de modelos mediante características.ipynb desde el directorio featurestore_sample/notebooks. Puede elegir sdk_only o sdk_and_cli. Mantenga este tutorial abierto y consúltelo para obtener vínculos de documentación y explicaciones más detalladas.

    1. En el menú superior, en la lista desplegable Proceso, seleccione Proceso de Spark sin servidor en Spark sin servidor de Azure Machine Learning.

    2. Configuración de la sesión:

      1. Cuando la barra de herramientas muestre Configurar sesión, selecciónela.
      2. En la pestaña Paquetes de Python, seleccione Cargar archivo de Conda.
      3. Cargue el archivo conda.yml que cargó en el primer tutorial.
      4. De manera opcional, aumente el tiempo de espera de la sesión (tiempo de inactividad) para evitar repeticiones frecuentes de ejecución de requisitos previos.
  2. Inicie la sesión de Spark.

    # run this cell to start the spark session (any code block will start the session ). This can take around 10 mins.
    print("start spark session")
  3. Configure el directorio raíz para los ejemplos.

    import os
    
    # please update the dir to ./Users/<your_user_alias> (or any custom directory you uploaded the samples to).
    # You can find the name from the directory structure in the left nav
    root_dir = "./Users/<your_user_alias>/featurestore_sample"
    
    if os.path.isdir(root_dir):
        print("The folder exists.")
    else:
        print("The folder does not exist. Please create or fix the path")
  4. Configuración de la CLI.

    No aplicable.


  1. Inicialización de las variables del área de trabajo del proyecto.

    Esta es el área de trabajo actual, y el cuaderno del tutorial se ejecuta en este recurso.

    ### Initialize the MLClient of this project workspace
    import os
    from azure.ai.ml import MLClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    project_ws_sub_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
    project_ws_rg = os.environ["AZUREML_ARM_RESOURCEGROUP"]
    project_ws_name = os.environ["AZUREML_ARM_WORKSPACE_NAME"]
    
    # connect to the project workspace
    ws_client = MLClient(
        AzureMLOnBehalfOfCredential(), project_ws_sub_id, project_ws_rg, project_ws_name
    )
  2. Inicialice las variables del almacén de características.

    Asegúrese de actualizar los valores featurestore_name y featurestore_location para reflejar lo que ha creado en el primer tutorial.

    from azure.ai.ml import MLClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    # feature store
    featurestore_name = (
        "<FEATURESTORE_NAME>"  # use the same name from part #1 of the tutorial
    )
    featurestore_subscription_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
    featurestore_resource_group_name = os.environ["AZUREML_ARM_RESOURCEGROUP"]
    
    # feature store ml client
    fs_client = MLClient(
        AzureMLOnBehalfOfCredential(),
        featurestore_subscription_id,
        featurestore_resource_group_name,
        featurestore_name,
    )
  3. Inicialice el cliente de consumo del almacén de características.

    # feature store client
    from azureml.featurestore import FeatureStoreClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    featurestore = FeatureStoreClient(
        credential=AzureMLOnBehalfOfCredential(),
        subscription_id=featurestore_subscription_id,
        resource_group_name=featurestore_resource_group_name,
        name=featurestore_name,
    )
  4. Cree un clúster de proceso denominado cpu-cluster en el área de trabajo del proyecto.

    Necesitarás este clúster de proceso al ejecutar los trabajos de inferencia por lotes o de entrenamiento.

    from azure.ai.ml.entities import AmlCompute
    
    cluster_basic = AmlCompute(
        name="cpu-cluster-fs",
        type="amlcompute",
        size="STANDARD_F4S_V2",  # you can replace it with other supported VM SKUs
        location=ws_client.workspaces.get(ws_client.workspace_name).location,
        min_instances=0,
        max_instances=1,
        idle_time_before_scale_down=360,
    )
    ws_client.begin_create_or_update(cluster_basic).result()

Creación del conjunto de características de cuentas en un entorno local

En el primer tutorial, ha creado un conjunto de características transactions que tenía transformaciones personalizadas. En este caso, creará un conjunto de características accounts que usa valores precalculados.

Para incorporar características precalculadas, puede crear una especificación de conjunto de características sin escribir ningún código de transformación. Use una especificación de conjunto de características para desarrollar y probar este conjunto en un entorno de desarrollo completamente local.

No es necesario conectarse a un almacén de características. En este procedimiento, creará la especificación del conjunto de características de manera local y, después, muestreará los valores desde él. Para obtener las funcionalidades del almacén de características gestionado, debe usar una definición de recurso de característica para registrar la especificación de conjunto de características con un almacén de características. Los pasos posteriores de este tutorial proporcionan más detalles.

  1. Exploración de los datos de origen de las cuentas.

    Nota:

    Este cuaderno usa datos de ejemplo hospedados en un contenedor de blobs accesible públicamente. Solo un controlador wasbs puede leerlos en Spark. Al crear conjuntos de características con sus propios datos de origen, hospédelos en una cuenta de Azure Data Lake Storage Gen2 y use un controlador abfss en la ruta de acceso de datos.

    accounts_data_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/accounts-precalculated/*.parquet"
    accounts_df = spark.read.parquet(accounts_data_path)
    
    display(accounts_df.head(5))
  2. Cree la especificación del conjunto de características accounts de forma local a partir de estas características precalculadas.

    Aquí no necesita ningún código de transformación, ya que hace referencia a características precalculadas.

    from azureml.featurestore import create_feature_set_spec, FeatureSetSpec
    from azureml.featurestore.contracts import (
        DateTimeOffset,
        Column,
        ColumnType,
        SourceType,
        TimestampColumn,
    )
    from azureml.featurestore.feature_source import ParquetFeatureSource
    
    
    accounts_featureset_spec = create_feature_set_spec(
        source=ParquetFeatureSource(
            path="wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/accounts-precalculated/*.parquet",
            timestamp_column=TimestampColumn(name="timestamp"),
        ),
        index_columns=[Column(name="accountID", type=ColumnType.string)],
        # account profiles in the source are updated once a year. set temporal_join_lookback to 365 days
        temporal_join_lookback=DateTimeOffset(days=365, hours=0, minutes=0),
        infer_schema=True,
    )
  3. Realice la exportación como una especificación de conjunto de características.

    Para registrar la especificación de conjunto de características con el almacén de características, debe guardar esta especificación en un formato específico.

    Después de ejecutar la celda siguiente, inspeccione la especificación del conjunto de características generado accounts. Para ver la especificación, abra el archivo featurestore/featuresets/accounts/spec/FeatureSetSpec.yaml desde el árbol de archivos.

    La especificación tiene estos elementos importantes:

    • source: una referencia a un recurso de almacenamiento. En este caso, es un archivo Parquet en un recurso de almacenamiento de blobs.

    • features: Lista de características y sus tipos de datos. Con el código de transformación proporcionado, el código debe devolver un elemento DataFrame que se asigne a las características y los tipos de datos. Sin el código de transformación proporcionado, el sistema compila la consulta para asignar las características y los tipos de datos al origen. En este caso, la especificación del conjunto de características generado accounts no contiene el código de transformación porque las características ya se han precalculado.

    • index_columns: claves de combinación necesarias para acceder a los valores del conjunto de características.

    Para más información, consulte la descripción de las entidades de nivel superior en el almacén de características gestionado y el esquema YAML de especificación de conjunto de características de la CLI (v2).

    Como ventaja adicional, la conservación admite el control de código fuente.

    Aquí no necesita ningún código de transformación, ya que hace referencia a características precalculadas.

    import os
    
    # create a new folder to dump the feature set spec
    accounts_featureset_spec_folder = root_dir + "/featurestore/featuresets/accounts/spec"
    
    # check if the folder exists, create one if not
    if not os.path.exists(accounts_featureset_spec_folder):
        os.makedirs(accounts_featureset_spec_folder)
    
    accounts_featureset_spec.dump(accounts_featureset_spec_folder, overwrite=True)

Experimenta con características no registradas de forma local y registrar con el almacén de características cuando esté listo

A medida que desarrolle características, es posible que quiera probarlas y validarlas localmente antes de registrarlas en el almacén de características o ejecutar canalizaciones de entrenamiento en la nube. Una combinación de un conjunto de características no registrado local (accounts) y un conjunto de características registrado en el almacén de características (transactions) genera datos de entrenamiento para el modelo de Machine Learning.

  1. Seleccione las características para el modelo.

    # get the registered transactions feature set, version 1
    transactions_featureset = featurestore.feature_sets.get("transactions", "1")
    # Notice that account feature set spec is in your local dev environment (this notebook): not registered with feature store yet
    features = [
        accounts_featureset_spec.get_feature("accountAge"),
        accounts_featureset_spec.get_feature("numPaymentRejects1dPerUser"),
        transactions_featureset.get_feature("transaction_amount_7d_sum"),
        transactions_featureset.get_feature("transaction_amount_3d_sum"),
        transactions_featureset.get_feature("transaction_amount_7d_avg"),
    ]
  2. Genere los datos de entrenamiento de manera local.

    Este paso genera datos de entrenamiento con fines ilustrativos. Como opción, puede entrenar modelos localmente aquí. En los pasos posteriores de este tutorial se explica cómo entrenar un modelo en la nube.

    from azureml.featurestore import get_offline_features
    
    # Load the observation data. To understand observatio ndata, refer to part 1 of this tutorial
    observation_data_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/observation_data/train/*.parquet"
    observation_data_df = spark.read.parquet(observation_data_path)
    obs_data_timestamp_column = "timestamp"
    # generate training dataframe by using feature data and observation data
    training_df = get_offline_features(
        features=features,
        observation_data=observation_data_df,
        timestamp_column=obs_data_timestamp_column,
    )
    
    # Ignore the message that says feature set is not materialized (materialization is optional). We will enable materialization in the next part of the tutorial.
    display(training_df)
    # Note: display(training_df.head(5)) displays the timestamp column in a different format. You can can call training_df.show() to see correctly formatted value
  3. Registre el conjunto de características accounts con el almacén de características.

    Después de experimentar localmente con definiciones de características y que se vean correctas, puede registrar una definición de recurso del conjunto de características con el almacén de características.

    from azure.ai.ml.entities import FeatureSet, FeatureSetSpecification
    
    accounts_fset_config = FeatureSet(
        name="accounts",
        version="1",
        description="accounts featureset",
        entities=[f"azureml:account:1"],
        stage="Development",
        specification=FeatureSetSpecification(path=accounts_featureset_spec_folder),
        tags={"data_type": "nonPII"},
    )
    
    poller = fs_client.feature_sets.begin_create_or_update(accounts_fset_config)
    print(poller.result())
  4. Obtenga el conjunto de características registrado y pruébelo.

    # look up the featureset by providing name and version
    accounts_featureset = featurestore.feature_sets.get("accounts", "1")

Ejecución de un experimento de entrenamiento

En los siguientes pasos, seleccionará una lista de características, ejecutará una canalización de entrenamiento y registrará el modelo. Puede repetir estos pasos hasta que el modelo realice lo que desee.

  1. Como alternativa, detecte características desde la interfaz de usuario del almacén de características.

    Ya se ha visto este paso en el primer tutorial cuando registró el conjunto de características transactions. Dado que también tiene un conjunto de características accounts, puede examinar las características disponibles:

    1. Vaya a la página de aterrizaje global de Azure Machine Learning.
    2. En el panel izquierdo, seleccione Almacenes de características.
    3. En la lista de almacenes de características, seleccione el almacén de características que creó anteriormente.

    La interfaz de usuario muestra los conjuntos de características y la entidad que ha creado. Seleccione los conjuntos de características para examinar las definiciones de características. Puede usar el cuadro de búsqueda global para buscar conjuntos de características en almacenes de características.

  2. Como alternativa, detecte características desde el SDK.

    # List available feature sets
    all_featuresets = featurestore.feature_sets.list()
    for fs in all_featuresets:
        print(fs)
    
    # List of versions for transactions feature set
    all_transactions_featureset_versions = featurestore.feature_sets.list(
        name="transactions"
    )
    for fs in all_transactions_featureset_versions:
        print(fs)
    
    # See properties of the transactions featureset including list of features
    featurestore.feature_sets.get(name="transactions", version="1").features
  3. Seleccione las características del modelo y exporte el modelo como una especificación de recuperación de características.

    En los pasos anteriores, seleccionó características de una combinación de conjuntos de características registrados y no registrados para la experimentación y las pruebas locales. Ahora, puede experimentar en la nube. La agilidad de la preparación de modelos aumenta si guarda las características seleccionadas como una especificación de recuperación de características y, después, usa la especificación en las operaciones de aprendizaje automático (MLOps) o en el flujo de integración continua y entrega continua (CI/CD) para el entrenamiento y la inferencia.

    1. Seleccione las características para el modelo.

      # you can select features in pythonic way
      features = [
          accounts_featureset.get_feature("accountAge"),
          transactions_featureset.get_feature("transaction_amount_7d_sum"),
          transactions_featureset.get_feature("transaction_amount_3d_sum"),
      ]
      
      # you can also specify features in string form: featurestore:featureset:version:feature
      more_features = [
          f"accounts:1:numPaymentRejects1dPerUser",
          f"transactions:1:transaction_amount_7d_avg",
      ]
      
      more_features = featurestore.resolve_feature_uri(more_features)
      
      features.extend(more_features)
    2. Luego, exporta las características seleccionadas como especificación de recuperación de características.

      Una especificación de recuperación de características es la definición portátil de una lista de características asociada a un modelo. Esta puede ayudar a simplificar el desarrollo y la operacionalización de un modelo de Machine Learning. Se convierte en una entrada para la canalización de entrenamiento, que genera los datos de entrenamiento. Luego se empaqueta con el modelo.

      La fase de inferencia usa la recuperación de características para buscar las características. Integra todas las fases del ciclo de vida de aprendizaje automático. Los cambios en la canalización de entrenamiento o inferencia se pueden mantener en un nivel mínimo a medida que experimente e implemente.

      El uso de la especificación de recuperación de características y el componente de recuperación de características integrado es opcional. Puede usar directamente la API get_offline_features(), como se mostró anteriormente. El nombre de la especificación debe ser feature_retrieval_spec.yaml cuando se empaqueta con el modelo. De este modo, el sistema puede reconocerlo.

      # Create feature retrieval spec
      feature_retrieval_spec_folder = root_dir + "/project/fraud_model/feature_retrieval_spec"
      
      # check if the folder exists, create one if not
      if not os.path.exists(feature_retrieval_spec_folder):
          os.makedirs(feature_retrieval_spec_folder)
      
      featurestore.generate_feature_retrieval_spec(feature_retrieval_spec_folder, features)

Entrenamiento en la nube con canalizaciones y registro del modelo

En este procedimiento, desencadenará manualmente la canalización de entrenamiento. En un escenario de producción, una canalización de CI/CD podría desencadenarla en función de los cambios en la especificación de recuperación de características en el repositorio de origen. Puede registrar el modelo si es satisfactorio.

  1. Ejecute la canalización de entrenamiento.

    La canalización de entrenamiento tiene estos pasos:

    1. Recuperación de características: para la entrada, este componente integrado toma la especificación de recuperación de características, los datos de observación y el nombre de la columna de marca de tiempo. A continuación, genera los datos de entrenamiento como salida. Ejecuta estos pasos como un trabajo de Spark administrado.

    2. Entrenamiento: en función de los datos de entrenamiento, este paso entrena el modelo y genera un modelo (aún no registrado).

    3. Evaluación: en este paso, se valida si el rendimiento del modelo y la calidad están dentro de un umbral. (En este tutorial, se usa un marcador de posición con fines ilustrativos).

    4. Registro del modelo: en este paso, se registra el modelo.

      Nota:

      En el segundo tutorial, ha ejecutado un trabajo de reposición para materializar los datos del conjunto de características de transactions. El paso de recuperación de características lee los valores de las características del almacén sin conexión para este conjunto de características. El comportamiento es el mismo si usa la API get_offline_features().

      from azure.ai.ml import load_job  # will be used later
      
      training_pipeline_path = (
          root_dir + "/project/fraud_model/pipelines/training_pipeline.yaml"
      )
      training_pipeline_definition = load_job(source=training_pipeline_path)
      training_pipeline_job = ws_client.jobs.create_or_update(training_pipeline_definition)
      ws_client.jobs.stream(training_pipeline_job.name)
      # Note: First time it runs, each step in pipeline can take ~ 15 mins. However subsequent runs can be faster (assuming spark pool is warm - default timeout is 30 mins)
    5. Inspeccione la canalización de entrenamiento y el modelo.

      • Para mostrar los pasos de canalización, selecciona el hipervínculo de la canalización Vista web y ábralo en una nueva ventana.
  2. Use la especificación de recuperación de características en los artefactos del modelo:

    1. En el panel izquierdo del área de trabajo actual, seleccione Modelos con el botón derecho del ratón.
    2. Seleccione Abrir en una nueva pestaña o ventana.
    3. Seleccione fraud_model.
    4. Seleccione Artifacts (Artefactos).

    La especificación de recuperación de características se empaqueta junto con el modelo. El paso de registro del modelo en la canalización de entrenamiento controló este paso. Ha creado la especificación de recuperación de características durante la experimentación. Ahora forma parte de la definición del modelo. En el siguiente tutorial, verá cómo la inferencia la usa.

Visualización del conjunto de características y las dependencias del modelo

  1. Visualice la lista de conjuntos de características asociados al modelo.

    En la misma página Modelos, seleccione la pestaña Conjuntos de características. En esta pestaña, se muestran los conjuntos de características transactions y accounts de los que depende este modelo.

  2. Visualice la lista de modelos que usan los conjuntos de características:

    1. Abra la interfaz de usuario del almacén de características (paso explicado anteriormente en este tutorial).
    2. En el panel izquierdo, seleccione Conjuntos de características.
    3. Seleccione un conjunto de características.
    4. Seleccione la pestaña Modelos.

    La especificación de recuperación de características ha determinado esta lista cuando se registró el modelo.

Limpieza

En el quinto tutorial de la serie se describe cómo eliminar los recursos.

Pasos siguientes