Compartir vía


Traslado de datos a y entre pasos de canalización de aprendizaje automático (Python)

SE APLICA A:SDK de Azure Machine Learning v1 para Python

Importante

En este artículo se proporciona información sobre el uso del SDK de Azure Machine Learning v1. EL SDK v1 está en desuso a partir del 31 de marzo de 2025. El soporte técnico finalizará el 30 de junio de 2026. Puede instalar y usar SDK v1 hasta esa fecha.

Se recomienda realizar la transición al SDK v2 antes del 30 de junio de 2026. Para más información sobre SDK v2, consulte ¿Qué es la CLI de Azure Machine Learning y el SDK de Python v2? y la referencia del SDK v2.

En este artículo se proporciona código para importar datos, transformar datos y mover datos entre pasos en una canalización de Azure Machine Learning. Para obtener información general sobre cómo funcionan los datos en Azure Machine Learning, consulte Acceso a los datos en los servicios de Azure Storage. Para más información sobre las ventajas y la estructura de las canalizaciones de Azure Machine Learning, consulte ¿Qué son las canalizaciones de Azure Machine Learning?.

En este artículo se muestra cómo:

  • Uso de objetos Dataset para datos preexistentes
  • Acceder a los datos en los pasos
  • Dividir los datos de Dataset en subconjuntos, como los subconjuntos de entrenamiento y validación
  • Crear objetos OutputFileDatasetConfig para transferir datos al siguiente paso de la canalización
  • Usar objetos OutputFileDatasetConfig como entrada para los pasos de la canalización
  • Crear nuevos Dataset objetos a partir de OutputFileDatasetConfig los que desea conservar

Requisitos previos

Uso de objetos Dataset para datos preexistentes

La mejor manera de ingerir datos en una canalización es utilizar un objeto Dataset. Dataset los objetos representan datos persistentes que están disponibles en todo un área de trabajo.

Hay muchas maneras de crear y registrar objetos Dataset. Los conjuntos de datos tabulares son para datos delimitados que están disponibles en uno o varios archivos. Los conjuntos de datos de archivos son para datos binarios (como imágenes) o para datos que se van a analizar. Las formas más sencillas de crear objetos Dataset mediante programación consisten en usar los blobs existentes en el almacenamiento del área de trabajo o en direcciones URL públicas:

datastore = Datastore.get(workspace, 'training_data')
iris_dataset = Dataset.Tabular.from_delimited_files(DataPath(datastore, 'iris.csv'))

datastore_path = [
    DataPath(datastore, 'animals/dog/1.jpg'),
    DataPath(datastore, 'animals/dog/2.jpg'),
    DataPath(datastore, 'animals/cat/*.jpg')
]
cats_dogs_dataset = Dataset.File.from_files(path=datastore_path)

Para más información sobre cómo crear conjuntos de datos con diferentes opciones y de orígenes diferentes, registrarlos y revisarlos en la interfaz de usuario de Azure Machine Learning, comprender cómo interactúa el tamaño de los datos con la capacidad de proceso y el control de versiones, consulte Creación de conjuntos de datos de Azure Machine Learning.

Paso de los conjuntos de datos al script

Para pasar la ruta de acceso del conjunto de datos al script, use el método Dataset del objeto as_named_input(). Puede pasar el objeto resultante DatasetConsumptionConfig a su script como argumento o, usando el argumento inputs en su script de canalización, puede recuperar el conjunto de datos mediante Run.get_context().input_datasets[].

Después de crear una entrada con nombre, puede elegir su modo de acceso (solo para FileDataset ): as_mount() o as_download(). Si el script procesa todos los archivos del conjunto de datos y el disco del recurso de proceso es lo suficientemente grande como para el conjunto de datos, el modo de acceso de descarga es una mejor opción. El modo de acceso de descarga evita la sobrecarga de transmitir los datos en tiempo de ejecución. Si el script accede a un subconjunto del conjunto de datos o es demasiado grande para su entorno de cómputo, use el modo de acceso montado. Para obtener más información, consulte Montaje frente a descarga.

Para pasar un conjunto de datos al paso de la canalización:

  1. Use TabularDataset.as_named_input() o FileDataset.as_named_input() (sin s al final) para crear un DatasetConsumptionConfig objeto
  2. Solo para FileDataset : use as_mount() o as_download() para establecer el modo de acceso. Con TabularDataset, no se puede establecer el modo de acceso.
  3. Pase los conjuntos de datos a los pasos de canalización mediante arguments o inputs.

