Memindahkan data ke dalam dan di antara langkah-langkah pipeline ML (Python)

BERLAKU UNTUK:Python SDK azureml v1

Artikel ini menyediakan kode untuk mengimpor, mengubah, dan memindahkan data antarlangkah dalam alur Azure Machine Learning. Untuk gambaran umum tentang cara kerja data di Azure Machine Learning, lihat Mengakses data di layanan penyimpanan Azure. Untuk manfaat dan struktur alur Azure Machine Learning, lihat Apa itu alur Azure Machine Learning?

Artikel ini menunjukkan cara:

  • Menggunakan objek Dataset untuk data yang sudah ada sebelumnya
  • Mengakses data dalam langkah-langkah Anda
  • Memisahkan data Dataset menjadi subset, seperti subset pelatihan dan validasi
  • Membuat objek OutputFileDatasetConfig untuk mentransfer data ke langkah alur berikutnya
  • Menggunakan objek OutputFileDatasetConfig sebagai input ke langkah-langkah alur
  • Buat objek Dataset baru dari OutputFileDatasetConfig yang ingin Anda pertahankan

Prasyarat

Anda memerlukan:

Menggunakan objek Dataset untuk data yang sudah ada sebelumnya

Cara yang lebih disukai untuk menyerap data ke dalam alur adalah dengan menggunakan objek Himpunan Data. Objek Dataset mewakili data persisten yang tersedia di seluruh ruang kerja.

Ada banyak cara untuk membuat dan mendaftarkan objek Dataset. Himpunan data tabular adalah untuk data pemisah yang tersedia dalam satu atau beberapa file. Himpunan data file adalah untuk data biner (seperti gambar) atau untuk data yang Anda uraikan. Cara terprogram yang paling sederhana untuk membuat objek Dataset adalah dengan menggunakan blob yang sudah ada dalam penyimpanan ruang kerja atau URL publik:

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)

Untuk opsi lainnya dalam membuat himpunan data dengan opsi yang berbeda dan dari sumber yang berbeda, mendaftarkannya dan meninjaunya di antarmuka pengguna Azure Machine Learning, memahami bagaimana ukuran data berinteraksi dengan kapasitas komputasi, dan membuat versinya, lihat Membuat himpunan data Azure Machine Learning.

Meneruskan himpunan data ke skrip Anda

Untuk meneruskan jalur himpunan data ke skrip Anda, gunakan metode as_named_input() objek Dataset. Anda dapat meneruskan objek DatasetConsumptionConfig yang dihasilkan ke skrip Anda sebagai argumen atau, dengan menggunakan argumen inputs ke skrip alur Anda, Anda dapat mengambil himpunan data menggunakan Run.get_context().input_datasets[].

Setelah membuat input bernama, Anda dapat memilih mode aksesnya (hanya untuk FileDataset): as_mount() atau as_download(). Jika skrip Anda memproses semua file dalam himpunan data Anda dan disk pada sumber daya komputasi Anda cukup besar untuk himpunan data, akan lebih baik jika memilih mode akses unduh. Mode akses unduhan menghindari overhead streaming data saat runtime. Jika skrip Anda mengakses subset himpunan data atau itu terlalu besar untuk komputasi Anda, gunakan mode akses pasang. Untuk informasi lebih lanjut, baca Pasang vs. Unduh

Untuk meneruskan himpunan data ke langkah alur Anda:

  1. Menggunakan TabularDataset.as_named_input() atau FileDataset.as_named_input() (tanpa 's' di akhir) untuk membuat objek DatasetConsumptionConfig
  2. Hanya FileDataset untuk:. Gunakan as_mount() atau as_download() untuk mengatur mode akses. TabularDataset tidak mendukung mode akses set.
  3. Meneruskan himpunan data ke langkah-langkah alur Anda menggunakan argumen arguments atau inputs

Cuplikan berikut menunjukkan pola umum menggabungkan langkah-langkah ini dalam PythonScriptStep konstruktor, menggunakan iris_dataset (TabularDataset):


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

Catatan

Anda perlu mengganti nilai untuk semua argumen ini (yaitu, "train_data", "train.py", cluster, dan iris_dataset) dengan data Anda sendiri. Cuplikan di atas hanya menampilkan formulir panggilan dan bukan bagian dari sampel Microsoft.

Anda juga dapat menggunakan metode seperti random_split() dan take_sample() untuk membuat beberapa input atau mengurangi jumlah data yang diteruskan ke langkah alur Anda:

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

Mengakses himpunan data dalam skrip Anda

Input bernama ke skrip langkah alur Anda tersedia sebagai kamus di dalam objek Run. Ambil objek Run aktif menggunakan Run.get_context() lalu ambil kamus input bernama menggunakan input_datasets. Jika Anda meneruskan objek DatasetConsumptionConfig menggunakan argumen arguments, bukan argumen inputs, akses datanya menggunakan kode ArgParser. Kedua teknik ditunjukkan dalam cuplikan berikut:

Skrip definisi alur

# 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()]
)

