Layanan Penyimpanan Objek (OSS) mendukung berbagai klien dengan tingkat dukungan operasi penulisan yang berbeda-beda. Dukungan penuh untuk penulisan dapat memengaruhi kinerja pembacaan. Oleh karena itu, pemisahan baca/tulis dapat meminimalkan dampak operasi penulisan terhadap kinerja pembacaan serta meningkatkan akses data secara signifikan dalam skenario intensif membaca. Topik ini menjelaskan cara mengimplementasikan pemisahan baca/tulis menggunakan klien volume OSS yang berbeda atau alat seperti OSS SDK dan ossutil dalam skenario intensif membaca.
Prasyarat
Bucket OSS telah dibuat. Bucket tersebut dimiliki oleh Akun Alibaba Cloud yang sama dengan kluster Anda.
Sebuah Bucket OSS telah dibuat. Bucket tersebut milik Akun Alibaba Cloud yang sama dengan kluster Anda.
PentingKami menyarankan agar Anda tidak menggunakan Bucket OSS lintas akun.
Skenario
OSS umumnya digunakan dalam skenario hanya-baca dan baca/tulis. Untuk skenario intensif membaca, kami sarankan Anda memisahkan operasi baca dan tulis pada data OSS:
Baca: Pilih klien volume OSS yang berbeda atau modifikasi parameter konfigurasi untuk mengoptimalkan kecepatan pembacaan data.
Tulis: Gunakan ossfs 1.0 untuk mengimplementasikan kemampuan penulisan penuh atau gunakan alat seperti OSS SDK untuk menulis data.
Skenario hanya-baca
Dalam skenario inferensi big data, analisis, dan kueri, kami sarankan Anda mengatur mode akses volume OSS ke ReadOnlyMany untuk memastikan bahwa data tidak dihapus atau dimodifikasi secara tidak sengaja.
Volume OSS saat ini mendukung tiga jenis klien: ossfs 1.0, ossfs 2.0, dan strmvol. Semuanya mendukung operasi hanya-baca.
Kami sarankan Anda memperbarui plug-in CSI ke versi 1.33.1 atau lebih baru dan menggunakan ossfs 2.0 sebagai pengganti ossfs 1.0 untuk mengoptimalkan kinerja dalam skenario hanya-baca. Untuk informasi tentang cara menggunakan volume ossfs 2.0, lihat Gunakan Volume ossfs 2.0.
Jika bisnis Anda melibatkan pembacaan file kecil dalam jumlah besar, seperti pembacaan dataset, backtesting kuantisasi, dan analisis log deret waktu, Anda dapat menggunakan volume strmvol. Untuk informasi tentang cara menggunakan volume strmvol, lihat Gunakan Volume strmvol.
Untuk informasi lebih lanjut tentang skenario klien dan rekomendasi pemilihan, lihat Referensi Pemilihan Klien.
Jika bisnis Anda memerlukan penggunaan klien ossfs 1.0 dalam skenario hanya-baca, Anda dapat merujuk pada konfigurasi parameter berikut untuk meningkatkan kinerja pembacaan data.
Parameter
Deskripsi
kernel_cache
Menggunakan cache kernel untuk mempercepat operasi pembacaan. Fitur ini cocok untuk skenario di mana Anda tidak perlu mengakses data terbaru secara real-time.
Ketika ossfs perlu membaca file berkali-kali dan kueri mengenai cache, memori idle dalam cache kernel digunakan untuk menyimpan file untuk mempercepat pengambilan data.
parallel_count
Menentukan jumlah maksimum bagian yang dapat diunduh atau diunggah secara bersamaan selama pengunduhan atau pengunggahan multipart. Nilai default: 20.
max_multireq
Menentukan jumlah maksimum kueri yang dapat mengambil metadata file secara bersamaan. Nilai parameter ini harus lebih besar dari atau sama dengan nilai parameter parallel_count. Nilai default: 20.
max_stat_cache_size
Menentukan jumlah maksimum file yang metadata-nya dapat disimpan dalam cache metadata. Nilai default: 1000. Untuk menonaktifkan cache metadata, atur parameter ini ke 0.
Dalam skenario di mana Anda tidak perlu mengakses data terbaru secara real-time, ketika direktori saat ini berisi sejumlah besar file, Anda dapat meningkatkan jumlah cache untuk mempercepat operasi LIST.
direct_read
ossfs versi 1.91 dan yang lebih baru menambahkan mode baca langsung untuk skenario hanya-baca.
Untuk informasi lebih lanjut tentang fitur dan pengujian kinerja mode baca langsung, lihat Fitur baru ossfs 1.0 dan benchmarking kinerja ossfs.
Untuk informasi tentang cara mengoptimalkan mode baca langsung, lihat Optimasi kinerja dalam skenario hanya-baca.
Skenario baca/tulis
Dalam skenario baca/tulis, Anda harus mengatur mode akses volume OSS ke ReadWriteMany.
Saat ini, ossfs 1.0 mendukung operasi penulisan penuh, sedangkan ossfs 2.0 hanya mendukung penulisan tambahan berurutan. Saat Anda melakukan operasi penulisan melalui ossfs, perhatikan hal-hal berikut:
ossfs tidak menjamin konsistensi data yang ditulis oleh operasi penulisan bersamaan.
Ketika volume OSS dipasang ke pod, jika Anda masuk ke pod atau host pod dan menghapus atau memodifikasi file di jalur yang dipasang, file sumber di Bucket OSS juga akan dihapus atau dimodifikasi. Untuk menghindari penghapusan data penting secara tidak sengaja, Anda dapat mengaktifkan kontrol versi untuk Bucket OSS. Untuk informasi lebih lanjut, lihat Versioning.
Dalam skenario intensif membaca, terutama ketika jalur baca dan tulis dipisahkan, seperti dalam proses pelatihan bisnis big data, kami sarankan Anda memisahkan operasi baca dan tulis pada data OSS. Atur mode akses volume OSS ke
ReadOnlyMany, optimalkan kecepatan pembacaan data dengan mengonfigurasi parameter cache, dan tulis data melalui alat seperti SDK. Untuk informasi lebih lanjut, lihat Contoh.
Contoh
Dalam contoh ini, aplikasi pelatihan pengenalan gambar coretan tangan digunakan untuk menggambarkan cara mengonfigurasi pemisahan baca/tulis OSS. Contoh ini adalah model pembelajaran mendalam sederhana. Aplikasi membaca set data pelatihan dari direktori /data-dir Bucket OSS melalui volume OSS hanya-baca dan menulis checkpoint ke direktori /log-dir Bucket OSS melalui volume OSS baca/tulis atau OSS SDK.
Sebelum Anda mulai, unduh set data pelatihan gambar tulisan tangan MNIST dan unggah ke direktori /tf-train/train/data/ di Bucket OSS Anda. Ini memungkinkan aplikasi Anda mengakses set data.
Set Data Pelatihan Gambar Tulisan Tangan MNIST
File Sampel yang Diunggah di Bucket OSS

