Perangkat MPS memungkinkan pelatihan berkinerja tinggi pada GPU untuk perangkat MacOS dengan kerangka pemrograman Metal. Ini memperkenalkan perangkat baru untuk memetakan grafik komputasi dan primitif pembelajaran mesin pada kerangka kerja Grafik Metal Performance Shaders yang sangat efisien, beserta kernel yang disesuaikan yang disediakan oleh kerangka kerja Metal Performance Shaders masing-masing.
Metal Performance Shaders (MPS) Sebagai Backend
MPS adalah backend yang memungkinkan pelatihan GPU yang dipercepat menggunakan kerangka kerja PyTorch. Dengan memanfaatkan MPS, PyTorch dapat mengoptimalkan performa komputasi dengan kernel-kernel yang disesuaikan secara khusus untuk karakteristik unik dari GPU Metal.
Percobaan Pytorch dengan GPU M1
Mari kita coba kehandalan GPU M1 dengan spek macbook air seperti berikut
dengan pytorch versi Torch 2.1.2 dengan GPU Cuda tidak ada! namun menggunakan backend MPS
Berikut salah satu contoh running VGG16 dengan hasil waktu konsumsi yang turun drastis
dari semula tanpa MPS butuh waktu 1.800 detik tapi dengan MPS hanya menjadi 159 detik saja! berkurang sangat drastis. Sempat saja coba dengan Laptop Windows 11 dengan AMD Ryzen 3 dengan GPU built in nya (tentu Pytorch nya masih pakai CPU) membutuhkan waktu 2.000 detik.
print('Torch', torch.__version__, 'CUDA', torch.version.cuda)
device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
print("running dengan ",device)
maks_epoch = 500
#sesi pelatihan
total_loss = 0
for epoch in tqdm(range(epoch_current,maks_epoch+1)):
model.train()
for i,batch in enumerate(train_dl):
images,labels = batch
images = images.to(device)
labels = labels.to(device)
out = model(images) # Generate predictions
loss = criterion(out, labels) # Calculate loss
# Backward and optimize
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss = total_loss+loss.item()
loss_list.append(total_loss/epoch)
print("epoch: ",epoch," loss: ",total_loss/epoch)
#writer.add_scalar("Loss/train", total_loss/epoch, epoch)
if(epoch%10)==0: #akan simpan checkpoint
if(os.path.exists(folder)==False):
os.mkdir(folder)
torch.save({
'epoch': epoch,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'loss': loss.item(),
},folder+'/model.pt')
#simpan juga lost
np.savetxt(folder+'/loss.csv',np.array(loss_list), delimiter=',')
# break
if os.path.exists('stop.txt'):
print("stop by user")
if(os.path.exists(folder)==False):
os.mkdir(folder)
torch.save({
'epoch': epoch,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'loss': loss.item(),
},folder+'/model.pt')
#simpan juga lost
np.savetxt(folder+'/loss.csv',np.array(loss_list), delimiter=',')
# break
break
Padahal sebelumnya sempat berpikir mau beli PC Desktop dengan GPU NVidia dengan spesifikasi berikut
- INTEL CORE i5 11400F BOX
- MB GIGABYTE H510M-K
- MEMORY DDR4 16GB 3200 RGB
- SSD M.2 NVMe 256GB 2280
- VGA NVIDIA RTX 3050 8GB D6
- CASE VENOM RX VANGHAR
- PSU FSP HV-PRO 550W 80+
- LED 22″ LENOVO D22 FHD 1080P
- KEY M LOGITECH MK 120
Menjadi diurungkan karena menggunakan Macbook air saja sudah sangat cukup sekali!
Keuntungan dari Penggunaan Backend MPS
- Optimasi Kinerja: Backend MPS memperluas fungsionalitas PyTorch, memberikan skrip dan kemampuan untuk menjalankan operasi dengan efisien pada perangkat MacOS. Dengan demikian, kinerja GPU M1 dapat dioptimalkan secara signifikan.
- Pemetaan Grafik Komputasi: Perangkat baru yang diperkenalkan dengan backend MPS memetakan grafik komputasi dan primitif pembelajaran mesin pada MPS Graph framework. Hal ini memungkinkan pengguna untuk merancang dan melaksanakan operasi ML dengan lebih baik.
- Kernels Tersesuaikan: Backend MPS menyediakan kernel-kernel yang disesuaikan dengan baik, dioptimalkan untuk karakteristik unik dari setiap keluarga GPU Metal. Ini berarti bahwa setiap operasi dapat dijalankan dengan efisiensi maksimal