Dela via


Flytta data till och mellan olika steg i ML-pipelinen (Python)

GÄLLER FÖR:Python SDK azureml v1

Den här artikeln innehåller kod för att importera, transformera och flytta data mellan steg i en Azure-Mašinsko učenje pipeline. En översikt över hur data fungerar i Azure Mašinsko učenje finns i Åtkomst till data i Azure Storage-tjänster. Mer information om fördelarna och strukturen för Azure Mašinsko učenje pipelines finns i Vad är Azure Mašinsko učenje pipelines?

Den här artikeln visar hur du gör följande:

  • Använda Dataset objekt för befintliga data
  • Få åtkomst till data i dina steg
  • Dela upp Dataset data i delmängder, till exempel tränings- och valideringsunderuppsättningar
  • Skapa OutputFileDatasetConfig objekt för att överföra data till nästa pipelinesteg
  • Använda OutputFileDatasetConfig objekt som indata till pipelinesteg
  • Skapa nya Dataset objekt från OutputFileDatasetConfig du vill spara

Förutsättningar

Du måste:

Använda Dataset objekt för befintliga data

Det bästa sättet att mata in data i en pipeline är att använda ett datauppsättningsobjekt . Dataset objekt representerar beständiga data som är tillgängliga i en arbetsyta.

Det finns många sätt att skapa och registrera Dataset objekt. Tabelldatauppsättningar är för avgränsade data som är tillgängliga i en eller flera filer. Fildatauppsättningar är för binära data (till exempel bilder) eller för data som du parsar. De enklaste programmatiska sätten att skapa Dataset objekt är att använda befintliga blobar i arbetsytelagring eller offentliga URL:er:

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)

Fler alternativ för att skapa datauppsättningar med olika alternativ och från olika källor, registrera dem och granska dem i Användargränssnittet för Azure Mašinsko učenje, förstå hur datastorleken interagerar med beräkningskapaciteten och versionshantering av dem finns i Skapa Azure Mašinsko učenje datauppsättningar.

Skicka datauppsättningar till skriptet

Om du vill skicka datauppsättningens sökväg till skriptet Dataset använder du objektets as_named_input() metod. Du kan antingen skicka det resulterande DatasetConsumptionConfig objektet till skriptet som ett argument eller genom att använda inputs argumentet till pipelineskriptet kan du hämta datamängden med .Run.get_context().input_datasets[]

När du har skapat en namngiven indata kan du välja dess åtkomstläge (endast för FileDataset): as_mount() eller as_download(). Om skriptet bearbetar alla filer i datamängden och disken på beräkningsresursen är tillräckligt stora för datamängden är nedladdningsläget det bättre valet. Läget för nedladdningsåtkomst undviker kostnaden för att strömma data vid körning. Om skriptet kommer åt en delmängd av datamängden eller om det är för stort för din beräkning använder du monteringsåtkomstläget. Mer information finns i Mount vs. Download

Så här skickar du en datauppsättning till pipelinesteget:

  1. Använd TabularDataset.as_named_input() eller FileDataset.as_named_input() (inga "s" i slutet) för att skapa ett DatasetConsumptionConfig objekt
  2. Endast för FileDataset :. Använd as_mount() eller as_download() för att ange åtkomstläget. TabularDataset ställer inte in åtkomstläge.
  3. Skicka datauppsättningarna till dina pipelinesteg med hjälp av antingen arguments argumentet eller inputs

Följande kodfragment visar det vanliga mönstret för att kombinera dessa steg i PythonScriptStep konstruktorn med hjälp av iris_dataset (TabularDataset):


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

Kommentar

Du skulle behöva ersätta värdena för alla dessa argument (dvs. "train_data", , "train.py"cluster, och iris_dataset) med dina egna data. Ovanstående kodfragment visar bara anropets form och ingår inte i ett Microsoft-exempel.

Du kan också använda metoder som och take_sample() för att skapa flera indata eller minska mängden data som random_split() skickas till pipelinesteget:

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')]
)

Komma åt datauppsättningar i skriptet

Namngivna indata till pipelinestegskriptet är tillgängliga som en ordlista i Run objektet. Hämta det aktiva Run objektet med och Run.get_context() hämta sedan ordlistan med namngivna indata med .input_datasets Om du skickade DatasetConsumptionConfig objektet med argumentet arguments i stället inputs för argumentet kan du komma åt data med hjälp av ArgParser kod. Båda teknikerna visas i följande kodfragment:

Skriptet för pipelinedefinition

# Code for demonstration only: It would be very 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()]
)