En el fragmento de código siguiente se muestra el patrón común de combinar estos pasos dentro del PythonScriptStep constructor mediante iris_dataset (TabularDataset):


train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    inputs=[iris_dataset.as_named_input('iris')]
)

Nota

Debe reemplazar los valores de todos estos argumentos (es decir, "train_data", "train.py", clustery iris_dataset) por sus propios datos. El fragmento de código anterior solo muestra el formato de la llamada y no forma parte de un ejemplo de Microsoft.

También puede usar métodos como random_split() y take_sample() para crear varias entradas o para reducir la cantidad de datos que se pasan al paso de canalización:

seed = 42 # PRNG seed
smaller_dataset = iris_dataset.take_sample(0.1, seed=seed) # 10%
train, test = smaller_dataset.random_split(percentage=0.8, seed=seed)

train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    inputs=[train.as_named_input('train'), test.as_named_input('test')]
)

Acceso a los conjuntos de datos del script

Las entradas con nombre para el script del paso de la canalización están disponibles como un diccionario dentro del objeto Run. Recupere el objeto activo Run mediante Run.get_context()y, a continuación, recupere el diccionario de entradas con nombre mediante input_datasets. Si ha pasado el objeto DatasetConsumptionConfig mediante el argumento arguments en lugar del argumento inputs, acceda a los datos mediante ArgumentParser código. En los siguientes fragmentos de código se muestran ambas técnicas:

Script de definición de la canalización

# Code is for demonstration only: It would be confusing to split datasets between `arguments` and `inputs`
train_step = PythonScriptStep(
    name="train_data",
    script_name="train.py",
    compute_target=cluster,
    # Datasets passed as arguments
    arguments=['--training-folder', train.as_named_input('train').as_download()],
    # Datasets passed as inputs
    inputs=[test.as_named_input('test').as_download()]
)

El script de train.py al que se hace referencia desde PythonScriptStep

# In pipeline script
parser = argparse.ArgumentParser()
# Retrieve the dataset passed as an argument
parser.add_argument('--training-folder', type=str, dest='train_folder', help='training data folder mounting point')
args = parser.parse_args()
training_data_folder = args.train_folder
# Retrieve the dataset passed as an input
testing_data_folder = Run.get_context().input_datasets['test']

El valor pasado es la ruta de acceso al archivo o los archivos del conjunto de datos.

Dado que los conjuntos de datos registrados son persistentes y compartidos en un área de trabajo, puede recuperarlos directamente:

run = Run.get_context()
ws = run.experiment.workspace
ds = Dataset.get_by_name(workspace=ws, name='mnist_opendataset')

Nota

Los fragmentos de código anteriores muestran la forma de las llamadas. No forman parte de un ejemplo de Microsoft. Debe reemplazar los argumentos por valores de su propio proyecto.

Uso de OutputFileDatasetConfig para los datos intermedios

Aunque Dataset los objetos solo representan datos persistentes, OutputFileDatasetConfig los objetos se pueden usar para la salida de datos temporales de los pasos de canalización y para los datos de salida persistentes. OutputFileDatasetConfig admite la escritura de datos en Blob Storage, compartición de archivos, Azure Data Lake Storage Gen1 o Data Lake Storage Gen2. Admite el modo de montaje y el modo de carga. En el modo de montaje, los archivos escritos en el directorio montado se almacenan de manera permanente cuando se cierra el archivo. En el modo de carga, los archivos escritos en el directorio de salida se cargan al final del trabajo. Si se produce un error en el trabajo o se cancela, el directorio de salida no se carga.

El OutputFileDatasetConfig comportamiento predeterminado del objeto es escribir en el almacén de datos predeterminado del área de trabajo. Pase los OutputFileDatasetConfig objetos a su PythonScriptStep mediante el parámetro arguments.

from azureml.data import OutputFileDatasetConfig
dataprep_output = OutputFileDatasetConfig()
input_dataset = Dataset.get_by_name(workspace, 'raw_data')

dataprep_step = PythonScriptStep(
    name="prep_data",
    script_name="dataprep.py",
    compute_target=cluster,
    arguments=[input_dataset.as_named_input('raw_data').as_mount(), dataprep_output]
    )

Nota

