Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
BERLAKU UNTUK:
Python SDK azure-ai-ml v2 (saat ini)
Proyek pembelajaran mesin biasanya dimulai dengan analisis data eksploratif (EDA) dan praproses data (pembersihan, rekayasa fitur). Ini juga termasuk membangun prototipe model pembelajaran mesin untuk memvalidasi hipotesis. Fase proyek produksi prototipe ini sangat interaktif, dan sangat cocok untuk dikembangkan dalam notebook Jupyter atau dalam IDE dengan konsol Python interaktif. Dalam artikel ini, Anda akan mempelajari cara:
- Mengakses data dari URI penyimpanan data Azure Machine Learning seolah-olah itu adalah sistem file.
- Materialisasi aset data Azure Machine Learning ke Pandas dengan menggunakan
mltablepustaka Python. - Mematerialisasi data dengan unduhan eksplisit menggunakan utilitas
azcopy.
Prasyarat
- Ruang kerja Azure Machine Learning. Untuk informasi selengkapnya, lihat Mengelola ruang kerja Azure Machine Learning di portal atau dengan Python SDK (v2).
- Penyimpanan data Azure Machine Learning. Untuk informasi selengkapnya, lihat Membuat penyimpanan data.
Petunjuk / Saran
Panduan dalam artikel ini menjelaskan akses data selama pengembangan interaktif. Ini berlaku untuk host apa pun yang dapat menjalankan sesi Python. Host ini dapat menjadi komputer lokal Anda, VM cloud, GitHub Codespace, atau host lain. Gunakan instans komputasi Azure Machine Learning - stasiun kerja cloud yang dikelola sepenuhnya dan telah dikonfigurasi sebelumnya. Untuk informasi selengkapnya, lihat Membuat instans komputasi Azure Pembelajaran Mesin.
Penting
Pastikan Anda memiliki pustaka azure-fsspec, mltable, dan azure-ai-ml Python terbaru yang diinstal di lingkungan Python Anda.
pip install -U azureml-fsspec==1.3.1 mltable azure-ai-ml
Versi paket terbaru azure-fsspec dapat berubah dari waktu ke waktu. Untuk informasi selengkapnya tentang paket azure-fsspec, lihat azureml-fsspec 1.3.1.
Mengakses data dari URI datastore seperti yang Anda lakukan dari sistem file
Penyimpanan data Azure Machine Learning adalah referensi ke akun penyimpanan Azure yang sudah ada. Manfaat membuat dan menggunakan datastore meliputi:
- API umum yang mudah digunakan untuk berinteraksi dengan berbagai jenis penyimpanan (blob, file, Azure Data Lake Storage).
- Penemuan datastore yang berguna dengan mudah dalam operasi tim.
- Dukungan untuk akses berbasis kredensial (misalnya, token SAS) dan berbasis identitas (ID Microsoft Entra atau identitas terkelola) ke data.
- Untuk akses berbasis kredensial, informasi koneksi diamankan untuk menghindari paparan kunci dalam skrip.
- Anda dapat menelusuri data dan menyalin dan menempelkan URI datastore di antarmuka pengguna studio Azure Machine Learning.
URI Datastore adalah Pengidentifikasi Sumber Daya Seragam, yang merupakan referensi ke lokasi penyimpanan (jalur) di akun penyimpanan Azure Anda. URI datastore memiliki format ini:
# Azure Machine Learning workspace details:
subscription = '<subscription_ID>'
resource_group = '<resource_group>'
workspace = '<workspace>'
datastore_name = '<datastore>'
path_on_datastore = '<path>'
# Long-form datastore URI format:
uri = f'azureml://subscriptions/{subscription}/resourcegroups/{resource_group}/workspaces/{workspace}/datastores/{datastore_name}/paths/{path_on_datastore}'.
URI datastore ini adalah sebuah implementasi yang diketahui dari spesifikasi Filesystem (fsspec): antarmuka Pythonic terpadu untuk sistem file lokal, jarak jauh, dan tersemat serta penyimpanan data byte. Pertama, gunakan pip untuk menginstal azureml-fsspec paket dan paket dependensinya azureml-dataprep . Anda kemudian dapat menggunakan Azure Machine Learning untuk implementasi datastore fsspec.
Implementasi datastore fsspec Azure Machine Learning secara otomatis menangani penerusan kredensial/identitas yang digunakan oleh datastore Azure Machine Learning. Anda dapat menghindari paparan kunci akun dalam skrip dan prosedur masuk tambahan pada instans komputasi.
Misalnya, Anda dapat langsung menggunakan URI datastore di Pandas. Contoh ini menunjukkan cara membaca file CSV:
import pandas as pd
df = pd.read_csv("azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<filename>.csv")
df.head()
Petunjuk / Saran
Untuk menghindari perlu mengingat format URI datastore, Anda dapat menyalin dan menempelkan URI datastore di antarmuka pengguna studio dengan mengambil langkah-langkah berikut:
- Pilih Data di menu sebelah kiri, lalu pilih tab Penyimpanan data .
- Pilih nama penyimpanan data Anda, lalu pilih Telusuri.
- Temukan file atau folder yang ingin Anda baca ke Pandas, pilih elipsis (...) di sampingnya, lalu pilih Salin URI. Anda kemudian dapat memilih URI datastore untuk disalin ke buku catatan atau skrip Anda.
Anda juga dapat menginstansiasi Azure Machine Learning filesystem untuk menangani perintah yang menyerupai perintah sistem file, seperti ls, glob, exists, dan open.
- Metode ini
ls()mencantumkan file dalam direktori tertentu. Anda dapat menggunakanls(),ls(.), danls (<folder_level_1>/<folder_level_2>)untuk mencantumkan file. Keduanya.dan..didukung dalam jalur relatif. - Metode ini
glob()mendukung*dan**globbing. - Metode mengembalikan
exists()nilai Boolean yang menunjukkan apakah file tertentu ada di direktori akar saat ini. - Metode
open()mengembalikan objek mirip file yang dapat diteruskan ke pustaka lain yang dirancang untuk bekerja dengan file Python. Kode Anda juga dapat menggunakan objek ini seolah-olah itu adalah objek file Python normal. Objek seperti file ini menghormati penggunaanwithkonteks, seperti yang ditunjukkan dalam contoh ini:
from azureml.fsspec import AzureMachineLearningFileSystem
# Instantiate the filesystem by using the following URI.
fs = AzureMachineLearningFileSystem('azureml://subscriptions/<subscriptionID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>')
fs.ls() # List folders and files in datastore datastorename.
# Output example:
# folder1
# folder2
# file3.csv
# Use an open context.
with fs.open('./folder1/file1.csv') as f:
# Do some process.
process_file(f)
Mengunggah file dengan menggunakan AzureMachineLearningFileSystem
from azureml.fsspec import AzureMachineLearningFileSystem
# Instantiate the filesystem by using the following URI.
fs = AzureMachineLearningFileSystem('azureml://subscriptions/<subscriptionID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/')
# You can set recursive to False to upload a file.
fs.upload(lpath='data/upload_files/crime-spring.csv', rpath='data/fsspec', recursive=False, **{'overwrite': 'MERGE_WITH_OVERWRITE'})
# You need to set recursive to True to upload a folder.
fs.upload(lpath='data/upload_folder/', rpath='data/fsspec_folder', recursive=True, **{'overwrite': 'MERGE_WITH_OVERWRITE'})
lpath adalah jalur lokal, dan rpath merupakan jalur jarak jauh.
Jika folder yang Anda tentukan di rpath tidak ada, metode tersebut akan membuat folder untuk Anda.
Metode ini mendukung tiga overwrite mode:
- MENAMBAHKAN. Jika terdapat file dengan nama yang sama di jalur tujuan, APPEND mempertahankan file asli.
- GAGAL_KONFLIK_BERKAS Jika file dengan nama yang sama ada di jalur tujuan, FAIL_ON_FILE_CONFLICT melemparkan kesalahan.
- GABUNG_DENGAN_MENGGANTI. Jika file dengan nama yang sama ada di jalur tujuan, MERGE_WITH_OVERWRITE menimpa file yang ada dengan file baru.
Mengunduh file dengan menggunakan AzureMachineLearningFileSystem
# You can set recursive to False to download a file.
# The downloading overwrite option is determined by the local system. It's MERGE_WITH_OVERWRITE.
fs.download(rpath='data/fsspec/crime-spring.csv', lpath='data/download_files/', recursive=False)
# You need to set recursive to True to download a folder.
fs.download(rpath='data/fsspec_folder', lpath='data/download_folder/', recursive=True)
Contoh
Contoh-contoh ini menunjukkan cara menggunakan spesifikasi sistem file dalam skenario umum.
Membaca satu file CSV ke Pandas
Anda dapat membaca satu file CSV ke Pandas dengan menggunakan kode ini:
import pandas as pd
df = pd.read_csv("azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<file_name>.csv")
Membaca folder file CSV ke Pandas
Metode Pandas read_csv() tidak mendukung pembacaan folder file CSV. Untuk menangani batasan ini, gunakan glob untuk mendapatkan jalur CSV, dan menggabungkannya ke bingkai data dengan metode Pandas concat() . Sampel kode berikutnya menunjukkan cara mencapai perangkaian ini dengan menggunakan sistem file Azure Machine Learning:
import pandas as pd
from azureml.fsspec import AzureMachineLearningFileSystem
# Define the URI. Update <> placeholders.
uri = 'azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>'
# Create the filesystem.
fs = AzureMachineLearningFileSystem(uri)
# Append .csv files in the folder to a list.
dflist = []
for path in fs.glob('/<folder>/*.csv'):
with fs.open(path) as f:
dflist.append(pd.read_csv(f))
# Concatenate data frames.
df = pd.concat(dflist)
df.head()
Membaca file CSV ke Dask
Contoh ini menunjukkan cara membaca file CSV ke dalam bingkai data Dask:
import dask.dd as dd
df = dd.read_csv("azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<file_name>.csv")
df.head()
Membaca folder file parket ke Pandas
Selama proses ETL, file Parquet biasanya ditulis ke folder. Prosesnya kemudian dapat memancarkan file yang relevan dengan ETL, seperti kemajuan, penerapan, dan metadata lainnya. Contoh ini menunjukkan file yang dibuat dari proses ETL (file yang dimulai dengan _) yang kemudian menghasilkan file Parquet dari data.
Dalam skenario ini, Anda hanya akan membaca file Parquet yang ada di dalam folder. Anda mengabaikan file proses ETL. Sampel kode ini menunjukkan bagaimana pola glob hanya dapat membaca file Parquet dalam folder:
import pandas as pd
from azureml.fsspec import AzureMachineLearningFileSystem
# Define the URI. Update <> placeholders.
uri = 'azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>'
# Create the filesystem.
fs = AzureMachineLearningFileSystem(uri)
# Append Parquet files in folder to a list.
dflist = []
for path in fs.glob('/<folder>/*.parquet'):
with fs.open(path) as f:
dflist.append(pd.read_parquet(f))
# Concatenate data frames.
df = pd.concat(dflist)
df.head()
Mengakses data dari sistem file Azure Databricks Anda
Spesifikasi Filesystem (fsspec) memiliki berbagai implementasi yang diketahui, termasuk Sistem File Databricks (dbfs).
Untuk mengakses data dari dbfs sumber daya, Anda memerlukan:
- Nama instance, dalam bentuk
adb-<number>.<number>.azuredatabricks.net. Anda dapat menemukan nilai ini di URL ruang kerja Azure Databricks Anda. - Token akses pribadi. Untuk informasi selengkapnya tentang pembuatan token akses pribadi, lihat Mengautentikasi dengan token akses pribadi Azure Databricks (warisan).
Dengan nilai-nilai ini, buat variabel lingkungan untuk token PAT pada instans komputasi Anda:
export ADB_PAT=<personal_access_token>
Anda kemudian dapat mengakses data di Pandas, seperti yang ditunjukkan dalam contoh ini:
import os
import pandas as pd
pat = os.getenv(ADB_PAT)
path_on_dbfs = '<absolute_path_on_dbfs>' # e.g. /folder/subfolder/file.csv
storage_options = {
'instance':'adb-<number>.<number>.azuredatabricks.net',
'token': pat
}
df = pd.read_csv(f'dbfs://{path_on_dbfs}', storage_options=storage_options)
Membaca gambar dengan pillow
from PIL import Image
from azureml.fsspec import AzureMachineLearningFileSystem
# Define the URI. Update <> placeholders.
uri = 'azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>'
# Create the filesystem.
fs = AzureMachineLearningFileSystem(uri)
with fs.open('/<folder>/<image.jpeg>') as f:
img = Image.open(f)
img.show(οΌ
Contoh himpunan data kustom PyTorch
Dalam contoh ini, Anda membuat himpunan data kustom PyTorch untuk memproses gambar. Dalam skenario ini, file anotasi (dalam format CSV) ada, dengan struktur keseluruhan ini:
image_path, label
0/image0.png, label0
0/image1.png, label0
1/image2.png, label1
1/image3.png, label1
2/image4.png, label2
2/image5.png, label2
Subfolder menyimpan gambar-gambar ini, sesuai dengan labelnya:
/
βββ πimages
βββ π0
β βββ π·image0.png
β βββ π·image1.png
βββ π1
β βββ π·image2.png
β βββ π·image3.png
βββ π2
βββ π·image4.png
βββ π·image5.png
Kelas PyTorch Dataset kustom harus menerapkan tiga fungsi: __init__, , __len__dan __getitem__, seperti yang ditunjukkan di sini:
import os
import pandas as pd
from PIL import Image
from torch.utils.data import Dataset
class CustomImageDataset(Dataset):
def __init__(self, filesystem, annotations_file, img_dir, transform=None, target_transform=None):
self.fs = filesystem
f = filesystem.open(annotations_file)
self.img_labels = pd.read_csv(f)
f.close()
self.img_dir = img_dir
self.transform = transform
self.target_transform = target_transform
def __len__(self):
return len(self.img_labels)
def __getitem__(self, idx):
img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])
f = self.fs.open(img_path)
image = Image.open(f)
f.close()
label = self.img_labels.iloc[idx, 1]
if self.transform:
image = self.transform(image)
if self.target_transform:
label = self.target_transform(label)
return image, label
Anda kemudian dapat membuat instans himpunan data, seperti yang ditunjukkan di sini:
from azureml.fsspec import AzureMachineLearningFileSystem
from torch.utils.data import DataLoader
# Define the URI. Update <> placeholders.
uri = 'azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>'
# Create the filesystem.
fs = AzureMachineLearningFileSystem(uri)
# Create the dataset.
training_data = CustomImageDataset(
filesystem=fs,
annotations_file='/annotations.csv',
img_dir='/<path_to_images>/'
)
# Prepare your data for training with DataLoaders.
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
Materialisasikan data ke dalam Pandas menggunakan pustaka mltable
Pustaka mltable juga dapat membantu Anda mengakses data di penyimpanan cloud. Untuk membaca data ke Panda dengan menggunakan mltable, gunakan format umum berikut:
import mltable
# Define a path, folder, or pattern.
path = {
'file': '<supported_path>'
# alternatives
# 'folder': '<supported_path>'
# 'pattern': '<supported_path>'
}
# Create an mltable from paths.
tbl = mltable.from_delimited_files(paths=[path])
# alternatives
# tbl = mltable.from_parquet_files(paths=[path])
# tbl = mltable.from_json_lines_files(paths=[path])
# tbl = mltable.from_delta_lake(paths=[path])
# Materialize to Pandas.
df = tbl.to_pandas_dataframe()
df.head()
Jalur yang didukung
Pustaka mltable mendukung pembacaan data tabular dari berbagai jenis jalur:
| Lokasi | Contoh |
|---|---|
| Jalur pada komputer lokal Anda | ./home/username/data/my_data |
| Jalur pada server HTTP publik | https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv |
| Jalur pada Azure Storage | wasbs://<container_name>@<account_name>.blob.core.windows.net/<path> abfss://<file_system>@<account_name>.dfs.core.windows.net/<path> |
| Datastore Azure Pembelajaran Mesin bentuk panjang | azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<name>/paths/<path> |
Catatan
Untuk jalur di penyimpanan data Azure Storage dan Azure Machine Learning, mltable menggunakan passthrough kredensial. Jika Anda tidak memiliki izin untuk mengakses data pada penyimpanan yang mendasar, Anda tidak dapat mengakses data.
File, folder, dan glob
mltable mendukung pembacaan dari:
- File. Contohnya,
abfss://<file_system>@<account_name>.dfs.core.windows.net/my-csv.csv. - Folder. Contohnya,
abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/. -
pola glob . Contohnya,
abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/*.csv. - Kombinasi file, folder, dan/atau pola glob.
mltable memungkinkan materialisasi data menjadi satu kerangka data dari kombinasi sumber daya penyimpanan lokal dan cloud, dan dari kombinasi file, folder, dan glob. Contohnya:
path1 = {
'file': 'abfss://filesystem@account1.dfs.core.windows.net/my-csv.csv'
}
path2 = {
'folder': './home/username/data/my_data'
}
path3 = {
'pattern': 'abfss://filesystem@account2.dfs.core.windows.net/folder/*.csv'
}
tbl = mltable.from_delimited_files(paths=[path1, path2, path3])
Format file yang didukung
mltable mendukung format file berikut.
- Teks yang dibatasi (misalnya, file CSV):
mltable.from_delimited_files(paths=[path]) - Parket:
mltable.from_parquet_files(paths=[path]) - Delta:
mltable.from_delta_lake(paths=[path]) - Format Baris JSON:
mltable.from_json_lines_files(paths=[path])
Contoh
Membaca file CSV
- Data Lake Storage
- Penyimpanan Blob
- Azure Pembelajaran Mesin Datastore
- Server HTTP
Ganti placeholder (<>) dalam cuplikan kode ini dengan nilai Anda.
import mltable
path = {
'file': 'abfss://<filesystem>@<account>.dfs.core.windows.net/<folder>/<file_name>.csv'
}
tbl = mltable.from_delimited_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()
Membaca file Parquet dalam folder
Contoh ini menunjukkan cara mltable menggunakan pola glob , seperti wildcard, untuk memastikan bahwa hanya file Parquet yang dibaca.
- Data Lake Storage
- Penyimpanan Blob
- Azure Pembelajaran Mesin Datastore
- Server HTTP
Ganti placeholder (<>) dalam cuplikan kode ini dengan nilai Anda:
import mltable
path = {
'pattern': 'abfss://<filesystem>@<account>.dfs.core.windows.net/<folder>/*.parquet'
}
tbl = mltable.from_parquet_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()
Membaca aset data
Bagian ini memperlihatkan cara mengakses aset data Azure Pembelajaran Mesin Anda di Pandas.
Aset tabel
Jika sebelumnya Anda membuat aset tabel di Azure Machine Learning (atau mltable V1 TabularDataset), Anda dapat memuat aset tabel tersebut ke Pandas dengan menggunakan kode ini:
import mltable
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
ml_client = MLClient.from_config(credential=DefaultAzureCredential())
data_asset = ml_client.data.get(name="<name_of_asset>", version="<version>")
tbl = mltable.load(f'azureml:/{data_asset.id}')
df = tbl.to_pandas_dataframe()
df.head()
Aset file
Jika Anda telah mendaftarkan aset file (file CSV, misalnya), Anda dapat membaca aset tersebut ke dalam bingkai data Pandas dengan menggunakan kode ini:
import mltable
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
ml_client = MLClient.from_config(credential=DefaultAzureCredential())
data_asset = ml_client.data.get(name="<name_of_asset>", version="<version>")
path = {
'file': data_asset.path
}
tbl = mltable.from_delimited_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()
Aset folder
Jika Anda telah mendaftarkan aset folder (uri_folder atau V1 FileDataset), misalnya, folder yang berisi file CSV, Anda dapat membaca aset tersebut ke dalam bingkai data Pandas dengan menggunakan kode ini:
import mltable
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
ml_client = MLClient.from_config(credential=DefaultAzureCredential())
data_asset = ml_client.data.get(name="<name_of_asset>", version="<version>")
path = {
'folder': data_asset.path
}
tbl = mltable.from_delimited_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()
Membaca dan memproses volume data besar dengan menggunakan Panda
Petunjuk / Saran
Panda tidak dirancang untuk menangani himpunan data besar. Panda hanya dapat memproses data yang sesuai dengan memori instans komputasi.
Untuk himpunan data besar, gunakan Spark terkelola Azure Machine Learning. Layanan ini menyediakan API PySpark Pandas.
Anda mungkin ingin melakukan iterasi dengan cepat pada subset himpunan data besar yang lebih kecil sebelum meningkatkan skala ke pekerjaan asinkron jarak jauh.
mltable menyediakan fungsionalitas untuk mendapatkan sampel data besar melalui metode take_random_sample :
import mltable
path = {
'file': 'https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv'
}
tbl = mltable.from_delimited_files(paths=[path])
# Take a random 30% sample of the data.
tbl = tbl.take_random_sample(probability=.3)
df = tbl.to_pandas_dataframe()
df.head()
Anda juga dapat mengambil subset data besar dengan menggunakan operasi ini:
Mengunduh data dengan menggunakan azcopy utilitas
azcopy Gunakan utilitas untuk mengunduh data ke dalam sistem file lokal SSD host Anda (komputer lokal, VM cloud, instans komputasi Azure Machine Learning, dan sebagainya).
azcopy Utilitas, yang telah diinstal sebelumnya pada instans komputasi Azure Pembelajaran Mesin, menangani unduhan data. Jika Anda tidak menggunakan instans komputasi Azure Machine Learning atau Data Science Virtual Machine (DSVM), Anda mungkin perlu menginstal azcopy. Untuk informasi selengkapnya, lihat azcopy.
Perhatian
Jangan mengunduh data ke /home/azureuser/cloudfiles/code lokasi pada instans komputasi. Lokasi ini dirancang untuk menyimpan artefak buku catatan dan kode, bukan data. Membaca data dari lokasi ini menimbulkan beban kinerja yang signifikan selama pelatihan. Sebagai gantinya, simpan data di lokasi home/azureuser, yaitu SSD lokal dari simpul komputasi.
Buka terminal dan buat direktori baru, misalnya:
mkdir /home/azureuser/data
Masuk ke azcopy:
azcopy login
Sekarang Anda dapat menyalin data dengan menggunakan URI penyimpanan:
SOURCE=https://<account_name>.blob.core.windows.net/<container>/<path>
DEST=/home/azureuser/data
azcopy cp $SOURCE $DEST