租賃服務(wù)器的網(wǎng)站網(wǎng)上培訓(xùn)課程平臺(tái)
1. 安裝torch
在官網(wǎng)上可以查看安裝教程,Start Locally | PyTorch
作者安裝了目前最新的torch版本2.5.1,需要提前安裝python3.9及以上版本,作者python版本是python3.11最新版本?
使用conda安裝torch,在終端進(jìn)入要安裝的環(huán)境,執(zhí)行如下命令即可,值得一提的是,安裝torch的前提條件是需要事先安裝對(duì)應(yīng)版本的python,以及annoconda
conda install pytorch torchvision -c pytorch
執(zhí)行完如上命令后就會(huì)出現(xiàn)如下畫面,需要等待幾分鐘,直到安裝完畢
2. 安裝MPS
使用conda安裝mps
conda install torch torchvision torchaudio
3 安裝是否成功測(cè)試
import torch
# 查看 torch安裝是否成功 并查看其版本
print(torch.__version__)
# 查看 mps是否安裝成功 是否可用
print(torch.backends.mps.is_available())
# 檢查 GPU 是否可用
print(torch.cuda.is_available()) # 對(duì)于 MPS,返回 False 是正常的
print(torch.backends.mps.is_available()) # 應(yīng)該返回 True
# 獲取 MPS 設(shè)備
mps_device = torch.device("mps")
print(mps_device) # 輸出 "mps"
執(zhí)行如上代碼,能夠成功打印出torch版本,證明第一章節(jié)的torch安裝成功,如果能打印出True證明MPS可用,至于其中的一個(gè)False是cuda是否可用,因?yàn)樽髡呤荕ac電腦,沒(méi)有安裝顯卡所以并無(wú)法安裝cuda加速,固然為false
4 加速對(duì)比
總的來(lái)說(shuō),模型越復(fù)雜,其MPS加速越明顯,如果模型太簡(jiǎn)單,只需要幾秒鐘就能跑完的話,MPS加速反而不如CPU,因?yàn)镸PS要有一些準(zhǔn)備工作,把數(shù)據(jù)放入圖顯核心里去,如果算法太簡(jiǎn)單或者數(shù)據(jù)量太少,結(jié)果運(yùn)行加速節(jié)約的時(shí)間還不如數(shù)據(jù)準(zhǔn)備的時(shí)間長(zhǎng),看起來(lái)就會(huì)覺(jué)得MPS反而需要更多時(shí)間來(lái)運(yùn)行。
如下是作者的測(cè)試代碼
import torch
import torch.nn as nn
import torch.optim as optim
import time# 設(shè)置訓(xùn)練參數(shù)
input_size = 4096 # 輸入特征數(shù)
hidden_size = 1024 # 隱藏層神經(jīng)元數(shù)
output_size = 10 # 輸出類別數(shù)(例如 10 類)
num_epochs = 50 # 訓(xùn)練輪數(shù)
batch_size = 64 # 批量大小
learning_rate = 0.01 # 學(xué)習(xí)率# 定義一個(gè)簡(jiǎn)單的全連接神經(jīng)網(wǎng)絡(luò)
class SimpleNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(input_size, hidden_size)self.relu = nn.ReLU()self.fc2 = nn.Linear(hidden_size, output_size)def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return x# 函數(shù):訓(xùn)練模型并記錄訓(xùn)練時(shí)間
def train_model(device, num_epochs):# 創(chuàng)建數(shù)據(jù)集num_samples = 100000 # 數(shù)據(jù)集樣本數(shù)量x_train = torch.randn(num_samples, input_size).to(device)y_train = torch.randint(0, output_size, (num_samples,)).to(device)# 模型、損失函數(shù)和優(yōu)化器model = SimpleNN(input_size, hidden_size, output_size).to(device)criterion = nn.CrossEntropyLoss()optimizer = optim.SGD(model.parameters(), lr=learning_rate)# 開始計(jì)時(shí)start_time = time.time()# 訓(xùn)練循環(huán)for epoch in range(num_epochs):for i in range(0, num_samples, batch_size):# 獲取當(dāng)前批量數(shù)據(jù)inputs = x_train[i:i+batch_size]labels = y_train[i:i+batch_size]# 前向傳播outputs = model(inputs)loss = criterion(outputs, labels)# 反向傳播和優(yōu)化optimizer.zero_grad()loss.backward()optimizer.step()# 結(jié)束計(jì)時(shí)end_time = time.time()# 返回訓(xùn)練時(shí)間return end_time - start_time# 主程序
if __name__ == "__main__":# 設(shè)備列表devices = {"CPU": torch.device("cpu"),"MPS": torch.device("mps") if torch.backends.mps.is_available() else None,}# 分別測(cè)試 CPU 和 MPSresults = {}for device_name, device in devices.items():if device is None:print(f"\nSkipping {device_name} as it is not available.")continueprint(f"\nTraining on {device_name}...")training_time = train_model(device, num_epochs)results[device_name] = training_timeprint(f"Training time on {device_name}: {training_time:.2f} seconds")# 打印對(duì)比結(jié)果print("\n--- Training Time Comparison ---")for device_name, time_taken in results.items():print(f"{device_name}: {time_taken:.2f} seconds")
本人運(yùn)行的機(jī)器是Mac Mini M2(8+10)16G+1T ,
3.1 CPU和GPU占用
在使用CPU運(yùn)行時(shí), 明顯看到8核心的CPU,程序幾乎占用了4核心一半,GPU沒(méi)有使用
?在使用MPS運(yùn)行時(shí),CPU占比下降到較低水平,開始啟用GPU運(yùn)行,10核心的圖顯也僅僅使用了1顆,感覺(jué)加速不是特別明顯
3.2 溫度對(duì)比?
使用CPU運(yùn)行時(shí),常年保持40度以下的CPU溫度也飆升到了65度左右,及時(shí)如此也僅是window電腦靜默狀態(tài)的溫度了?
?使用MPS運(yùn)行時(shí),溫度稍有回落,在50度左右
3.3 運(yùn)行時(shí)間
如圖所示,MPS加速僅僅比CPU花費(fèi)時(shí)間減少一半左右,說(shuō)實(shí)話不是特別滿意,和cuda的加速還是有一定差距