Se producirá un error en las operaciones de escritura simultáneas en un objeto OutputFileDatasetConfig. No intente usar una sola OutputFileDatasetConfig simultáneamente. Evite compartir una sola OutputFileDatasetConfig en situaciones de multiprocesamiento, como en el entrenamiento distribuido.

Uso de OutputFileDatasetConfig como salidas de un paso de entrenamiento

En la canalización de PythonScriptStep, puede recuperar las rutas de salida disponibles mediante los argumentos del programa. Si este paso es el primero e inicializará los datos de salida, debe crear el directorio en la ruta de acceso especificada. Después, puede escribir los archivos que quiera incluir en el OutputFileDatasetConfig.

parser = argparse.ArgumentParser()
parser.add_argument('--output_path', dest='output_path', required=True)
args = parser.parse_args()

# Make directory for file
os.makedirs(os.path.dirname(args.output_path), exist_ok=True)
with open(args.output_path, 'w') as f:
    f.write("Step 1's output")

Lectura de OutputFileDatasetConfig como entradas en pasos no iniciales

Después de que el paso de canalización inicial escriba algunos datos en la ruta de acceso de OutputFileDatasetConfig y se convierta en una salida de ese paso inicial, se puede usar como entrada para un paso posterior.

En el código siguiente:

  • step1_output_data indica que la salida del PythonScriptStepstep1 se escribe en el almacén de datos my_adlsgen2 de Data Lake Storage Gen2 en modo de acceso de carga. Para obtener información sobre cómo configurar permisos de rol para volver a escribir datos en almacenes de datos de Data Lake Storage Gen2, consulte Conexión a los servicios de almacenamiento en Azure con almacenes de datos.

  • Después de que step1 se complete y la salida se escriba en el destino indicado por step1_output_data, step2 está listo para usar step1_output_data como la entrada.

# Get Data Lake Storage Gen2 datastore that's already registered with the workspace
datastore = workspace.datastores['my_adlsgen2']
step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()

step1 = PythonScriptStep(
    name="generate_data",
    script_name="step1.py",
    runconfig = aml_run_config,
    arguments = ["--output_path", step1_output_data]
)

step2 = PythonScriptStep(
    name="read_pipeline_data",
    script_name="step2.py",
    compute_target=compute,
    runconfig = aml_run_config,
    arguments = ["--pd", step1_output_data.as_input()]

)

pipeline = Pipeline(workspace=ws, steps=[step1, step2])

Sugerencia

El proceso para leer los datos en el script step2.py de Python es el mismo que el proceso descrito anteriormente en Conjuntos de datos de Access dentro del script. Use ArgumentParser para agregar un argumento de --pd en el script para acceder a los datos.

Registro de objetos OutputFileDatasetConfig para su reutilización

Si desea que un OutputFileDatasetConfig objeto esté disponible durante más tiempo que la duración del experimento, regístrelo en el área de trabajo para compartir y reutilizar en los experimentos:

step1_output_ds = step1_output_data.register_on_complete(
    name='processed_data', 
    description = 'files from step1'
)

Eliminar OutputFileDatasetConfig contenido cuando ya no sea necesario

Azure no elimina automáticamente los datos intermedios escritos con OutputFileDatasetConfig. Para evitar cargos de almacenamiento de grandes cantidades de datos innecesarios, debe realizar una de las siguientes acciones:

  • Eliminar mediante programación los datos intermedios al final de un trabajo de canalización, cuando ya no son necesarios.

  • Use Blob Storage con una directiva de almacenamiento a corto plazo para los datos intermedios. (Consulte Optimización de los costos mediante la automatización de los niveles de acceso de Azure Blob Storage). Esta directiva solo se puede establecer en el almacén de datos no predeterminado de un área de trabajo. Use OutputFileDatasetConfig para exportar datos intermedios a otro almacén de datos que no sea el predeterminado.

    # Get Data Lake Storage Gen2 datastore that's already registered with the workspace
    datastore = workspace.datastores['my_adlsgen2']
    step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()
    
  • Revise periódicamente los datos y elimine los datos que no necesita.

Precaución

Elimine solo los datos intermedios después de 30 días a partir de la última fecha de cambio de los datos. La eliminación de datos intermedios antes podría provocar un error en la ejecución de la canalización porque la canalización supone que los datos estén disponibles durante un período de 30 días para su reutilización.

Para más información, consulte Plan para administrar los costes de Azure Machine Learning.

Pasos siguientes