Memecahkan masalah TensorFlow - TPU
Panduan ini, bersama dengan FAQ, memberikan bantuan pemecahan masalah bagi pengguna yang melatih model TensorFlow di Cloud TPU. Jika Anda memecahkan masalah pelatihan PyTorch atau JAX, Anda dapat melihat dokumen pemecahan masalah untuk framework tersebut:
Untuk panduan umum lainnya tentang cara menggunakan Cloud TPU, lihat:
Ringkasan
Masalah umum yang dialami dengan Cloud TPU termasuk dalam kategori berikut:
Masalah saat menghubungkan ke server TPU
Bagian ini menjelaskan cara memecahkan masalah situasi saat TensorFlow berhenti merespons atau mencetak error saat terhubung ke TPU. Langkah kompilasi grafik TPU dapat memerlukan waktu lama untuk model besar, jadi biarkan skrip dieksekusi setidaknya selama 5 menit sebelum menyimpulkan bahwa skrip telah berhenti merespons.
Langkah pertama adalah memverifikasi apakah masalahnya ada pada server itu sendiri, atau pada pipeline pelatihan TensorFlow Anda. Untuk melakukannya, jalankan tutorial MNIST menggunakan URL server TPU Anda dan pastikan tutorial tersebut berfungsi dengan benar. Jika masih ada masalah koneksi dengan tutorial MNIST, ini mengonfirmasi bahwa masalahnya terletak pada server TPU. Dalam kasus ini:
Jalankan perintah berikut untuk menampilkan TPU yang tersedia. Mengganti zone dan project-id dengan zona dan project ID Anda.
(vm)$ gcloud compute tpus tpu-vm list --zone zone --project project-id
Tindakan ini akan mencetak output seperti:
NAME ZONE ACCELERATOR_TYPE NETWORK_ENDPOINT NETWORK RANGE STATUS demo-tpu us-central1-b v2-8 10.240.1.2:8470 default 10.240.1.0 READY
Pastikan Anda meneruskan nilai yang benar ke
--tpu
(demo-tpu
dalam contoh sebelumnya), dan bahwa TPU ini tercantum sebagaiREADY
.Jika TPU Anda tidak tercantum sebagai
READY
atau Anda masih mengalami masalah saat terhubung, mulai ulang server secara manual dengan:(vm)$ gcloud compute tpus tpu-vm stop $TPU_SERVER_NAME && gcloud compute tpus tpu-vm start $TPU_SERVER_NAME
Dalam contoh sebelumnya,
$TPU_SERVER_NAME
adalahdemo-tpu
. Mungkin perlu waktu beberapa menit untuk menyelesaikan prosesnya.Jalankan kembali perintah
... tpus list
dan tunggu hingga TPU berada dalam statusREADY
. Proses ini mungkin perlu waktu beberapa menit.Coba jalankan tutorial MNIST lagi.
Jika Anda masih mengalami masalah saat menjalankan tutorial MNIST, minta bantuan menggunakan salah satu mekanisme yang dijelaskan dalam Mendapatkan Dukungan.
Jika contoh MNIST berjalan dengan benar, tetapi model Anda masih berhenti merespons,
masalahnya mungkin ada pada pipeline pelatihan Anda.
Untuk men-debug ini, mulailah dengan mengganti TPUStrategy dalam kode Anda dengan strategi default. Saat Anda menggunakan strategi default, di mana pun Anda menggunakan
strategy.scope()
atau strategy.run()
, model akan berjalan
di CPU (atau GPU jika ada), bukan
di TPU. Jika model berjalan di CPU, bukan TPU, pasti ada
masalah khusus TPU. Jika masih tidak berjalan, praktik terbaiknya adalah men-debug
masalah di CPU.
Koneksi ssh
terputus selama pelatihan
Koneksi ssh
Anda ke Cloud TPU mungkin habis waktunya selama
pelatihan yang berjalan lama (terutama jika Anda menggunakan Cloud Shell).
Pada saat itu, tidak ada output ke konsol TPU dan mungkin
terlihat seolah-olah TPU telah berhenti melakukan pelatihan. Untuk menghindari hal ini, jalankan
sesi pelatihan dengan multiplexer terminal atau alat pengelolaan sesi seperti
tmux
atau screen
. Tindakan ini akan membuat koneksi ssh
tetap aktif, berapa pun durasi pelatihannya.
Men-debug error umum
Bagian ini menjelaskan cara memecahkan masalah error umum yang mungkin Anda alami saat melatih model di Cloud TPU.
Tidak dapat membuat TPU
Saat membuat Cloud TPU, Anda mungkin melihat error berikut:
googleapiclient.errors.HttpError: < HttpError 403 when requesting https://content-tpu.googleapis.com/v1/projects/{PROJECT}/locations/{ZONE}/nodes/{TPU_NAME}?alt=json returned "Request had insufficient authentication scopes."
Ini adalah masalah izin dan dapat diatasi dengan menjalankan perintah berikut:
gcloud auth login --update-adc
Perintah ini akan memperbarui Kredensial Default Aplikasi (ADC) dan akan menyelesaikan masalah. Untuk mengetahui informasi selengkapnya, lihat gcloud auth login.
Bentuk dinamis tidak didukung
Pesan Error
ValueError: shape [Shape] must have a fixed size for dimension d that is known at graph construction time.
Framework dan Konfigurasi yang Terpengaruh
Pesan ini hanya terjadi selama kompilasi XLA dengan TensorFlow.
Detail
Untuk menjalankan model di TPU, Cloud TPU mengompilasi model menggunakan compiler XLA. Meskipun langkah kompilasi ini secara signifikan meningkatkan kecepatan pelatihan dan penggunaan memori, bentuk (ukuran dimensi) semua tensor dalam grafik harus diketahui pada waktu kompilasi grafik. Jika bentuk apa pun tidak dapat ditentukan pada waktu kompilasi, kompilasi TPU akan gagal dengan error seperti yang ditampilkan sebelumnya.
Salah satu operasi umum yang menampilkan bentuk dinamis adalah dataset.batch(batch_size)
,
karena jumlah sampel yang tersisa dalam streaming mungkin kurang dari
ukuran batch. Oleh karena itu, saat melakukan pelatihan di TPU, tetapkan
drop remainder=True
untuk dataset.batch
.
Tindakan ini berpotensi menghapus beberapa sampel terakhir dari file untuk memastikan bahwa setiap batch memiliki bentuk batch_size yang statis. Contoh:
dataset = tf.data.Dataset.range(8)
dataset = dataset.batch(3, drop_remainder=True)
Operasi TensorFlow tidak tersedia
Pesan Error
NotFoundError: No registered 'OpName' OpKernel for XLA_TPU_JIT devices compatible with node
Framework dan Konfigurasi yang Terpengaruh
Pesan ini dapat muncul saat melakukan pelatihan dengan TensorFlow.
Detail
Model menggunakan operasi TensorFlow yang tidak tersedia di TPU.
Untuk daftar operasi yang tersedia di TPU, beserta rencana dukungan di masa mendatang dan saran untuk solusi, lihat panduan untuk Ops TensorFlow yang tersedia.
Pesan error kehabisan memori
Pesan Error
ResourceExhaustedError: Ran out of memory in memory space hbm; used: YYY; limit: 7.48G.
Framework dan Konfigurasi yang Terpengaruh
Pesan ini dapat muncul saat melakukan pelatihan dengan TensorFlow, PyTorch, atau JAX.
Detail
Setiap Cloud TPU terdiri dari delapan core TPU, TPU v2 memiliki RAM sebesar 8 GB, dan TPU v3 memiliki RAM sebesar 16 GB (atau HBM, High-Bandwidth Memory). Memori ini digunakan untuk menyimpan tensor (variabel) bobot, serta tensor hasil perantara yang diperlukan untuk komputasi gradien. Jika model terlalu besar untuk dimuat ke dalam RAM TPU, inisialisasi akan gagal dan pesan error akan dicetak. Lihat bagian tentang mengurangi penggunaan memori untuk mendapatkan bantuan lebih lanjut.
Tips untuk mengurangi penggunaan memori:
- Memeriksa padding tensor yang berlebihan
- Menggunakan format bfloat16
- Jika ukuran input atau model terlalu besar, Anda mungkin dapat menggunakan paralelisme model eksperimental TensorFlow untuk mengatasi ukuran model.
Masalah saat menghentikan eksekusi
Jika TensorFlow mengalami error selama eksekusi TPU, skrip
terkadang tampaknya berhenti merespons, bukan keluar ke shell. Jika hal ini terjadi,
tekan CTRL+C
di keyboard untuk memicu SIGQUIT
, yang menyebabkan
Python segera keluar.
Demikian pula, menekan CTRL+C
selama eksekusi TPU tidak langsung menonaktifkan TensorFlow, tetapi menunggu hingga akhir loop iterasi saat ini untuk
keluar dengan bersih.
Jika Anda mengalami error baru saat terhubung kembali ke TPU setelah keluar dengan cara ini, reset server TPU secara manual dengan perintah:
gcloud compute tpus tpu-vm stop tpu-name --zone=zone gcloud compute tpus tpu-vm start tpu-name --zone=zone
dengan tpu-name diambil dari kolom pertama yang ditampilkan oleh
perintah gcloud compute tpus tpu-vm list
dan zone adalah zona yang ditampilkan di
kolom kedua.
Padding tensor yang berlebihan
Kemungkinan Penyebab Masalah Memori
Tensor di memori TPU ditambahkan padding, yaitu, TPU membulatkan ukuran tensor yang disimpan dalam memori untuk melakukan komputasi secara lebih efisien. Padding ini terjadi secara transparan di tingkat hardware dan tidak memengaruhi hasil. Namun, dalam kasus tertentu, padding dapat menyebabkan peningkatan penggunaan memori dan waktu eksekusi secara signifikan.
Cara Mengurangi Penggunaan Memori
Software TPU mencoba menata tensor dalam memori untuk memaksimalkan efisiensi komputasi dan meminimalkan padding. Proses tata letak memori ini rumit, tetapi untuk hasil terbaik, model harus mematuhi aturan praktis berikut. Untuk meminimalkan overhead memori dan memaksimalkan efisiensi komputasi, salah satu hal berikut harus terpenuhi:
Total ukuran batch harus kelipatan 64 (8 per core TPU), dan dimensi fitur harus kelipatan 128,
atau
Total ukuran batch harus kelipatan 1024 (128 per core TPU), dan dimensi fitur harus kelipatan 8.
Menggunakan ukuran batch 1024 dan dimensi fitur yang merupakan kelipatan dari 128 akan menghasilkan efisiensi terbaik, meskipun hal ini mungkin tidak dapat dilakukan untuk semua model. Untuk memperjelas, "dimensi fitur" mengacu pada ukuran tersembunyi lapisan sepenuhnya terkoneksi atau jumlah saluran output dalam konvolusi. Tidak semua lapisan dapat mematuhi aturan ini, terutama lapisan pertama dan terakhir jaringan. Hal ini tidak masalah, dan diperkirakan sebagian besar model memerlukan sejumlah padding.
Mengurangi penggunaan memori
Jika mengalami error kehabisan memori saat menjalankan model di TPU, Anda harus melakukan langkah-langkah untuk mengurangi penggunaan memori model.
Cara paling efektif untuk mengurangi penggunaan memori adalah dengan:
- Mengurangi padding tensor yang berlebihan
- Mengurangi ukuran batch
Ukuran batch atau model terlalu besar
Kemungkinan Penyebab Masalah Memori
Saat melatih jaringan saraf di CPU, GPU, atau TPU, penggunaan memori berasal dari dua tempat:
- Penggunaan memori sebanding dengan jumlah bobot dalam model.
- Menyimpan aktivasi perantara dari penerusan maju yang diperlukan untuk menghitung penerusan mundur. Penggunaan memori secara langsung sebanding dengan ukuran batch, ukuran lapisan, dan jumlah lapisan.
Oleh karena itu, memori yang diperlukan oleh model sebagian besar bergantung pada ukuran batch.
Memori yang diperlukan oleh model bergantung pada jumlah lapisan dalam jaringan.
Runtime TPU mencoba mengoptimalkan operator agar cocok dengan model dalam memori (disebut rematerialisasi, mirip dengan checkpoint gradien), tetapi tidak selalu dapat melakukannya.
Cara Mengurangi Penggunaan Memori
Kurangi ukuran batch secara perlahan hingga sesuai dengan memori, pastikan total ukuran batch adalah kelipatan 64 (ukuran batch per core harus merupakan kelipatan 8). Perlu diingat bahwa ukuran batch yang lebih besar lebih efisien di TPU. Total ukuran batch 1024 (128 per core) umumnya merupakan titik awal yang baik.
Jika model tidak dapat dijalankan di TPU meskipun dengan ukuran batch kecil (misalnya, 64), coba kurangi jumlah lapisan atau ukuran lapisan.
Meningkatkan kecepatan pelatihan
Jika model Anda berhasil berjalan di TPU, tetapi kecepatan pelatihannya kurang dari yang diharapkan, bagian ini menguraikan beberapa kemungkinan cara untuk meningkatkan kecepatan. Lihat Panduan performa untuk saran lain tentang cara meningkatkan performa pelatihan.
Terlalu sedikit langkah per eksekusi per loop pelatihan
Deskripsi Masalah Performa
Meneruskan argumen steps_per_execution
ke Model.compile
akan mengontrol
jumlah langkah pelatihan yang dijalankan di antara callback host.
Setiap callback host memerlukan komunikasi yang signifikan
antara CPU host server TPU dan perangkat TPU, sehingga jika steps_per_execution
terlalu kecil, hal ini dapat memperlambat pelatihan.
Cara Mengetahui Apakah Model Anda Terpengaruh
Jika profil TPU mengungkapkan callback CPU host yang sering terjadi di antara langkah perangkat TPU,
pelatihan Anda dapat memanfaatkan nilai steps_per_execution
yang lebih besar.
Cara Mitigasi
Tetapkan steps_per_execution
ke nilai yang lebih besar. Perhatikan bahwa
steps_per_execution
dapat ditetapkan ke nilai besar, tetapi perlu diingat bahwa
logging pesan dan menyimpan titik pemeriksaan hanya dapat dilakukan setelah
jumlah langkah yang ditentukan telah dijalankan.
Bottleneck pemrosesan input
Deskripsi Masalah Performa
Saat TPU dilatih pada bagian data tertentu, fungsi pemrosesan input akan menyiapkan bagian data berikutnya di CPU. Jika fungsi input Anda memerlukan waktu lebih lama daripada fungsi model, TPU akan dibiarkan tidak ada aktivitas saat fungsi input mengambil data.
Cara Mengetahui Apakah Model Anda Terpengaruh
Ikuti petunjuk di Alat Cloud TPU: Input Pipeline Analyzer untuk melihat analisis pipeline input di TensorBoard:
Halaman analisis pipeline input menampilkan ringkasan yang jelas yang menunjukkan apakah model Anda mengalami bottleneck oleh pemrosesan input. Halaman yang sama juga menampilkan waktu eksekusi per operasi, yang memungkinkan Anda menentukan operasi yang bermasalah.
Cara Mitigasi
Ada beberapa kemungkinan mitigasi saat memuat data dengan Dataset
API:
- Simpan data Anda sebagai kumpulan struktur
tf.train.Example
dalam fileTFRecord
, dan muat denganTFRecordDataset
. Lihat tutorial Dataset API atau tutorial ResNet untuk mengetahui contohnya. - Gunakan
dataset.cache()
ataudataset.prefetch()
untuk melakukan buffering data input. Hal ini mencegah pelambatan sporadis dalam akses file sehingga tidak menimbulkan bottleneck. - Tentukan parameter
num_parallel_calls
dari fungsidataset.map()
untuk mengaktifkan operasimap()
multi-thread. Heuristik untuk nilainum_parallel_calls
adalah menggunakan jumlah core CPU yang tersedia. - Lakukan prapemrosesan data yang mahal secara offline sebagai biaya satu kali, bukan menanggung biaya melalui setiap epoch dari setiap pelatihan.
Semua pemrosesan input dilakukan pada CPU yang berada di server TPU, bukan di komputer lokal, sehingga kecepatan komputer lokal tidak menjadi faktor.
Waktu langkah lambat dan penggunaan MXU rendah
Deskripsi Masalah Performa
Cloud TPU dapat melakukan perkalian dan konvolusi matriks dengan kecepatan yang sangat tinggi. Sebagian besar operasi TensorFlow lainnya memiliki implementasi yang efisien di TPU, tetapi ini bukan kekuatan utama TPU dibandingkan dengan hardware lainnya. Oleh karena itu, model harus didominasi oleh perkalian matriks atau konvolusi untuk memanfaatkan TPU sepenuhnya.
Cara Mengetahui Apakah Model Anda Terpengaruh
Gejala yang akan Anda lihat dalam kasus ini adalah waktu langkah lambat yang disertai dengan penggunaan MXU rendah yang ditampilkan saat Anda membuat profil performa.
Cara Mitigasi
Coba kurangi jumlah operasi yang bukan perkalian matriks. Setelah mengurangi jumlah perkalian matriks, lakukan benchmark ulang untuk melihat apakah performanya dapat diterima di TPU.
Padding tensor yang berlebihan
Deskripsi Masalah Performa
TPU menambahkan padding pada tensor dalam memori sehingga TPU dapat menggunakan unit komputasinya secara efisien. Padding dapat meningkatkan penggunaan memori dan bandwidth memori. Lihat bagian tentang padding tensor untuk mendapatkan bantuan dalam memahami dan memperbaiki masalah padding tensor.
Throughput lambat dan penggunaan memori rendah
Deskripsi Masalah Performa
Sebagai aturan umum, menggunakan ukuran batch yang lebih besar akan menghasilkan kecepatan pelatihan yang lebih tinggi di TPU, dalam hal sampel/detik.
Cara Mengetahui Apakah Model Anda Terpengaruh
Ukuran batch model apa pun harus selalu minimal 64 (8 per core TPU), karena TPU selalu menambahkan padding ke tensor hingga ukuran ini. Ukuran batch yang ideal saat melatih di TPU adalah 1024 (128 per core TPU), karena hal ini menghilangkan inefisiensi yang terkait dengan transfer memori dan padding.
Cara Mitigasi
Praktik terbaiknya adalah menggunakan ukuran batch terbesar yang sesuai dengan memori dan merupakan kelipatan 64. Cara termudah untuk mencapainya adalah memulai dengan 1024, dan jika hal ini menyebabkan error kehabisan memori, coba kurangi ukuran batch hingga model berhasil berjalan. Mengubah ukuran batch model mungkin memerlukan penyesuaian hyperparameter lain untuk mencapai akurasi model yang sama, seperti kecepatan pembelajaran, tetapi hal ini harus dievaluasi berdasarkan kasus per kasus.
Ukuran lapisan terlalu kecil
Deskripsi Masalah Performa
Meskipun model didominasi oleh perkalian matriks atau konvolusi, TPU mungkin tidak berjalan dengan efisiensi penuh jika tensor inputnya kecil. Jika dibandingkan dengan hardware lain, TPU berjalan paling efisien jika ukuran batch dan ukuran lapisan besar (misalnya, dimensi >= 512).
Cara Mengetahui Apakah Model Anda Terpengaruh
Sebagai aturan umum, ukuran lapisan yang lebih kecil dari 128 akan menghasilkan efisiensi yang buruk di TPU, karena 128 adalah dimensi bawaan dari unit perkalian matriks TPU. Untuk lapisan yang terhubung sepenuhnya, ukuran tersembunyi minimum 512 direkomendasikan untuk mencapai efisiensi tinggi. Perhatikan bahwa lapisan konvolusi biasanya tidak perlu sebesar lapisan terhubung sepenuhnya untuk mencapai tingkat efisiensi yang sama.
Cara Mitigasi
Jika motivasi utama untuk ukuran lapisan kecil dalam model Anda adalah kecepatan pelatihan, lakukan benchmark ulang model Anda dengan lapisan yang lebih besar di TPU. Misalnya, meningkatkan ukuran output lapisan dari 256 menjadi 512 mungkin hanya meningkatkan waktu pelatihan sebesar 20% meskipun model melakukan komputasi 2x lipat.
Pembuatan profil model tingkat operasi
Sering kali berguna untuk mengukur waktu eksekusi tingkat operasi dan penggunaan memori untuk
mengidentifikasi bottleneck performa. Untuk mengetahui petunjuk cara melakukannya,
lihat panduan Alat Cloud TPU: Trace Viewer.
Men-debug penurunan akurasi model
Salah satu sasaran ekosistem Cloud TPU adalah setiap model yang dilatih di CPU atau GPU akan mencapai akurasi yang sangat mirip saat dilatih di TPU, dengan mungkin penyesuaian kecil pada hyperparameter seperti ukuran batch dan kecepatan belajar. Namun, terkadang pengguna dapat mengamati menurunnya akurasi saat melatih model di TPU. Proses debug masalah tersebut dapat sangat menjengkelkan karena sifat pelatihan jaringan neural yang acak. Bagian ini memberikan panduan tentang cara menentukan akar masalah menurunnya akurasi model saat melakukan port model ke TPU.
Memahami sharding data (paralelisme data)
Salah satu sasaran utama TensorFlow adalah setiap operasi harus menghasilkan hasil yang hampir identik, baik dijalankan di CPU, GPU, maupun TPU. Ada pengecualian tertentu untuk hal ini, seperti operasi acak. Secara umum, jika Anda menemukan perbedaan yang signifikan antara output operasi non-acak di TPU dan CPU, laporkan sebagai bug.
Namun, untuk pipeline pelatihan secara keseluruhan, ada perbedaan
signifikan antara pelatihan di CPU/GPU dan TPU. Saat melakukan pelatihan di TPU,
TensorFlow melakukan sharding data,
Setiap Cloud TPU berisi 8 core TPU yang beroperasi sebagai unit pemrosesan
independen. Untuk setiap langkah dalam pelatihan, setiap core TPU menerima batch
data, menghitung gradien bobot, menukar gradien dengan
core TPU lainnya,
lalu menghitung pembaruan bobot. Secara default, kerugian dirata-ratakan di seluruh
core, tetapi dapat dijumlahkan dengan mengubah parameter CrossShardOptimizer
.
Jika total kerugian model dapat dihitung sebagai rata-rata (atau jumlah) kerugian per sampel independen, prosedur ini secara matematis setara dengan pelatihan pada satu batch besar.
Operasi paling umum yang tidak independen per sampel adalah normalisasi batch, yang berjalan di setiap batch per core secara terpisah. Misalnya, jika total ukuran batch adalah 128, ukuran batch per core adalah 16, dan setiap 8 core melakukan normalisasi batch pada 16 sampelnya sendiri. Dalam beberapa kasus, melakukan normalisasi batch pada batch kecil (misalnya, kurang dari 32) telah ditemukan mengurangi akurasi. Dalam skenario ideal, total ukuran batch harus besar (misalnya, 256 hingga 1024). Jika ukuran batch terlalu besar untuk dimuat dalam memori, efek sharding harus dievaluasi berdasarkan kasus per kasus.
Pelatihan deterministik
Salah satu alasan sulitnya men-debug perbedaan akurasi model adalah di berbagai framework (TensorFlow, PyTorch, JAX), software pelatihan menggunakan inisialisasi bobot dan pengacakan data yang berbeda setiap kali model dilatih. Sebaiknya ubah prosedur pelatihan menjadi deterministik, sehingga beberapa operasi menghasilkan model yang hampir identik. Bagian ini menunjukkan cara menjalankan tutorial MNIST secara deterministik:
- Buat file checkpoint awal dengan menjalankan satu langkah di CPU. Langkah ini digunakan untuk mencapai inisialisasi bobot deterministik. Selain itu, pastikan Anda menggunakan seed acak tetap untuk fungsi acak apa pun dalam model.
# Run training for 1 step to create an initial checkpoint. python mnist_tpu.py \ --use_tpu=False \ --data_dir=${STORAGE_BUCKET}/data/ \ --model_dir=${STORAGE_BUCKET}/init_output \ --random_seed=12345 \ --iterations=1 --train_steps=1
- Ubah fungsi pengacakan data dalam fungsi input Anda untuk menggunakan seed acak. Hal ini telah dilakukan dalam tutorial MNIST. Hal ini berfungsi untuk operasi pemrosesan data input karena selalu berjalan di CPU. Operasi acak dalam fungsi model mungkin tidak deterministik antara TPU dan CPU. Setiap kali Anda memanggil operasi acak, teruskan seed tetap untuk memastikan hasil yang sama di antara operasi. Contoh:
# In the flag definitions
tf.flags.DEFINE_integer("batch_size", None, "Random seed for training")
# In the input_fn
if FLAGS.random_seed is not None:
dataset = dataset.shuffle(seed=FLAGS.random_seed)
-
Jalankan model yang sama dua kali di CPU untuk memverifikasi bahwa pelatihan bersifat
deterministik. Perhatikan bahwa pelatihan harus dijalankan untuk jumlah langkah yang wajar (misalnya, 1.000), tetapi tidak perlu dijalankan hingga konvergensi.
Karena pelatihan CPU dibandingkan dengan pelatihan TPU satu core, gunakan ukuran batch yang dapat muat di satu core TPU (biasanya, ukuran batch penuh dibagi 8). TensorFlow tidak menjamin determinisme bit demi bit di antara eksekusi, tetapi kerugiannya harus sangat dekat:
Menyalin bobot awal
gcloud storage cp ${STORAGE_BUCKET}/init_output/* ${STORAGE_BUCKET}/cpu_output_1/ --continue-on-error gcloud storage cp ${STORAGE_BUCKET}/init_output/* ${STORAGE_BUCKET}/cpu_output_2/ --continue-on-error
Putaran 1
python mnist_tpu.py \ --use_tpu=False \ --data_dir=${STORAGE_BUCKET}/data/ \ --model_dir=${STORAGE_BUCKET}/cpu_output_1 \ --batch_size=128 \ --random_seed=12345 \ --train_steps=2000 \ --eval_steps=10
Output 1
accuracy = 0.9910644, global_step = 1000, loss = 0.025323588
Run 2
python mnist_tpu.py \ --use_tpu=False \ --data_dir=${STORAGE_BUCKET}/data/ \ --model_dir=${STORAGE_BUCKET}/cpu_output_1 \ --batch_size=128 \ --random_seed=12345 \ --train_steps=2000 \ --eval_steps=10
Output 2
accuracy = 0.9910644, global_step = 1000, loss = 0.025323414
Pelatihan TPU satu core
Setelah Anda dapat menjalankan tutorial MNIST secara deterministik, langkah berikutnya adalah mereplikasi hasil yang dilatih CPU di TPU, menggunakan satu core TPU untuk menentukan apakah masalahnya terkait dengan sharding data atau mesin eksekusi TPU itu sendiri.
Berikut cara menjalankan pelatihan dan evaluasi single-core di tutorial MNIST:
Menggunakan inisialisasi bobot yang sama dengan CPU
gcloud storage cp ${STORAGE_BUCKET}/init_output/* ${STORAGE_BUCKET}/tpu_output --continue-on-error
Menjalankan pelatihan selama 1.000 langkah
python mnist.py \ --use_tpu=True \ --master=$GRPC_SERVER \ --train_file=${STORAGE_BUCKET}/data/train.tfrecords \ --model_dir=${STORAGE_BUCKET}/tpu_output \ --random_seed=12345 \ --num_shards=1 \ --batch_size=128 \ --train_steps=1000 \ --eval_steps=10
Output
accuracy = 0.9910644, global_step = 1000, loss = 0.02514153
Kerugian tidak akan sama persis dengan model yang dilatih CPU, tetapi harus mendekati. Jika tidak mendekati untuk model Anda, hal ini mungkin menunjukkan bahwa Anda telah menemukan bug di mesin eksekusi TPU. Sebelum mengirim laporan bug, periksa kembali hal-hal berikut:
Anda meneruskan
num_shards=1
keTPUConfig
.Anda tidak memiliki operasi acak dalam fungsi model, dan setiap operasi acak dalam fungsi input Anda di-seed dengan benar.
Anda menggunakan file checkpoint awal yang sama untuk pelatihan CPU dan TPU.
Men-debug pelatihan TPU multi-core
Jika model Anda memang mencapai kerugian yang sama pada CPU dan TPU single-core, masalahnya kemungkinan salah satu dari berikut ini:
(a) Degradasi terjadi karena varian acak alami saat melatih model neural dengan inisialisasi yang berbeda.
(b) Degradasi terjadi karena masalah yang terkait dengan sharding data di TPU.
Untuk menentukan apakah (a) adalah masalahnya, latih ulang model lengkap di CPU/GPU dan TPU multi-core menggunakan inisialisasi bobot yang sama.
Jika Anda yakin bahwa penurunan akurasi signifikan secara statistik, masalah yang paling mungkin terkait dengan sharding data adalah:
- Jika model Anda menggunakan normalisasi batch, total ukuran batch kurang dari 256 (misalnya, kurang dari 32 per core) dapat mengurangi akurasi.
- Fungsi loss per batch dipengaruhi oleh sharding. Fungsi loss tersebut biasanya cukup khusus. Misalnya, Karras et al. 2017 menggunakan diskriminator batch saat melatih jaringan adversarial generatif.
Pemecahan masalah penyiapan gcloud
- Masalah
gcloud components update
menampilkan pesan error berikut:
ERROR: (gcloud.components.update) You cannot perform this action because the Cloud SDK component manager is disabled for this installation.
- Solusi
- Untuk menggunakan
gcloud
, Anda perlu menggunakan penginstalangcloud
yang tidak dikelola melalui pengelola paket. Ikuti langkah-langkah berikut untuk menginstalgcloud
dari kode sumber:
sudo apt-get remove google-cloud-sdk curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-311.0.0-linux-x86_64.tar.gz tar -xzf google-cloud-sdk-311.0.0-linux-x86_64.tar.gz ./google-cloud-sdk/install.sh source ~/.bashrc
- Masalah
Perintah
gcloud compute tpus tpu-vm ssh ${TPU_NAME} --zone ${ZONE}
menampilkan pesan error berikut:Waiting for SSH key to propagate. ssh: connect to host 34.91.136.59 port 22: Connection timed out ssh: connect to host 34.91.136.59 port 22: Connection timed out ssh: connect to host 34.91.136.59 port 22: Connection timed out ERROR: (gcloud.compute.tpus.tpu-vm.ssh) Could not SSH into the instance. It is possible that your SSH key has not propagated to the instance yet. Try running this command again. If you still cannot connect, verify that the firewall and instance are set to accept ssh traffic.
- Solusi
Mungkin ada yang salah dengan penerapan kunci SSH. Coba pindahkan kunci yang dibuat secara otomatis ke lokasi cadangan untuk memaksa
gcloud
membuat ulang kunci tersebut:mv ~/.ssh/google_compute_engine ~/.ssh/old-google_compute_engine mv ~/.ssh/google_compute_engine.pub ~/.ssh/old-google_compute_engine.pub
Log debug
Framework Cloud TPU yang didukung, JAX, PyTorch, dan TensorFlow
mengakses TPU menggunakan library bersama yang disebut libtpu
yang ada di
setiap VM TPU. Library ini mencakup compiler XLA yang digunakan untuk mengompilasi
program TPU, runtime TPU yang digunakan untuk menjalankan program yang dikompilasi,
dan driver TPU yang digunakan oleh runtime untuk akses tingkat rendah ke TPU.
Library libtpu
mencatat informasi yang dapat berguna untuk proses debug.
Secara default, log ini ditulis ke /tmp/tpu_logs
di setiap VM Cloud TPU.
Variabel lingkungan berikut dapat ditetapkan sebelum Anda memulai pelatihan
untuk mengubah perilaku logging:
- TPU_LOG_DIR: direktori tempat log ditulis
- Lokasi direktori ditetapkan secara default ke
/tmp/tpu_logs
. Direktori akan dibuat jika belum ada, tetapi tidak ada direktori induk yang dibuat. Jika terjadi error saat menemukan atau membuat direktori yang ditentukan, pesan akan dicetak ke stderr, tetapi tidak akan menghentikan program dan logging dinonaktifkan. Tetapkan nama direktori ke "dinonaktifkan" untuk menonaktifkan logging ke disk sepenuhnya. - TPU_MIN_LOG_LEVEL: tingkat keparahan minimum yang akan dicatat ke disk
- Pilihannya adalah 0 (INFO), 1 (WARNING), 2 (ERROR), dan 3 (FATAL). Defaultnya adalah 0.
- TPU_STDERR_LOG_LEVEL: tingkat keparahan minimum yang akan dicatat ke stderr, selain disk, jika berlaku
- Pilihannya sama dengan TPU_MIN_LOG_LEVEL. Nilai defaultnya adalah 3.
- TPU_MAX_LOG_SIZE_MB: ukuran maksimum dalam megabyte dari setiap file log
- File log baru akan otomatis dimulai saat file log sebelumnya mencapai ukuran ini. Setelan defaultnya adalah 1024.