2024年12月8日 星期日

[文章轉貼] PyTorch GPU加速指南:如何使用CUDA進行基本操作

文章轉自微信公眾號:阿旭演算法與機器學習

文章原始連結:https://mp.weixin.qq.com/s/OJ1_S0b39VIr7_4kfn5Yaw

引言

CUDA(Compute Unified Device Architecture)是NVIDIA專有的平行運算平台和程式設計模型。使用CUDA SDK,開發人員可以利用他們的NVIDIA GPU(圖形處理單元),從而使他們能夠在通常的程式設計工作流程中引入基於GPU的平行處理能力,而不是通常的基於CPU的順序處理能力。

隨著近年來深度學習的興起,可以看到模型訓練中涉及的各種運算,如矩陣乘法,求逆等,可以在很大程度上並行化,以獲得更好的學習表現和更快的訓練週期。因此,許多像Pytorch這樣的深度學習函式庫使用戶能夠使用一組介面和實用程式函數來利用GPU。本文將介紹在任何包含支援CUDA的GPU的系統中設定CUDA環境,並簡要介紹使用Python的Pytorch庫中提供的各種CUDA操作。

查看GPU支援的CUDA版本

在cmd控制台輸入navidia-smi查看GPU支援的最高CUDA版本:




如上圖所示,最高支援的CUDA版本為12.5,版本可以向下相容。因此安裝的CUDA版本必須小於或等於12.5版本。

安裝GPU版Pytorch

首先,透過官方Nvidia CUDA相容性清單檢查其係統的GPU,以確保其GPU是否啟用CUDA。 Pytorch透過提供一個很好的使用者友善介面,讓您選擇作業系統和其他要求,讓CUDA安裝過程非常簡單,如下圖所示。根據我們的計算機,我們將根據下圖中給出的規格進行安裝。

參考Pytorch的官方連結:https://pytorch.org/get-started/locally/,根據他們的電腦規格選擇規格。我們還建議在安裝後完全重新啟動系統,以確保工具包的正常運作。




Pytorch安裝頁面截圖

pip3 install torch==1.9.0+cu102 torchvision==0.10.0+cu102 torchaudio=0.9.0 -f https://download.pytorch.org/whl/torch_stable.html

在Pytorch中開始使用CUDA

安裝後,我們可以使用torch.cuda介面使用Pytorch與CUDA互動。我們將使用以下函數:

文法:

  1. torch.version.cuda() :傳回目前安裝的軟體包的CUDA版本
  2. torch.cuda.is_available():如果您的系統支援CUDA,則傳回True,否則傳回False
  3. torch.cuda.current_device():傳回目前裝置的ID
  4. torch.cuda.get_device_name(device_ID):傳回ID = 'device_ID'的CUDA裝置的名稱

代碼:

import torch

print(f"CUDA是否可用? {torch.cuda.is_available()}")
print(f"当前CUDA 版本: {torch.version.cuda}")

# Storing ID of current CUDA device
cuda_id = torch.cuda.current_device()
print(f"当前CUDA ID:{torch.cuda.current_device()}")

print(f"CUDA设备名称:{torch.cuda.get_device_name(cuda_id)}")

輸出:



使用CUDA處理張量

為了透過CUDA互動Pytorch張量,我們可以使用以下實用函數:

文法:

  • tensor.device:傳回「Tensor」所在的裝置名稱
  • Tensor.to(device_name):傳回「device_name」指定的裝置上的「Tensor」的新實例:「cpu」表示CPU,「cuda」表示支援CUDA的GPU
  • tensor.cpu():將「Tensor」從目前裝置傳輸到CPU

為了示範上述函數,我們將建立一個測試張量並執行以下操作:

檢查張量的目前設備並應用張量操作(平方),將張量傳輸到GPU並應用相同的張量操作(平方),並比較2個設備的結果。

代碼:

import torch

# Creating a test tensor
x = torch.randint(1100, (100100))

# Checking the device name:
# Should return 'cpu' by default
print(x.device)

# Applying tensor operation
res_cpu = x ** 2

# Transferring tensor to GPU
x = x.to(torch.device('cuda'))

# Checking the device name:
# Should return 'cuda:0'
print(x.device)

# Applying same tensor operation
res_gpu = x ** 2

# Checking the equality
# of the two results
assert torch.equal(res_cpu, res_gpu.cpu())

輸出:

cpu
cuda : 0

使用CUDA處理深度學習模型

一個好的Pytorch實踐是產生與裝置無關的程式碼,因為某些系統可能無法存取GPU,只能依賴CPU,反之亦然。完成後,可以使用以下函數將任何機器學習模型傳輸到所選設備上

用法: Model.to(device_name):

傳回:「device_name」指定的裝置上的機器學習「Model」的新實例:「cpu」表示CPU,「cuda」表示啟用CUDA的GPU

在本例中,我們從torchvision.models實用程式匯入預先訓練的Resnet-18模型,讀者可以使用相同的步驟將模型傳輸到所選設備。

代碼:

import torch
import torchvision.models as models

# Making the code device-agnostic
device = 'cuda' if torch.cuda.is_available() else 'cpu'

# Instantiating a pre-trained model
model = models.resnet18(pretrained=True)

# Transferring the model to a CUDA enabled GPU
model = model.to(device)