Pertanyaan umum dan solusi untuk TensorFlow di PAI, mencakup akses data, ekspor model, dan troubleshooting.
Daftar Isi
Bagaimana cara mereferensikan beberapa file Python?
Untuk mereferensikan fungsi lintas file, kemas semua file Python (misalnya, `test1.py` dan `test2.py`) ke dalam file .tar.gz, lalu unggah.
Keterangan:
-
Python Code File: Paket .tar.gz.
-
Main Python File: File entri utama.
Bagaimana cara mengunggah data ke OSS?
Data deep learning disimpan di bucket OSS. Buat bucket di wilayah yang sama dengan kluster GPU Anda agar dapat menggunakan jaringan klasik dan menghindari biaya trafik. Anda kemudian dapat membuat folder, mengatur data, atau mengunggah file melalui Konsol OSS.
Unggah data ke OSS menggunakan API atau SDK (Simple upload). OSS juga menyediakan alat seperti ossutil dan osscmd untuk mengunggah dan mengunduh file (Developer Tools for OSS).
Alat unggah memerlukan ID AccessKey dan Rahasia AccessKey, yang dapat Anda buat atau lihat di Konsol Alibaba Cloud.
Bagaimana cara membaca data dari OSS?
Python tidak mendukung path OSS secara native. Operasi file standar seperti Open(), os.path.exist(), Scipy.misc.imread(), dan numpy.load() tidak dapat dijalankan langsung pada OSS.
Gunakan salah satu metode berikut untuk membaca data di PAI:
-
Gunakan fungsi `tf.gfile` untuk operasi baca sederhana seperti membaca satu gambar atau file teks.
tf.gfile.Copy(oldpath, newpath, overwrite=False) # Menyalin file. tf.gfile.DeleteRecursively(dirname) # Menghapus semua file dalam direktori secara rekursif. tf.gfile.Exists(filename) # Memeriksa apakah file ada. tf.gfile.FastGFile(name, mode='r') # Membaca file tanpa blocking. tf.gfile.GFile(name, mode='r') # Membaca file. tf.gfile.Glob(filename) # Menampilkan semua file dalam folder. Mendukung pola. tf.gfile.IsDirectory(dirname) # Mengembalikan apakah dirname adalah direktori. tf.gfile.ListDirectory(dirname) # Menampilkan semua file di bawah dirname. tf.gfile.MakeDirs(dirname) # Membuat folder di bawah dirname. Jika direktori induk tidak ada, akan dibuat otomatis. Jika folder sudah ada dan dapat ditulis, operasi berhasil. tf.gfile.MkDir(dirname) # Membuat folder di dirname. tf.gfile.Remove(filename) # Menghapus filename. tf.gfile.Rename(oldname, newname, overwrite=False) # Mengganti nama file. tf.gfile.Stat(dirname) # Mengembalikan statistik untuk direktori. tf.gfile.Walk(top, inOrder=True) # Mengembalikan pohon file dari direktori. -
Gunakan
tf.gfile.Glob,tf.gfile.FastGFile,tf.WholeFileReader(), dantf.train.shuffle_batch()untuk pembacaan batch. Pertama-tama peroleh daftar file, lalu buat batch.
Di Designer, pass parameter seperti direktori baca dan file kode menggunakan `tf.flags` dalam format `-XXX`, di mana `XXX` adalah string.
import tensorflow as tf
FLAGS = tf.flags.FLAGS
tf.flags.DEFINE_string('buckets', 'oss://{OSS Bucket}/', 'Folder tempat gambar pelatihan disimpan')
tf.flags.DEFINE_string('batch_size', '15', 'Ukuran batch')
files = tf.gfile.Glob(os.path.join(FLAGS.buckets,'*.jpg')) # Menampilkan path semua file JPG di bucket.
Pilih metode pembacaan batch berdasarkan ukuran file:
-
Untuk membaca file kecil, gunakan
tf.gfile.FastGFile().for path in files: file_content = tf.gfile.FastGFile(path, 'rb').read() # Pastikan menggunakan 'rb' untuk membaca file. Jika tidak, error dapat terjadi dalam banyak kasus. image = tf.image.decode_jpeg(file_content, channels=3) # Contoh ini menggunakan gambar JPG. -
Untuk membaca file besar, gunakan
tf.WholeFileReader().reader = tf.WholeFileReader() # Menginisialisasi reader. fileQueue = tf.train.string_input_producer(files) # Membuat antrian untuk reader. file_name, file_content = reader.read(fileQueue) # Membaca file dari antrian. image_content = tf.image.decode_jpeg(file_content, channels=3) # Mendekode hasil baca menjadi gambar. label = XXX # Proses penanganan label dihilangkan. batch = tf.train.shuffle_batch([label, image_content], batch_size=FLAGS.batch_size, num_threads=4, capacity=1000 + 3 * FLAGS.batch_size, min_after_dequeue=1000) sess = tf.Session() # Membuat sesi. tf.train.start_queue_runners(sess=sess) # Memulai antrian. Jika perintah ini tidak dijalankan, thread akan hang. labels, images = sess.run(batch) # Mendapatkan hasil.Kode penting:
-
tf.train.string_input_producer: Mengubah daftar nama file menjadi antrian. Anda harus memanggiltf.train.start_queue_runnersuntuk memulai thread pemrosesan antrian. -
Parameter
tf.train.shuffle_batch:-
batch_size: Jumlah entri data yang dikembalikan per operasi batch.
-
num_threads: Jumlah thread yang digunakan untuk mengantri data. Nilai tipikal adalah 4.
-
capacity: Ukuran maksimum antrian, yang menentukan rentang pengacakan acak. Misalnya, untuk mengacak dari buffer 5.000 dalam dataset 10.000 entri, atur `capacity` menjadi 5000.
-
min_after_dequeue: Jumlah minimum elemen yang dipertahankan setelah dequeue, memastikan tingkat pencampuran minimum. Tidak boleh melebihi capacity.
-
-
Bagaimana cara menulis data ke OSS?
Tulis data ke OSS menggunakan salah satu metode berikut. Dalam contoh ini, output disimpan di /model/example.txt:
-
Tulis data menggunakan
tf.gfile.FastGFile():tf.gfile.FastGFile(FLAGS.checkpointDir + 'example.txt', 'wb').write('hello world') -
Salin file lokal ke OSS menggunakan
tf.gfile.Copy():tf.gfile.Copy('./example.txt', FLAGS.checkpointDir + 'example.txt')
Mengapa terjadi error OOM selama waktu proses?
OOM terjadi ketika penggunaan memori melebihi 30 GB. Gunakan `gfile` untuk streaming data dari OSS alih-alih memuat seluruh dataset ke dalam memori. Lihat Bagaimana cara membaca data dari OSS?.
Apa saja contoh kasus penggunaan TensorFlow?
Komposisi lagu: Kode contoh komposisi lagu.
Apa tujuan dari model_average_iter_interval ketika dua GPU dikonfigurasi?
Tanpa `model_average_iter_interval`, GPU menjalankan Parallel-SGD standar dan saling bertukar pembaruan gradien setiap iterasi. Ketika diatur ke nilai lebih dari 1, Model Average digunakan—parameter model dirata-ratakan di kedua GPU setiap `model_average_iter_interval` iterasi.
Bagaimana cara mengekspor model TensorFlow sebagai SavedModel?
Format SavedModel
Untuk menggunakan processor pre-built resmi di EAS guna men-deploy model TensorFlow sebagai layanan online, ekspor ke format SavedModel, yaitu format resmi yang direkomendasikan oleh TensorFlow. Struktur direktorinya sebagai berikut.
assets/
variables/
variables.data-00000-of-00001
variables.index
saved_model.pb|saved_model.pbtxt
Keterangan:
-
assets: Folder opsional yang menyimpan file tambahan yang diperlukan untuk prediksi, seperti file kosakata. -
variables: Menyimpan informasi variabel yang disimpan oleh `tf.train.Saver`. -
saved_model.pbatausaved_model.pbtxt: Menyimpan `MetaGraphDef`, yang berisi struktur graf dari model terlatih, dan `SignatureDef`, yang menentukan input dan output untuk prediksi.
Ekspor SavedModel
Panduan TensorFlow Saving and Restoring membahas ekspor SavedModel secara detail. Untuk model sederhana, gunakan metode cepat berikut.
tf.saved_model.simple_save(
session,
"./savedmodel/",
inputs={"image": x}, ## x adalah variabel input model.
outputs={"scores": y} ## y adalah output model.
)
Saat melakukan permintaan prediksi online, tentukan `signature_name` model. Untuk model yang diekspor dengan simple_save(), `signature_name` default-nya adalah serving_default.
Untuk model kompleks, ekspor ke SavedModel secara manual:
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)
prediction_signature = (
tf.saved_model.signature_def_utils.build_signature_def(
inputs={'images': tensor_info_x},
outputs={'scores': tensor_info_y},
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
)
legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
builder.add_meta_graph_and_variables(
sess, [tf.saved_model.tag_constants.SERVING],
signature_def_map={
'predict_images': prediction_signature,
},
legacy_init_op=legacy_init_op
)
builder.save()
print('Done exporting!')
Keterangan:
-
export_pathmenentukan path tempat model diekspor. -
prediction_signature: `SignatureDef` untuk input dan output model (SignatureDef). Pada contoh ini, `signature_name`-nya adalah `predict_images`. -
builder.add_meta_graph_and_variables: Menentukan parameter ekspor.
-
Saat mengekspor model untuk prediksi, atur tag ke `tf.saved_model.tag_constants.SERVING`.
Konversi model Keras ke SavedModel
model.save() Keras mengekspor dalam format H5. Konversi ke SavedModel untuk prediksi online dengan memuat model H5 menggunakan load_model(), lalu mengekspor ulang:
import tensorflow as tf
with tf.device("/cpu:0"):
model = tf.keras.models.load_model('./mnist.h5')
tf.saved_model.simple_save(
tf.keras.backend.get_session(),
"./h5_savedmodel/",
inputs={"image": model.input},
outputs={"scores": model.output}
)
Konversi checkpoint ke SavedModel
Model checkpoint yang disimpan dengan tf.train.Saver() harus dikonversi ke SavedModel untuk prediksi online. Muat checkpoint dengan saver.restore(), lalu ekspor ulang:
import tensorflow as tf
# definisi variabel ...
saver = tf.train.Saver()
with tf.Session() as sess:
# Inisialisasi v1 karena saver tidak akan melakukannya.
saver.restore(sess, "./lr_model/model.ckpt")
tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)
tf.saved_model.simple_save(
sess,
"./savedmodel/",
inputs={"image": tensor_info_x},
outputs={"scores": tensor_info_y}
)