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 dariOutputFileDatasetConfig
yang ingin Anda pertahankan
Prasyarat
Anda memerlukan:
Langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai. Coba versi gratis atau berbayar Azure Machine Learning.
SDK Azure Machine Learning untuk Python, atau akses ke studio Azure Machine Learning.
Ruang kerja Azure Machine Learning.
Buat ruang kerja Azure Machine Learning atau gunakan ruang kerja yang sudah ada melalui Python SDK. Impor kelas
Workspace
danDatastore
, dan muat informasi langganan Anda dari fileconfig.json
menggunakan fungsifrom_config()
. Fungsi ini mencari file JSON di direktori saat ini secara default, tetapi Anda juga dapat menentukan parameter jalur untuk mengarah ke file menggunakanfrom_config(path="your/file/path")
.import azureml.core from azureml.core import Workspace, Datastore ws = Workspace.from_config()
Beberapa data yang sudah ada sebelumnya. Artikel ini secara singkat memperlihatkan penggunaan kontainer blob Azure.
Opsional: Alur pembelajaran mesin yang ada, seperti yang dijelaskan dalam Membuat dan menjalankan alur pembelajaran mesin dengan SDK Azure Machine Learning.
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:
- Menggunakan
TabularDataset.as_named_input()
atauFileDataset.as_named_input()
(tanpa 's' di akhir) untuk membuat objekDatasetConsumptionConfig
- Hanya
FileDataset
untuk:. Gunakanas_mount()
atauas_download()
untuk mengatur mode akses. TabularDataset tidak mendukung mode akses set. - Meneruskan himpunan data ke langkah-langkah alur Anda menggunakan argumen
arguments
atauinputs
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 olehstep1_output_data
, maka langkah2 siap menggunakanstep1_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.