Produk PAI seperti Deep Learning Containers (DLC) dan Data Science Workshop (DSW) memungkinkan Anda memasang sumber data dari Object Storage Service (OSS) ke path tertentu dalam kontainer menggunakan ossfs 2.0 atau JindoFuse dari Alibaba Cloud E-MapReduce. Anda juga dapat membaca data OSS menggunakan OSS Connector for AI/ML atau OSS SDK. Pilih metode akses data yang paling sesuai dengan kasus penggunaan Anda.
Latar Belakang
Dalam pengembangan AI, data sumber sering disimpan di OSS dan diunduh ke lingkungan pelatihan untuk pengembangan dan pelatihan model. Namun, praktik umum ini menimbulkan beberapa tantangan:
-
Waktu unduh dataset yang lama dapat membuat GPU menganggur.
-
Data harus diunduh berulang kali untuk setiap pekerjaan pelatihan.
-
Pengambilan sampel data secara acak memerlukan pengunduhan seluruh dataset ke setiap node pelatihan.
Untuk mengatasi masalah tersebut, pertimbangkan metode berikut untuk membaca data OSS:
|
Metode akses |
Deskripsi |
Kasus penggunaan |
|
Memasang dataset OSS ke path tertentu dalam kontainer menggunakan komponen JindoFuse, sehingga memungkinkan pembacaan dan penulisan data secara langsung. |
|
|
|
ossfs 2.0 adalah klien untuk akses terpasang berkinerja tinggi ke OSS. Fitur ini unggul dalam operasi baca dan tulis sekuensial, memungkinkan Anda memanfaatkan bandwidth tinggi OSS secara optimal. |
ossfs 2.0 cocok untuk skenario yang memerlukan akses penyimpanan berkinerja tinggi, seperti pelatihan AI, inferensi, pemrosesan big data, kendaraan otonom, dan beban kerja komputasi-intensif lainnya. Beban kerja ini terutama melibatkan pembacaan sekuensial dan acak, penulisan sekuensial (append-only), serta tidak memerlukan semantik POSIX penuh. |
|
|
PAI mengintegrasikan OSS Connector for AI/ML untuk mengalirkan file dari OSS secara langsung dalam kode PyTorch, menyederhanakan dan mempercepat akses data. Keunggulan utamanya meliputi:
|
Gunakan konektor ini untuk akses non-mounted guna mempercepat pembacaan dataset untuk pelatihan PyTorch, terutama saat membaca jutaan file kecil atau memerlukan throughput tinggi. |
|
|
Mengalirkan data dari OSS menggunakan OSS SDK. Solusi ini fleksibel dan efisien, secara signifikan mengurangi waktu permintaan data dan meningkatkan efisiensi pelatihan. |
Gunakan OSS Python SDK atau OSS Python API untuk akses sementara dan non-mounted ke data OSS, atau saat logika aplikasi Anda menentukan kapan harus mengakses OSS. |
Saat Anda menggunakan JindoFuse atau ossfs 2.0 untuk memasang OSS, Anda dapat menentukan peran RAM untuk akses OSS guna mencapai kontrol izin yang lebih terperinci. Anda juga dapat mengaktifkan OSS Mount Requires RAM Role dalam konfigurasi umum ruang kerja. Setelah mengaktifkan opsi ini:
-
Saat membuat mount OSS di fitur seperti DSW, DLC, dan EAS, Anda harus memilih peran RAM. Peran RAM default tidak diizinkan.
-
Saat membuat dataset lanjutan atau logis yang melibatkan mount OSS, peran RAM juga diberlakukan berdasarkan konfigurasi ini.
-
Saat membuat instans DSW, pekerjaan DLC, atau layanan EAS, Anda tidak dapat memilih peran default PAI sebagai peran RAM.
JindoFuse
DLC dan DSW memungkinkan Anda menggunakan komponen JindoFuse untuk memasang dataset OSS atau path OSS ke path tertentu dalam kontainer. Hal ini memungkinkan Anda membaca dan menulis langsung data yang disimpan di OSS selama proses pelatihan.
Metode pemasangan
DLC
Saat membuat pekerjaan pelatihan terdistribusi (DLC), Anda dapat memasang data OSS. Dua jenis pemasangan berikut didukung: Untuk petunjuk konfigurasi terperinci, lihat Buat pekerjaan pelatihan.
Di kedua bagian Datasets dan Directly Mount, Anda dapat mengklik Expand Advanced Configuration untuk melihat lebih banyak opsi pemasangan dan menggunakan toggle Read-Only untuk mengontrol mode pemasangan.
|
Jenis pemasangan |
Deskripsi |
|
Datasets |
Pilih dataset bertipe OSS dan konfigurasikan Mount Path. Untuk dataset publik, hanya mode read-only yang didukung. |
|
Directly Mount |
Memasang langsung path bucket OSS. Jika Anda menggunakan kuota sumber daya komputasi cerdas Lingjun dengan cache lokal diaktifkan, Anda dapat mengaktifkan sakelar Use Cache untuk mengaktifkan caching. |
DSW
Saat membuat instans DSW, Anda dapat memasang data OSS. Dua jenis pemasangan berikut didukung: Untuk petunjuk konfigurasi terperinci, lihat Buat instans DSW.
Kedua jenis pemasangan menyediakan opsi Expand Advanced Configuration. Jenis penyimpanan yang didukung oleh Storage Path Mounting meliputi OSS, NAS tujuan umum, Extreme NAS, CPFS, dan Intelligent Computing CPFS.
|
Jenis pemasangan |
Deskripsi |
|
Dataset Mounting |
Pilih dataset bertipe OSS dan konfigurasikan Mount Path. Saat menggunakan dataset publik, hanya mode read-only yang didukung. |
|
Storage Path Mounting |
Memasang langsung path bucket OSS. |
Batasan konfigurasi default
Jika Anda membiarkan parameter Advanced Configurations kosong, konfigurasi default akan diterapkan. Konfigurasi default memiliki batasan berikut:
-
Untuk mempercepat pembacaan file OSS, metadata (daftar direktori dan file) di-cache saat OSS dipasang.
Dalam pelatihan terdistribusi, jika beberapa node mencoba membuat direktori yang sama, cache metadata dapat menyebabkan setiap node mencoba membuatnya. Hanya satu node yang berhasil, sedangkan yang lain melaporkan error.
-
Secara default, API MultiPart OSS digunakan untuk membuat file. Objek baru terlihat di OSS hanya setelah operasi penulisan selesai.
-
Operasi baca dan tulis konkuren pada file yang sama tidak didukung.
-
Operasi tulis acak pada file tidak didukung.
Konfigurasi JindoFuse umum
Anda juga dapat menyesuaikan parameter JindoFuse dalam konfigurasi lanjutan berdasarkan kasus penggunaan Anda.
Topik ini memberikan saran konfigurasi JindoFuse untuk beberapa skenario umum. Pengaturan ini mungkin tidak memberikan kinerja optimal untuk semua beban kerja. Untuk opsi konfigurasi yang lebih fleksibel, lihat Panduan Pengguna JindoFuse.
Quick Read/write: memastikan pembacaan dan penulisan cepat. Namun, inkonsistensi data dapat terjadi selama pembacaan atau penulisan konkuren. Anda dapat memasang data pelatihan dan model ke path pemasangan mode ini. Kami menyarankan agar Anda tidak menggunakan path pemasangan mode ini sebagai direktori kerja.
{ "fs.oss.download.thread.concurrency": "Twice the number of CPU cores", "fs.oss.upload.thread.concurrency": "Twice the number of CPU cores", "fs.jindo.args": "-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink" }Incremental Read/Write: memastikan konsistensi data selama penulisan inkremental. Jika data asli ditimpa, inkonsistensi data dapat terjadi. Kecepatan pembacaan sedikit lambat. Anda dapat menggunakan mode ini untuk menyimpan file bobot model untuk data pelatihan.
{ "fs.oss.upload.thread.concurrency": "Twice the number of CPU cores", "fs.jindo.args": "-oattr_timeout=3 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink" }Consistent Read/write: memastikan konsistensi data selama pembacaan atau penulisan konkuren dan cocok untuk skenario yang memerlukan konsistensi data tinggi tanpa memerlukan pembacaan cepat. Anda dapat menggunakan mode ini untuk menyimpan kode proyek Anda.
{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0 -oauto_cache -ono_symlink" }Read-only: hanya mengizinkan pembacaan. Anda dapat menggunakan mode ini untuk memasang dataset publik.
{ "fs.oss.download.thread.concurrency": "Twice the number of CPU cores", "fs.jindo.args": "-oro -oattr_timeout=7200 -oentry_timeout=7200 -onegative_timeout=7200 -okernel_cache -ono_symlink" }
Operasi konfigurasi umum lainnya meliputi:
-
Pilih versi JindoFuse yang berbeda:
{ "fs.jindo.fuse.pod.image.tag": "6.7.0" } -
Nonaktifkan cache metadata: Saat menjalankan pelatihan terdistribusi di mana beberapa node mencoba menulis ke direktori yang sama secara bersamaan, cache dapat menyebabkan operasi tulis pada beberapa node gagal. Untuk mengatasi masalah ini, tambahkan argumen
-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0ke baris perintah JindoFuse.{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0" } -
Atur jumlah thread unggah/unduh: Sesuaikan jumlah thread dengan menggunakan parameter berikut.
{ "fs.oss.upload.thread.concurrency": "32", "fs.oss.download.thread.concurrency": "32", "fs.oss.read.readahead.buffer.count": "64", "fs.oss.read.readahead.buffer.size": "4194304" } -
Gunakan AppendObject untuk penulisan: Semua file yang dibuat secara lokal pada mount dibuat sebagai objek di OSS dengan memanggil API
AppendObject. Ukuran objek yang dibuat menggunakan AppendObject tidak boleh melebihi 5 GB. Untuk batasan penggunaan lebih lanjut, lihat AppendObject. Berikut contoh konfigurasinya:{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0", "fs.oss.append.enable": "true", "fs.oss.flush.interval.millisecond": "1000", "fs.oss.read.readahead.buffer.size": "4194304", "fs.oss.write.buffer.size": "262144" } -
Pasang OSS-HDFS: Untuk informasi tentang cara mengaktifkan OSS-HDFS, lihat Apa itu Layanan OSS-HDFS? Dalam skenario pelatihan terdistribusi, kami merekomendasikan menambahkan parameter berikut:
{ "fs.jindo.args": "-oattr_timeout=0 -oentry_timeout=0 -onegative_timeout=0 -ono_symlink -ono_xattr -ono_flock -odirect_io", "fs.oss.flush.interval.millisecond": "10000", "fs.oss.randomwrite.sync.interval.millisecond": "10000" } -
Konfigurasikan sumber daya memori: Anda dapat mengatur parameter
fs.jindo.fuse.pod.mem.limituntuk menyesuaikan batas memori. Contoh kodenya sebagai berikut:{ "fs.jindo.fuse.pod.mem.limit": "10Gi" }
ossfs 2.0
Untuk memasang sumber data OSS menggunakan ossfs, atur {"mountType":"ossfs"} di Advanced Configuration.
Metode pemasangan
Pasang OSS di DLC
Saat membuat pekerjaan DLC, Anda dapat memasang data OSS. DLC mendukung dua jenis pemasangan berikut. Untuk detail konfigurasi, lihat Buat pekerjaan pelatihan.
|
Jenis pemasangan |
Deskripsi |
|
Datasets |
Pilih dataset OSS dan konfigurasikan Mount Path. Dataset publik hanya mendukung mode read-only. |
|
Directly Mount |
Memasang langsung path penyimpanan bucket OSS. Jika Anda menggunakan kuota sumber daya Lingjun dengan cache lokal diaktifkan, Anda dapat mengaktifkan Use Cache. |
Pasang OSS di DSW
Saat membuat instans DSW, Anda dapat memasang data OSS. DSW mendukung dua jenis pemasangan berikut. Untuk detail konfigurasi, lihat Buat instans DSW.
|
Jenis pemasangan |
Deskripsi |
|
Dataset Mounting |
Pilih dataset OSS dan konfigurasikan Mount Path. Dataset publik hanya mendukung mode read-only. |
|
Storage Path Mounting |
Memasang langsung path penyimpanan bucket OSS. |
Konfigurasi ossfs umum
Di Advanced Configuration, Anda dapat mengatur parameter lanjutan menggunakan fs.ossfs.args. Pisahkan beberapa parameter dengan koma (,). Untuk informasi lebih lanjut tentang parameter lanjutan ini, lihat ossfs 2.0. Contoh berikut menunjukkan beberapa kasus penggunaan umum:
-
Sumber data statis selama pekerjaan: Untuk file yang tidak dimodifikasi selama pekerjaan, konfigurasikan timeout cache yang panjang untuk mengurangi permintaan metadata. Kasus penggunaan tipikal adalah membaca batch file yang ada dan menghasilkan kumpulan file baru setelah pemrosesan.
{ "mountType":"ossfs", "fs.ossfs.args": "-oattr_timeout=7200" } -
Pembacaan/penulisan cepat: Gunakan timeout cache metadata yang lebih pendek untuk menyeimbangkan efisiensi cache dan kesegaran data.
{ "mountType":"ossfs", "fs.ossfs.args": "-oattr_timeout=3, -onegative_timeout=0" } -
Pembacaan/penulisan konsisten untuk pekerjaan terdistribusi: Secara default, ossfs memperbarui data file berdasarkan cache metadata. Gunakan konfigurasi berikut untuk memastikan tampilan yang konsisten di beberapa node.
{ "mountType":"ossfs", "fs.ossfs.args": "-onegative_timeout=0, -oclose_to_open" } -
Out-of-memory (OOM) akibat terlalu banyak file terbuka di DLC atau DSW: Konkurensi pekerjaan tinggi di DLC dan DSW dapat membuka banyak file secara bersamaan, berpotensi menyebabkan masalah Out-of-memory (OOM). Konfigurasi berikut dapat membantu mengurangi tekanan memori.
{ "mountType":"ossfs", "fs.ossfs.args": "-oreaddirplus=false, -oinode_cache_eviction_threshold=300000" } -
Kegagalan menulis file besar:
-oupload_buffer_sizemengatur ukuran buffer (dalam byte) untuk unggah multi-bagian. Parameter ini menentukan ukuran file maksimum yang dapat ditulis, dihitung sebagai upload_buffer_size * 10000.Secara default, ossfs 2.0 menggunakan ukuran bagian 8 MiB, yang membatasi ukuran file maksimum yang dapat ditulis hingga 78,125 GiB. Saat Anda menulis file yang melebihi batas ini, operasi akan gagal. Untuk meningkatkan ukuran file maksimum yang didukung, konfigurasikan opsi
-oupload_buffer_sizeuntuk meningkatkan ukuran bagian. Misalnya, mengatur ukuran bagian menjadi 32 MiB (33.554.432 byte) mendukung ukuran file maksimum 312,5 GiB. Perhatikan bahwa-upload_buffer_sizeyang lebih besar mengonsumsi lebih banyak memori. Anda dapat mengontrol penggunaan memori dengan mengonfigurasi-total_mem_limit. Untuk informasi lebih lanjut, lihat Opsi pemasangan.{ "mountType":"ossfs", "fs.ossfs.args": "-oupload_buffer_size=33554432" }
OSS Connector for AI/ML
OSS Connector for AI/ML adalah pustaka klien dari tim OSS Alibaba Cloud untuk beban kerja AI dan pembelajaran mesin. Fitur ini menyederhanakan pemuatan data untuk pelatihan PyTorch skala besar, mengurangi waktu dan kompleksitas transfer data, serta mempercepat pelatihan model dengan menghilangkan hambatan pemuatan data. Untuk menyederhanakan akses data, platform PAI telah mengintegrasikan OSS Connector for AI/ML, memungkinkan Anda mengalirkan data langsung dari OSS dalam kode PyTorch Anda untuk pemuatan data yang efisien.
Batasan
-
Citra resmi: OSS Connector for AI/ML hanya tersedia di pekerjaan DLC dan instans DSW yang menggunakan citra resmi PyTorch 2.0 atau lebih baru.
-
Citra kustom: Hanya PyTorch 2.0 atau lebih baru yang didukung. Untuk citra kustom yang menggunakan versi yang didukung, instal OSS Connector for AI/ML dengan menjalankan perintah berikut:
pip install -i http://yum.tbsite.net/aliyun-pypi/simple/ --extra-index-url http://yum.tbsite.net/pypi/simple/ --trusted-host=yum.tbsite.net osstorchconnector -
Versi Python: Hanya Python 3.8–3.12 yang didukung.
Prasyarat
-
Konfigurasikan file kredensial.
Anda dapat mengonfigurasi kredensial dengan salah satu cara berikut:
-
Konfigurasikan akses tanpa kata sandi ke OSS untuk pekerjaan DLC Anda. Untuk informasi lebih lanjut, lihat Konfigurasikan peran RAM DLC. Dengan metode ini, pekerjaan DLC memperoleh kredensial sementara dari STS untuk mengakses OSS dan sumber daya cloud lainnya secara aman, menghilangkan kebutuhan informasi otentikasi eksplisit dan mengurangi risiko kebocoran kunci akses.
-
Konfigurasikan file kredensial dalam proyek kode Anda untuk mengelola informasi otentikasi. Contoh konfigurasinya sebagai berikut:
CatatanMenyimpan informasi kunci akses dalam teks biasa menimbulkan risiko keamanan. Kami menyarankan menggunakan peran RAM untuk mengonfigurasi kredensial secara otomatis dalam instans DLC. Untuk informasi lebih lanjut, lihat Konfigurasikan peran RAM DLC.
Saat menggunakan OSS Connector for AI/ML, Anda dapat menentukan path ke file kredensial untuk secara otomatis mengambil informasi otentikasi guna menandatangani permintaan data OSS.
{ "AccessKeyId": "<Access-key-id>", "AccessKeySecret": "<Access-key-secret>", "SecurityToken": "<Security-Token>", "Expiration": "2024-08-20T00:00:00Z" }Tabel berikut menjelaskan bidang-bidangnya.
Parameter
Wajib
Deskripsi
Contoh
AccessKeyId
Ya
ID kunci akses dan rahasia kunci akses dari akun Alibaba Cloud atau Pengguna RAM.
CatatanSaat menggunakan kredensial sementara dari STS untuk mengakses OSS, atur parameter ini ke ID kunci akses sementara dan rahasia kunci akses sementara.
NTS****
AccessKeySecret
Ya
7NR2****
SecurityToken
Tidak
Token keamanan dari STS. Parameter ini wajib hanya saat Anda menggunakan kredensial sementara dari STS untuk mengakses OSS.
STS.6MC2****
Expiration
Tidak
Waktu kedaluwarsa kredensial. Jika bidang ini kosong, kredensial tidak kedaluwarsa. OSS Connector for AI/ML membaca ulang file kredensial saat kredensial kedaluwarsa.
2024-08-20T00:00:00Z
-
-
Konfigurasikan file
config.json. Contoh konfigurasinya sebagai berikut:File ini digunakan untuk mengelola pengaturan dalam proyek Anda, seperti tingkat konkurensi, parameter prefetch, dan lokasi file log. Saat menggunakan OSS Connector for AI/ML, tentukan path ke file
config.jsonini. Konektor kemudian secara otomatis menerapkan pengaturan yang Anda konfigurasikan dan menulis log terkait permintaan data OSS ke file log yang ditentukan.{ "logLevel": 1, "logPath": "/var/log/oss-connector/connector.log", "auditPath": "/var/log/oss-connector/audit.log", "datasetConfig": { "prefetchConcurrency": 24, "prefetchWorker": 2 }, "checkpointConfig": { "prefetchConcurrency": 24, "prefetchWorker": 4, "uploadConcurrency": 64 } }Tabel berikut menjelaskan bidang-bidangnya.
Parameter
Wajib
Deskripsi
Contoh
logLevel
Ya
Tingkat log. Nilai default adalah 1 (INFO). Nilai yang valid:
-
0: DEBUG
-
1: INFO
-
2: WARN
-
3: ERROR
1
logPath
Ya
Path log untuk konektor. Path default adalah
/var/log/oss-connector/connector.log./var/log/oss-connector/connector.log
auditPath
Ya
Audit log untuk catatan I/O Konektor yang merekam permintaan baca dan tulis dengan latensi lebih dari 100 milidetik. Path default adalah
/var/log/oss-connector/audit.log./var/log/oss-connector/audit.log
DatasetConfig
prefetchConcurrency
Ya
Jumlah tugas konkuren untuk prefetch data dari OSS saat menggunakan dataset. Nilai default adalah 24.
24
prefetchWorker
Ya
Jumlah vCPU yang tersedia untuk prefetch data dari OSS saat menggunakan dataset. Nilai default adalah 2.
2
checkpointConfig
prefetchConcurrency
Ya
Jumlah tugas konkuren untuk prefetch data dari OSS selama pembacaan checkpoint. Nilai default adalah 24.
24
prefetchWorker
Ya
Jumlah vCPU yang tersedia untuk prefetch data dari OSS selama pembacaan checkpoint. Nilai default adalah 4.
4
uploadConcurrency
Ya
Jumlah tugas konkuren untuk mengunggah data selama penulisan checkpoint. Nilai default adalah 64.
64
-
Penggunaan
OSS Connector for AI/ML menyediakan dua antarmuka akses dataset, OssMapDataset dan OssIterableDataset, yang memperluas antarmuka PyTorch Dataset dan IterableDataset masing-masing. OssIterableDataset dioptimalkan dengan prefetching untuk efisiensi pelatihan yang lebih tinggi. Urutan pembacaan data OssMapDataset ditentukan oleh DataLoader dan mendukung operasi shuffle. Anda dapat memilih antarmuka akses dataset berdasarkan rekomendasi berikut:
-
Jika memori Anda terbatas, dataset besar, dan hanya memerlukan pembacaan sekuensial dengan paralelisme rendah, gunakan
OssIterableDataset. -
Jika memori Anda cukup, dataset lebih kecil, dan memerlukan akses acak serta pemrosesan paralel, gunakan
OssMapDataset.
OSS Connector for AI/ML juga menyediakan antarmuka OssCheckpoint untuk memuat dan menyimpan model. Saat ini, fitur OssCheckpoint hanya tersedia di lingkungan sumber daya komputasi tujuan umum.
Bagian berikut menjelaskan cara menggunakan ketiga antarmuka ini.
OssMapDataset
Tiga metode akses dataset berikut didukung:
-
Akses folder berdasarkan awalan path OSS
Anda dapat menentukan hanya nama folder tanpa perlu mengonfigurasi file indeks, yang menyederhanakan pemeliharaan dan skalabilitas. Gunakan metode ini jika folder OSS Anda tersusun sebagai berikut:
dataset_folder/ ├── class1/ │ ├── image1.JPEG │ └── ... ├── class2/ │ ├── image2.JPEG │ └── ...Saat menggunakan metode ini, Anda harus menentukan awalan path OSS dan mendefinisikan metode khusus untuk mengurai aliran file. Contoh berikut menunjukkan cara mengurai dan mentransformasi file gambar:
def read_and_transform(data): normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) transform = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), normalize, ]) try: img = accimage.Image((data.read())) val = transform(img) label = data.label # Nama file except Exception as e: print("read failed", e) return None, 0 return val, label dataset = OssMapDataset.from_prefix("{oss_data_folder_uri}", endpoint="{oss_endpoint}", transform=read_and_transform, cred_path=cred_path, config_path=config_path) -
Akses file dari file manifes
Metode ini memungkinkan Anda mengakses data dari beberapa bucket OSS, memberikan manajemen data yang lebih fleksibel. Gunakan metode ini jika folder OSS Anda tersusun sebagai berikut dan Anda memiliki file manifes yang memetakan nama file ke label.
dataset_folder/ ├── class1/ │ ├── image1.JPEG │ └── ... ├── class2/ │ ├── image2.JPEG │ └── ... └── .manifestFile manifes memiliki format berikut:
{'data': {'source': 'oss://examplebucket.oss-cn-wulanchabu.aliyuncs.com/dataset_folder/class1/image1.JPEG'}} {'data': {'source': ''}}Saat menggunakan metode ini, Anda harus mendefinisikan metode khusus untuk mengurai file manifes. Contoh kodenya sebagai berikut:
def transform_oss_path(input_path): pattern = r'oss://(.*?)\.(.*?)/(.*)' match = re.match(pattern, input_path) if match: return f'oss://{match.group(1)}/{match.group(3)}' else: return input_path def manifest_parser(reader: io.IOBase) -> Iterable[Tuple[str, str, int]]: lines = reader.read().decode("utf-8").strip().split("\n") data_list = [] for i, line in enumerate(lines): data = json.loads(line) yield transform_oss_path(data["data"]["source"]), "" dataset = OssMapDataset.from_manifest_file("{manifest_file_path}", manifest_parser, "", endpoint=endpoint, transform=read_and_trans, cred_path=cred_path, config_path=config_path) -
Akses file dari daftar URI OSS
Anda dapat mengakses file OSS dengan menentukan URI OSS-nya tanpa perlu mengonfigurasi file indeks. Contoh kodenya sebagai berikut:
uris =["oss://examplebucket.oss-cn-wulanchabu.aliyuncs.com/dataset_folder/class1/image1.JPEG", "oss://examplebucket.oss-cn-wulanchabu.aliyuncs.com/dataset_folder/class2/image2.JPEG"] dataset = OssMapDataset.from_objects(uris, endpoint=endpoint, transform=read_and_trans, cred_path=cred_path, config_path=config_path)
OssIterableDataset
OssIterableDataset mendukung tiga metode akses dataset yang sama dengan OssMapDataset. Contoh berikut menunjukkan cara menggunakan ketiga metode ini:
-
Akses folder berdasarkan awalan path OSS
dataset = OssIterableDataset.from_prefix("{oss_data_folder_uri}", endpoint="{oss_endpoint}", transform=read_and_transform, cred_path=cred_path, config_path=config_path) -
Akses file dari file manifes
dataset = OssIterableDataset.from_manifest_file("{manifest_file_path}", manifest_parser, "", endpoint=endpoint, transform=read_and_trans, cred_path=cred_path, config_path=config_path) -
Akses file dari daftar URI OSS
dataset = OssIterableDataset.from_objects(uris, endpoint=endpoint, transform=read_and_trans, cred_path=cred_path, config_path=config_path)
OssCheckpoint
Saat ini, fitur OssCheckpoint hanya tersedia di lingkungan sumber daya komputasi tujuan umum. Anda dapat menggunakan antarmuka OssCheckpoint untuk mengakses dan menyimpan file model di OSS. Contoh kodenya sebagai berikut:
checkpoint = OssCheckpoint(endpoint="{oss_endpoint}", cred_path=cred_path, config_path=config_path)
checkpoint_read_uri = "{checkpoint_path}"
checkpoint_write_uri = "{checkpoint_path}"
with checkpoint.reader(checkpoint_read_uri) as reader:
state_dict = torch.load(reader)
model.load_state_dict(state_dict)
with checkpoint.writer(checkpoint_write_uri) as writer:
torch.save(model.state_dict(), writer)
Contoh kode
Kode berikut memberikan contoh lengkap cara menggunakan OSS Connector for AI/ML untuk mengakses data OSS:
from osstorchconnector import OssMapDataset, OssCheckpoint
import torchvision.transforms as transforms
import accimage
import torchvision.models as models
import torch
# Path kredensial default setelah Anda mengonfigurasi peran RAM untuk pekerjaan DLC atau instans DSW.
cred_path = "/mnt/.alibabacloud/credentials"
config_path = "config.json"
checkpoint = OssCheckpoint(endpoint="{oss_endpoint}", cred_path=cred_path, config_path=config_path)
model = models.__dict__["resnet18"]()
epochs = 100 # Tentukan jumlah epoch.
checkpoint_read_uri = "{checkpoint_path}"
checkpoint_write_uri = "{checkpoint_path}"
with checkpoint.reader(checkpoint_read_uri) as reader:
state_dict = torch.load(reader)
model.load_state_dict(state_dict)
def read_and_transform(data):
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
normalize,
])
try:
img = accimage.Image((data.read()))
value = transform(img)
except Exception as e:
print("read failed", e)
return None, 0
return value, 0
dataset = OssMapDataset.from_prefix("{oss_data_folder_uri}", endpoint="{oss_endpoint}", transform=read_and_transform, cred_path=cred_path, config_path=config_path)
data_loader = torch.utils.data.DataLoader(
dataset, batch_size="{batch_size}",num_workers="{num_workers}", pin_memory=True)
for epoch in range(args.epochs):
for step, (images, target) in enumerate(data_loader):
# pemrosesan batch
# pelatihan model
# simpan model
with checkpoint.writer(checkpoint_write_uri) as writer:
torch.save(model.state_dict(), writer)
Poin-poin penting dalam contoh ini:
-
Buat dataset dengan
OssMapDatasetlangsung dari URI OSS yang diberikan, mengikuti pola standar PyTorchDataLoader. -
Gunakan dataset ini untuk membuat
DataLoaderPyTorch standar, dan jalankan loop pelatihan normal untuk memproses setiap batch, melatih model, dan menyimpan checkpoint. -
Hal ini memungkinkan pemuatan sesuai permintaan, yang menghilangkan kebutuhan untuk memasang dataset di lingkungan kontainer atau mengunduhnya ke penyimpanan lokal terlebih dahulu.
OSS SDK
OSS Python SDK
Gunakan OSS Python SDK untuk membaca dan menulis data ke OSS:
-
Instal OSS Python SDK. Untuk informasi lebih lanjut, lihat Instalasi (Python SDK V1).
-
Konfigurasikan kredensial akses untuk OSS Python SDK. Untuk informasi lebih lanjut, lihat Konfigurasikan kredensial akses (Python SDK V1).
-
Baca dan tulis data di OSS.
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # Konfigurasikan kredensial akses menggunakan kunci akses Pengguna RAM dari variabel lingkungan. auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) bucket = oss2.Bucket(auth, '<Endpoint>', '<your_bucket_name>') # Baca file lengkap. result = bucket.get_object('<your_file_path/your_file>') print(result.read()) # Baca data berdasarkan rentang. result = bucket.get_object('<your_file_path/your_file>', byte_range=(0, 99)) # Tulis data ke OSS. bucket.put_object('<your_file_path/your_file>', '<your_object_content>') # Tambahkan data ke file yang dapat ditambahkan. result = bucket.append_object('<your_file_path/your_file>', 0, '<your_object_content>') result = bucket.append_object('<your_file_path/your_file>', result.next_position, '<your_object_content>')Modifikasi parameter berikut sesuai kebutuhan:
Parameter
Deskripsi
<Endpoint>
Titik akhir untuk wilayah bucket Anda. Misalnya, untuk wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir, lihat Wilayah dan titik akhir.
<your_bucket_name>
Nama bucket Anda.
<your_file_path/your_file>
Path file yang akan dibaca atau ditulis. Tentukan path lengkap objek tetapi tidak termasuk nama bucket. Misalnya,
testfolder/exampleobject.txt.<your_object_content>
Konten yang akan ditulis atau ditambahkan. Ganti sesuai kebutuhan.
OSS Python API
Anda dapat menggunakan OSS Python API untuk menyimpan data pelatihan dan model di OSS dengan mudah. Sebelum memulai, pastikan Anda telah menginstal OSS Python SDK dan mengonfigurasi kredensial akses Anda. Untuk informasi lebih lanjut, lihat Instalasi (Python SDK V1) dan Konfigurasikan kredensial akses (Python SDK V1).
-
Muat data pelatihan
Anda dapat menyimpan data Anda di bucket OSS, dengan path data dan label yang sesuai dalam file indeks di bucket yang sama. Dengan membuat Dataset khusus, Anda dapat menggunakan API
DataLoaderdi PyTorch untuk membaca data secara paralel di beberapa proses. Contoh kodenya sebagai berikut.import io import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider import PIL import torch class OSSDataset(torch.utils.data.dataset.Dataset): def __init__(self, endpoint, bucket, auth, index_file): self._bucket = oss2.Bucket(auth, endpoint, bucket) self._indices = self._bucket.get_object(index_file).read().split(',') def __len__(self): return len(self._indices) def __getitem__(self, index): img_path, label = self._indices(index).strip().split(':') img_str = self._bucket.get_object(img_path) img_buf = io.BytesIO() img_buf.write(img_str.read()) img_buf.seek(0) img = Image.open(img_buf).convert('RGB') img_buf.close() return img, label # Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan contoh kode ini, # pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur. auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) dataset = OSSDataset(endpoint, bucket, auth, index_file) data_loader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, num_workers=num_loaders, pin_memory=True)Tabel ini menjelaskan parameter utamanya.
Parameter
Deskripsi
endpoint
Titik akhir untuk wilayah bucket Anda. Misalnya, untuk wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir, lihat Wilayah dan titik akhir.
bucket
Nama bucket Anda.
index_file
Path file indeks.
CatatanDalam contoh ini, file indeks menggunakan koma (,) untuk memisahkan setiap sampel, dan titik dua (:) untuk memisahkan path sampel dari label.
-
Simpan atau muat model
Gunakan OSS Python API untuk menyimpan atau memuat model PyTorch. Untuk informasi lebih lanjut tentang cara menyimpan dan memuat model di PyTorch, lihat PyTorch. Contoh kodenya sebagai berikut:
-
Simpan model
from io import BytesIO import torch import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # bucket_name bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO() torch.save(model.state_dict(), buffer) bucket.put_object("<your_model_path>", buffer.getvalue())Di mana:
-
endpoint adalah titik akhir untuk wilayah bucket Anda. Misalnya, untuk wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
-
<your_bucket_name> adalah nama bucket OSS, tanpa awalan oss://.
-
<your_model_path> adalah path model. Ganti sesuai kebutuhan.
-
-
Muat model
from io import BytesIO import torch import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO(bucket.get_object("<your_model_path>").read()) model.load_state_dict(torch.load(buffer))Di mana:
-
endpoint adalah titik akhir untuk wilayah bucket Anda. Misalnya, untuk wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
-
<your_bucket_name> adalah nama bucket OSS, tanpa awalan oss://.
-
<your_model_path> adalah path model. Ganti sesuai kebutuhan.
-
-