Skriptet train.py som refereras från PythonScriptStep

# In pipeline script
parser = argparse.ArgumentParser()
# Retreive 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']

Det skickade värdet är sökvägen till datamängdsfilerna.

Det går också att komma åt en registrerad Dataset direkt. Eftersom registrerade datauppsättningar är beständiga och delas över en arbetsyta kan du hämta dem direkt:

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

Kommentar

Föregående kodfragment visar anropens form och ingår inte i ett Microsoft-exempel. Du måste ersätta de olika argumenten med värden från ditt eget projekt.

Används OutputFileDatasetConfig för mellanliggande data

Objekt Dataset representerar endast beständiga data, OutputFileDatasetConfig men objekt kan användas för tillfälliga datautdata från pipelinesteg och beständiga utdata. OutputFileDatasetConfig stöder skrivning av data till bloblagring, fildelning, adlsgen1 eller adlsgen2. Den stöder både monteringsläge och uppladdningsläge. I monteringsläge lagras filer som skrivs till den monterade katalogen permanent när filen stängs. I uppladdningsläge laddas filer som skrivits till utdatakatalogen upp i slutet av jobbet. Om jobbet misslyckas eller avbryts laddas inte utdatakatalogen upp.

OutputFileDatasetConfig objektets standardbeteende är att skriva till arbetsytans standarddatalager. Skicka dina OutputFileDatasetConfig objekt till din PythonScriptStep med parametern 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]
    )

Kommentar

Samtidiga skrivningar till en OutputFileDatasetConfig misslyckas. Försök inte att använda en enda OutputFileDatasetConfig samtidigt. Dela inte en enskild OutputFileDatasetConfig i en situation med flera processer, till exempel när du använder distribuerad utbildning.

Använda OutputFileDatasetConfig som utdata från ett träningssteg

I PythonScriptStep i din pipeline kan du hämta tillgängliga sökvägar för utdata med hjälp av programmets argument. Om det här är det första steget och det initierar utdata måste du skapa katalogen vid den angivna sökvägen. Du kan sedan skriva de filer som du vill ska finnas i 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")

Läs OutputFileDatasetConfig som indata till icke-initiala steg

När det första pipelinesteget OutputFileDatasetConfig skriver vissa data till sökvägen och det blir ett utdata från det första steget kan det användas som indata till ett senare steg.

I följande kod:

  • step1_output_data anger att utdata från PythonScriptStep skrivs step1 till ADLS Gen 2-dataarkivet my_adlsgen2 i läget för uppladdningsåtkomst. Läs mer om hur du konfigurerar rollbehörigheter för att skriva tillbaka data till ADLS Gen 2-datalager.

  • När step1 du är klar och utdata skrivs till målet som anges av step1_output_data, är steg2 redo att användas step1_output_data som indata.

# get adls gen 2 datastore 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])

Dricks

Att läsa data i Python-skriptet step2.py är detsamma som tidigare dokumenterats i Access-datauppsättningar i skriptet. Använd ArgumentParser för att lägga till ett argument i --pd skriptet för att komma åt data.

Registrera OutputFileDatasetConfig objekt för återanvändning

Om du vill göra ditt OutputFileDatasetConfig tillgängligt längre än experimentets varaktighet registrerar du det på din arbetsyta för att dela och återanvända dem i experiment.

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

Ta bort OutputFileDatasetConfig innehåll när det inte längre behövs

Azure tar inte automatiskt bort mellanliggande data som skrivits med OutputFileDatasetConfig. För att undvika lagringsavgifter för stora mängder onödiga data bör du antingen:

Varning

Ta bara bort mellanliggande data efter 30 dagar från datans senaste ändringsdatum. Om du tar bort data tidigare kan pipelinekörningen misslyckas eftersom pipelinen förutsätter att mellanliggande data finns inom 30 dagar för återanvändning.

  • Ta programmatiskt bort mellanliggande data i slutet av ett pipelinejobb när de inte längre behövs.
  • Använd bloblagring med en kortsiktig lagringsprincip för mellanliggande data (se Optimera kostnader genom att automatisera Åtkomstnivåer för Azure Blob Storage). Den här principen kan bara anges till en arbetsytas icke-standarddatalager. Använd OutputFileDatasetConfig för att exportera mellanliggande data till ett annat datalager som inte är standard.
    # Get adls gen 2 datastore 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()
    
  • Granska och ta bort data som inte längre behövs.

Mer information finns i Planera och hantera kostnader för Azure Mašinsko učenje.

Nästa steg