Hasil Training Pytorch Backend MPS GPU M1 tidak akurat dan solusinya
Hasil Training Pytorch Backend MPS tidak akurat – Setelah menggunakan Backend MPS untuk training Pytorch di macbook M1 yang menghasilkan kecepatan waktu komputasi yang sangat cepat, namun.. ada sedikit keanehan yang saya alami? Apa itu
Awal mulanya keanehan itu terjadi ketika melihat hasil grafik loss yang cenderung menghasilkan garis lurus yang tidak biasanya ditemui seperti menggunakan backend CPU yang melandai. Saya pikir ini mungkin karena modelnya seperti itu.
Mungkin hal ini hanya perasaan saja! namun alangkah terkejutnya ketika hasil pelatihan selesai dan melakukan validasi, menghasilkann 0.59% saja akurasinya, yup! kalian tidak salah baca tidak sampai 1%. Ini hal yang sangat aneh sekali!
OK, mungkin ini ada kesalahan yang tidak saya mengerti, namun ketika saya coba kembali menggunakan laptop berbasis windows 11 tentunya dengan backend CPU menghasilkan akurasi 100%.
Kesimpulan pertama yaitu “Wah ada yang kacau ternyata Pytorch backend MPS”
MPS backend produces bad training results in comparison to other backends
Setelah googling, akhirnya didapatkan beberapa ulasan yaitu
- https://github.com/pytorch/pytorch/issues/92615
- https://github.com/pytorch/pytorch/issues/109457
- https://discuss.pytorch.org/t/really-low-accuraccy-of-0/152085/4
- https://stackoverflow.com/questions/75850829/receiving-0-acccuracy-in-mnist-cnn-with-macbook-m1-mps
terjadinya kesalahan pada
Hello, the bad results come from a numerical correctness issue of LSTM on MPS backend. We’re working on fixing this.
baca [MPS] Fix LSTM backward and forward pass
Hem.. sangat memaklumi dengan teknologi baru yang masih terdapat bugs
Sebagai catatan, saya menggunakan versi Torch 2.1.2
Solusinya
Setelah baca2 diforum https://stackoverflow.com/questions/75850829/receiving-0-acccuracy-in-mnist-cnn-with-macbook-m1-mps
ternyata ada bugs
This issue is caused by
argmax()
. I think it is an unsafeops
when usingmps
device. In this case, you can use.max(dim=1).indices
to get the correct results. More details can be found at https://github.com/pytorch/pytorch/issues/92311 .
Issuenya yaitu
tensor.argmax() returning erroneous result on ‘mps’ backend.
jadi kode evaluasi yang semula
#lakukan evaluasi model.eval() jumlah_benar = 0 jumlah_data = 0 for i,batch in enumerate(tqdm(train_dl)): images,labels = batch images = images.to(device) labels = labels.to(device) out = model(images) prediksi = torch.argmax(out,dim=1) n = len(labels) benar = (prediksi==labels).sum() jumlah_data = jumlah_data + n jumlah_benar = jumlah_benar+benar # break acc = (jumlah_benar/jumlah_data)*100 print("\n akuarasi acc : ",np.round(acc.item(),decimals=2)," %")
diubah menjadi
#lakukan evaluasi model.eval() jumlah_benar = 0 jumlah_data = 0 for i,batch in enumerate(tqdm(train_dl)): images,labels = batch images = images.to(device) labels = labels.to(device) out = model(images) # prediksi = torch.argmax(out,dim=1) prediksi = out.max(dim=1).indices #ini yang digunakan n = len(labels) benar = (prediksi==labels).sum() jumlah_data = jumlah_data + n jumlah_benar = jumlah_benar+benar # break acc = (jumlah_benar/jumlah_data)*100 print("\n akuarasi acc : ",np.round(acc.item(),decimals=2)," %")
yaitu kode prediksi = torch.argmax(out,dim=1)
menjadi prediksi = out.max(dim=1).indices
Kesimpulan
Jadi teknologi opensource terkadang masih ada bugs dan untungnya semua ada solusi di forum sehingga harus rajin-rajin membaca