×

Hasil Training Pytorch Backend MPS GPU M1 tidak akurat dan solusinya

Hasil Training Pytorch Backend MPS GPU M1 tidak akurat dan solusinya

408 Views

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

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 unsafe ops when using mps 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)," %")    

 

See also  Pengertian inbalance dataset dan Solusinya SMOTE Synthetic Minority Oversampling Technique

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

 

 

You May Have Missed