Implementasikan operasi baca/tulis menggunakan ossfs
Karena penulisan checkpoint adalah operasi penulisan tambahan berurutan, Anda dapat memilih ossfs 1.0 atau ossfs 2.0 untuk mengimplementasikan operasi baca/tulis.
Terapkan aplikasi pelatihan pengenalan gambar coretan tangan berdasarkan templat berikut.
Aplikasi ditulis dalam Python dan volume OSS yang diberikan secara statis dipasang ke aplikasi. Untuk informasi tentang cara mengonfigurasi volume OSS, lihat Pasang Volume ossfs 1.0 yang Diberikan Secara Statis atau Gunakan Volume ossfs 2.0.
Dalam contoh berikut, subdirektori
/tf-trainBucket OSS dipasang ke direktori/mntpod.Buat volume ossfs 1.0 berdasarkan konten berikut:
cat << EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: oss-secret namespace: default stringData: akId: "<your-accesskey-id>" akSecret: "<your-accesskey-secret>" --- apiVersion: v1 kind: PersistentVolume metadata: name: tf-train-pv labels: alicloud-pvname: tf-train-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: tf-train-pv nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: "<your-bucket-name>" url: "oss-<region>.aliyuncs.com" otherOpts: "-o max_stat_cache_size=0 -o allow_other" path: "/tf-train" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: tf-train-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi selector: matchLabels: alicloud-pvname: tf-train-pv EOFBuat wadah pelatihan berdasarkan konten berikut.
Selama proses pelatihan, aplikasi menulis file antara ke direktori
/mnt/training_logsdi dalam pod. Direktori ini dikelola oleh ossfs, yang secara otomatis mengunggah file baru ke direktori/tf-train/training_logs/di Bucket OSS Anda.cat << EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: labels: app: tfjob name: tf-mnist namespace: default spec: containers: - command: - sh - -c - python /app/main.py env: - name: NVIDIA_VISIBLE_DEVICES value: void - name: gpus value: "0" - name: workers value: "1" - name: TEST_TMPDIR value: "/mnt" image: registry.cn-beijing.aliyuncs.com/tool-sys/tf-train-demo:rw imagePullPolicy: Always name: tensorflow ports: - containerPort: 20000 name: tfjob-port protocol: TCP volumeMounts: - name: train mountPath: "/mnt" workingDir: /root priority: 0 restartPolicy: Never securityContext: {} terminationGracePeriodSeconds: 30 volumes: - name: train persistentVolumeClaim: claimName: tf-train-pvc EOF
Verifikasi bahwa data dapat dibaca dan ditulis sesuai harapan.
Periksa status pod.
kubectl get pod tf-mnistTunggu beberapa menit hingga status pod berubah dari Running menjadi Completed. Output yang diharapkan:
NAME READY STATUS RESTARTS AGE tf-mnist 0/1 Completed 0 2m12sPeriksa log operasional pod.
Periksa waktu pemuatan data dalam log operasional pod. Waktu pemuatan mencakup jumlah waktu yang diperlukan untuk mengunduh file dari OSS dan memuat file ke TensorFlow.
kubectl logs tf-mnist | grep dataloadSistem menampilkan informasi serupa dengan output berikut. Waktu kueri aktual tergantung pada performa instans dan status jaringan.
dataload cost time: 1.54191803932Masuk ke Konsol OSS. Anda dapat menemukan bahwa file terkait diunggah ke direktori
/tf-train/training_logsBucket OSS. Ini menunjukkan bahwa data dapat dibaca dan ditulis dari OSS sesuai harapan.
Optimalkan kecepatan pembacaan data ossfs melalui pemisahan baca/tulis
Konfigurasikan ulang aplikasi untuk mengimplementasikan pemisahan baca/tulis.
Baca: Gunakan volume ossfs 1.0 hanya-baca yang dioptimalkan untuk operasi pembacaan.
Tulis: Gunakan volume ossfs 1.0 baca/tulis atau OSS SDK untuk operasi penulisan.
Gunakan volume ossfs 1.0 baca/tulis untuk operasi penulisan
Aplikasi pelatihan pengenalan gambar coretan tangan dan volume ossfs 1.0 hanya-baca + baca/tulis digunakan sebagai contoh untuk menggambarkan cara mengonfigurasi ulang aplikasi untuk mendukung pemisahan baca/tulis.
Buat volume ossfs 1.0 hanya-baca berdasarkan konten berikut.
Optimalkan parameter konfigurasi volume ossfs 1.0 untuk skenario hanya-baca.
Ubah
accessModesbaik PV maupun PVC menjadiReadOnlyMany. Jalur pemasangan bucket dapat dikurangi menjadi/tf-train/train/data.Dalam bidang
otherOpts, tambahkan opsi-o kernel_cache -o max_stat_cache_size=10000 -o umask=022:Opsi
kernel_cachemempercepat pembacaan data ossfs dengan menggunakan buffer memori sistem.Opsi
max_stat_cache_sizemeningkatkan cache metadata (nilai 10.000 mengonsumsi sekitar 40 MB memori; sesuaikan sesuai ukuran instans Anda).Opsi
umask=022memberikan izin baca ke proses non-root dalam kontainer.
Untuk informasi lebih lanjut, lihat Skenario.
cat << EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: oss-secret namespace: default stringData: akId: "<your-accesskey-id>" akSecret: "<your-accesskey-secret>" --- apiVersion: v1 kind: PersistentVolume metadata: name: tf-train-pv labels: alicloud-pvname: tf-train-pv spec: capacity: storage: 10Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: tf-train-pv nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: "<your-bucket-name>" url: "oss-<region>.aliyuncs.com" otherOpts: "-o kernel_cache -o max_stat_cache_size=10000 -o umask=022 -o allow_other" path: "/tf-train/train/data" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: tf-train-pvc spec: accessModes: - ReadOnlyMany resources: requests: storage: 10Gi selector: matchLabels: alicloud-pvname: tf-train-pv EOFBuat volume ossfs 1.0 baca/tulis berdasarkan konten berikut:
cat << EOF | kubectl apply -f - apiVersion: v1 kind: PersistentVolume metadata: name: tf-logging-pv labels: alicloud-pvname: tf-logging-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: tf-logging-pv nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: "<your-bucket-name>" url: "oss-<region>.aliyuncs.com" otherOpts: "-o max_stat_cache_size=0 -o allow_other" path: "/tf-train/training_logs" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: tf-logging-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi selector: matchLabels: alicloud-pvname: tf-logging-pv EOFBuat wadah pelatihan berdasarkan konten berikut:
CatatanLogika bisnis pelatihan tidak memerlukan modifikasi apa pun. Anda hanya perlu memasang volume hanya-baca dan baca/tulis saat menerapkan.
cat << EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: labels: app: tfjob name: tf-mnist namespace: default spec: containers: - command: - sh - -c - python /app/main.py env: - name: NVIDIA_VISIBLE_DEVICES value: void - name: gpus value: "0" - name: workers value: "1" - name: TEST_TMPDIR value: "/mnt" image: registry.cn-beijing.aliyuncs.com/tool-sys/tf-train-demo:rw imagePullPolicy: Always name: tensorflow ports: - containerPort: 20000 name: tfjob-port protocol: TCP volumeMounts: - name: train mountPath: "/mnt/train/data" - name: logging mountPath: "/mnt/training_logs" workingDir: /root priority: 0 restartPolicy: Never securityContext: {} terminationGracePeriodSeconds: 30 volumes: - name: train persistentVolumeClaim: claimName: tf-train-pvc - name: logging persistentVolumeClaim: claimName: tf-logging-pvc EOF
Gunakan OSS SDK untuk operasi penulisan
Dalam contoh ini, aplikasi pelatihan pengenalan gambar coretan tangan dan OSS SDK digunakan untuk menggambarkan cara mengonfigurasi ulang aplikasi untuk mendukung pemisahan baca/tulis.
Instal OSS SDK dalam lingkungan Container Service for Kubernetes (ACK). Tambahkan konten berikut saat Anda membuat gambar. Untuk informasi lebih lanjut, lihat Instalasi.
RUN pip install oss2Modifikasi kode sumber berdasarkan Demo Python SDK.
Blok kode berikut menunjukkan kode sumber terkait gambar dasar saat aplikasi pelatihan pengenalan gambar coretan tangan yang disebutkan sebelumnya digunakan:
def train(): ... saver = tf.train.Saver(max_to_keep=0) for i in range(FLAGS.max_steps): if i % 10 == 0: # Record summaries and test-set accuracy summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False)) print('Accuracy at step %s: %s' % (i, acc)) if i % 100 == 0: print('Save checkpoint at step %s: %s' % (i, acc)) saver.save(sess, FLAGS.log_dir + '/model.ckpt', global_step=i)Dalam kode sebelumnya, setiap 100 iterasi, file antara (checkpoint) disimpan di direktori log_dir yang ditentukan, yaitu direktori
/mnt/training_logspod. Karena parametermax_to_keepSaver adalah 0, semua file antara dipertahankan. Setelah 1.000 iterasi, 10 set checkpoint disimpan di OSS.Modifikasi kode berdasarkan persyaratan berikut untuk menggunakan OSS SDK mengunggah checkpoint.
Konfigurasikan kredensial untuk membaca pasangan AccessKey dan informasi bucket dari variabel lingkungan. Untuk informasi lebih lanjut, lihat Konfigurasikan Kredensial Akses (Python SDK V1).
Untuk mengurangi penggunaan memori kontainer, Anda dapat mengatur
max_to_keepke 1, yang berarti hanya set terbaru dari file antara pelatihan yang selalu disimpan. Setiap kali file antara disimpan, mereka diunggah ke direktori bucket yang sesuai menggunakan fungsiput_object_from_file.
CatatanSaat Anda menggunakan OSS SDK dalam skenario pemisahan baca/tulis, Anda dapat menggunakan pembacaan dan penulisan asinkron untuk mempercepat pelatihan.
import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) url = os.getenv('URL','<default-url>') bucketname = os.getenv('BUCKET','<default-bucket-name>') bucket = oss2.Bucket(auth, url, bucketname) ... def train(): ... saver = tf.train.Saver(max_to_keep=1) for i in range(FLAGS.max_steps): if i % 10 == 0: # Record summaries and test-set accuracy summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False)) print('Accuracy at step %s: %s' % (i, acc)) if i % 100 == 0: print('Save checkpoint at step %s: %s' % (i, acc)) saver.save(sess, FLAGS.log_dir + '/model.ckpt', global_step=i) # FLAGS.log_dir = os.path.join(os.getenv('TEST_TMPDIR', '/mnt'),'training_logs') for path,_,file_list in os.walk(FLAGS.log_dir) : for file_name in file_list: bucket.put_object_from_file(os.path.join('tf-train/training_logs', file_name), os.path.join(path, file_name))Gambar kontainer yang dimodifikasi adalah
registry.cn-beijing.aliyuncs.com/tool-sys/tf-train-demo:ro.Modifikasi templat aplikasi untuk mengharuskan aplikasi mengakses OSS dalam mode hanya-baca.
Ubah
accessModesbaik PV maupun PVC menjadiReadOnlyMany. Jalur pemasangan bucket dapat dikurangi menjadi/tf-train/train/data.Dalam bidang
otherOpts, tambahkan opsi-o kernel_cache -o max_stat_cache_size=10000 -o umask=022:Opsi
kernel_cachemempercepat pembacaan data ossfs dengan menggunakan buffer memori sistem.Opsi
max_stat_cache_sizemeningkatkan cache metadata (nilai 10.000 mengonsumsi sekitar 40 MB memori; sesuaikan berdasarkan ukuran instans Anda).Opsi
umask=022memberikan izin baca kepada proses non-root dalam kontainer.
Untuk informasi lebih lanjut, lihat Skenario.
Tambahkan variabel lingkungan
OSS_ACCESS_KEY_IDdanOSS_ACCESS_KEY_SECRETke templat pod. Anda dapat memperoleh nilai variabel lingkungan dari oss-secret. Pastikan informasinya sama dengan volume OSS.
Verifikasi bahwa data dapat dibaca dan ditulis sesuai harapan.
Periksa status pod.
kubectl get pod tf-mnistTunggu beberapa menit hingga status pod berubah dari
RunningmenjadiCompleted. Output yang diharapkan:NAME READY STATUS RESTARTS AGE tf-mnist 0/1 Completed 0 2m25sPeriksa log operasional pod.
Periksa waktu pemuatan data dalam log operasional pod. Waktu pemuatan mencakup jumlah waktu yang diperlukan untuk mengunduh file dari OSS dan memuat file ke TensorFlow.
kubectl logs tf-mnist | grep dataloadOutput yang diharapkan:
dataload cost time: 0.843528985977Output tersebut menunjukkan bahwa cache digunakan untuk mempercepat operasi pembacaan dalam mode hanya-baca. Metode ini ideal untuk pelatihan skala besar atau skenario pemuatan data terus-menerus.
Masuk ke Konsol OSS. Anda dapat menemukan bahwa file terkait ditampilkan di direktori
/tf-train/training_logsBucket OSS. Ini menunjukkan bahwa data dapat dibaca dan ditulis dari OSS sesuai harapan.
Referensi
Referensi OSS SDK
Berikut adalah beberapa kode referensi untuk SDK resmi Alibaba Cloud OSS:
Untuk informasi lebih lanjut tentang bahasa yang didukung, seperti PHP, Node.js, Browser.js, .NET, Android, iOS, dan Ruby, lihat Referensi SDK.
Alat lain untuk mengimplementasikan pemisahan baca/tulis OSS
Alat | Referensi |
OpenAPI | |
ossutil | |
ossbrowser |