Skrip yang train.py dirujuk dari 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']

Nilai yang diteruskan adalah jalur ke file himpunan data.

Dimungkinkan juga untuk mengakses Dataset yang terdaftar secara langsung. Karena himpunan data yang terdaftar persisten dan dibagikan di seluruh ruang kerja, Anda dapat mengambilnya secara langsung:

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

Catatan

Cuplikan sebelumnya memperlihatkan formulir panggilan dan bukan bagian dari sampel Microsoft. Anda harus mengganti berbagai argumen dengan nilai dari proyek Anda sendiri.

Menggunakan OutputFileDatasetConfig untuk data perantara

Sementara objek Dataset hanya mewakili data persisten, objek OutputFileDatasetConfig dapat digunakan untuk output data sementara dari langkah-langkah alur dan data output persisten. OutputFileDatasetConfig mendukung penulisan data ke penyimpanan blob, fileshare, adlsgen1, atau adlsgen2. Ini mendukung baik mode pasang maupun mode unggah. Dalam mode pasang, file yang ditulis ke direktori yang dipasang akan secara permanen tersimpan saat file ditutup. Dalam mode unggah, file yang ditulis ke direktori output akan diunggah di akhir pekerjaan. Jika pekerjaan gagal atau dibatalkan, direktori output tidak akan diunggah.

Perilaku default objek OutputFileDatasetConfig yaitu menulis ke datastore default ruang kerja. Teruskan objek OutputFileDatasetConfig ke PythonScriptStep Anda dengan parameter 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]
    )

Catatan

Menulis secara bersamaan ke sebuah OutputFileDatasetConfig akan gagal. Jangan mencoba untuk menggunakan satu OutputFileDatasetConfig secara bersamaan. Jangan berbagi satu OutputFileDatasetConfig dalam situasi multipemrosesan, seperti saat menggunakan pelatihan terdistribusi.

Menggunakan OutputFileDatasetConfig sebagai output dari langkah pelatihan

Dalam alur PythonScriptStep, Anda dapat mengambil jalur output yang tersedia menggunakan argumen program. Jika langkah ini adalah yang pertama dan akan menginisialisasi data output, Anda harus membuat direktori di jalur yang ditentukan. Anda kemudian dapat menulis file apa pun yang Anda inginkan ada di dalam 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")

Membaca OutputFileDatasetConfig sebagai input ke langkah-langkah non-awal

Setelah langkah alur awal menulis beberapa data ke jalur OutputFileDatasetConfig dan itu menjadi output dari langkah awal tersebut, itu dapat digunakan sebagai input untuk langkah selanjutnya.

Dalam kode berikut:

  • step1_output_data menunjukkan bahwa output PythonScriptStep, step1 ditulis ke datastore ADLS Gen 2, my_adlsgen2 dalam mode akses unggahan. Pelajari selengkapnya tentang cara menyiapkan izin peran agar dapat menulis data kembali ke datastore ADLS Gen 2.

  • Setelah step1 selesai dan output ditulis ke tujuan yang ditunjukkan oleh step1_output_data, maka langkah2 siap menggunakan step1_output_data sebagai input.

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

Tip

Membaca data dalam skrip step2.py python sama dengan yang didokumentasikan sebelumnya dalam Mengakses himpunan data dalam skrip Anda; gunakan ArgumentParser untuk menambahkan argumen --pd dalam skrip Anda untuk mengakses data.

Mendaftarkan objek OutputFileDatasetConfig untuk digunakan kembali

Jika Anda ingin membuat OutputFileDatasetConfig tersedia lebih lama daripada durasi eksperimen Anda, daftarkan ke ruang kerja Anda untuk berbagi dan menggunakan kembali eksperimen.

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

Menghapus konten OutputFileDatasetConfig ketika tidak lagi diperlukan

Azure tidak secara otomatis menghapus data perantara yang ditulis dengan OutputFileDatasetConfig. Untuk menghindari biaya penyimpanan untuk sejumlah besar data yang tidak perlu, Anda harus:

Perhatian

Hanya hapus data perantara setelah 30 hari dari tanggal perubahan terakhir data. Menghapus data sebelumnya dapat menyebabkan eksekusi alur gagal karena alur akan mengasumsikan data perantara ada dalam periode 30 hari untuk digunakan kembali.

  • Hapus data perantara secara terprogram di akhir pekerjaan alur, saat tidak lagi diperlukan.
  • Gunakan penyimpanan blob dengan kebijakan penyimpanan jangka pendek untuk data perantara (lihat Mengoptimalkan biaya dengan mengotomatiskan tingkat akses Azure Blob Storage). Kebijakan ini hanya dapat diatur ke datastore non-default ruang kerja. Gunakan OutputFileDatasetConfig untuk mengekspor data perantara ke datastore lain yang bukan default.
    # 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()
    
  • Tinjau dan hapus data yang tidak lagi diperlukan secara teratur.

Untuk informasi selengkapnya, lihat Merencanakan dan mengelola biaya untuk Azure Machine Learning.

Langkah berikutnya