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.
En el primer tutorial, se mostró cómo crear una especificación de conjunto de características con transformaciones personalizadas. Luego, se mostró cómo usar ese conjunto de características para generar datos de entrenamiento, habilitar la materialización y realizar un reposición. En este tutorial, se muestra cómo habilitar la materialización y realizar una 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 de
accounts
, mediante el uso de 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
yaccounts
, 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
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 puede abrir y ejecutar el cuaderno existente denominado 2.Experiment-train-models-using-features.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.
En el menú superior, en la lista desplegable Proceso, seleccione Proceso de Spark sin servidor en Spark sin servidor de Azure Machine Learning.
Configuración de la sesión:
- Cuando la barra de herramientas muestre Configurar sesión, selecciónela.
- En la pestaña Paquetes de Python, seleccione Cargar archivo de Conda.
- Cargue el archivo conda.yml que cargó en el primer tutorial.
- Como opción, puede aumentar el tiempo de espera de la sesión (tiempo de inactividad) para evitar repeticiones frecuentes de requisitos previos.
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")
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")
Configuración de la CLI.
No aplicable.
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 )
Inicialice las variables del almacén de características.
Asegúrese de actualizar los valores
featurestore_name
yfeaturestore_location
para reflejar lo que creó 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, )
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, )
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 beneficiarse de 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.
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 controladorabfss
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))
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, )
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 generadoaccounts
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 obtener más información, consulte la descripción de las entidades de nivel superior en el almacén de características gestionado y los recursos del 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.
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"), ]
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
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, si se ven 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())
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 estos 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.
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ísticasaccounts
, puede examinar las características disponibles:- Vaya a la página de aterrizaje global de Azure Machine Learning.
- En el panel izquierdo, seleccione Almacenes de características.
- 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.
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
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.
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)
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 lo empaquete 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.
Ejecute la canalización de entrenamiento.
La canalización de entrenamiento tiene estos pasos:
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.
Entrenamiento: en función de los datos de entrenamiento, este paso entrena el modelo y genera un modelo (aún no registrado).
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).
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 APIget_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)
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.
Use la especificación de recuperación de características en los artefactos del modelo:
- En el panel izquierdo del área de trabajo actual, seleccione Modelos con el botón derecho del ratón.
- Seleccione Abrir en una nueva pestaña o ventana.
- Seleccione fraud_model.
- 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 el proceso de inferencia la usa.
Visualización del conjunto de características y las dependencias del modelo
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
yaccounts
. Este modelo depende de estos conjuntos de características.Visualice la lista de modelos que usan los conjuntos de características:
- Abra la interfaz de usuario del almacén de características (paso explicado anteriormente en este tutorial).
- En el panel izquierdo, seleccione Conjuntos de características.
- Seleccione un conjunto de características.
- 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
- Vaya al siguiente tutorial de la serie: Habilitación de la materialización recurrente y ejecución de la inferencia por lotes.
- Obtenga información sobre losconceptos de almacén de características y las entidades de nivel superior en el almacén de características gestionado.
- Obtenga información sobre la identidad y el control de acceso para el almacén de características gestionado.
- Consulte la guía de solución de problemas del almacén de características gestionado.
- Consulte la referencia de YAML.