在Linux环境下安装GPU版本的PyTorch需要以下步骤:
- 安装CUDA和cuDNN
首先需要安装CUDA和cuDNN,这是GPU版本PyTorch的基础。可以从NVIDIA官网下载对应版本的CUDA和cuDNN,也可以使用包管理器进行安装。
- 安装Anaconda
建议使用Anaconda进行Python环境管理。可以从Anaconda官网下载对应版本的Anaconda安装包,也可以使用包管理器进行安装。
- 创建虚拟环境
使用Anaconda创建一个新的虚拟环境,可以避免与其他Python环境产生冲突。可以使用以下命令创建一个名为“pytorch”的虚拟环境:
conda create --name pytorch python=3.8
- 激活虚拟环境
使用以下命令激活虚拟环境:
conda activate pytorch
- 安装PyTorch
使用以下命令安装GPU版本的PyTorch:
conda install pytorch torchvision torchaudio cudatoolkit=<version>
其中,<version>
是安装的CUDA版本号,例如11.1
。
- 测试安装
使用以下代码测试PyTorch是否安装成功:
import torch
print(torch.cuda.is_available())
如果输出为True,则表示PyTorch已经成功安装并可以使用GPU加速。
以下是两个示例说明:
示例1:使用GPU加速的PyTorch进行图像分类
数据集
我们将使用CIFAR-10数据集进行图像分类。该数据集包含10个类别的60000张32x32彩色图像。
模型搭建
我们将使用一个简单的卷积神经网络(CNN)模型来进行图像分类。该模型包含两个卷积层、两个池化层和两个全连接层。
import torch.nn as nn
class CNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)
self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
self.fc1 = nn.Linear(32 * 8 * 8, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = nn.functional.relu(self.conv1(x))
x = self.pool1(x)
x = nn.functional.relu(self.conv2(x))
x = self.pool2(x)
x = x.view(-1, 32 * 8 * 8)
x = nn.functional.relu(self.fc1(x))
x = self.fc2(x)
return x
model = CNN()
模型训练
我们将使用交叉熵损失函数和随机梯度下降(SGD)优化器进行模型训练。我们将模型训练10个epoch,并在每个epoch结束时计算训练集和测试集的准确率。
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 加载数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transforms.ToTensor())
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transforms.ToTensor())
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 训练模型
for epoch in range(10):
# 在训练集上训练模型
train_correct = 0
train_total = 0
for images, labels in train_dataset:
optimizer.zero_grad()
outputs = model(images.unsqueeze(0))
loss = criterion(outputs, labels.unsqueeze(0))
loss.backward()
optimizer.step()
_, predicted = torch.max(outputs.data, 1)
train_total += labels.size(0)
train_correct += (predicted == labels).sum().item()
# 在测试集上测试模型
test_correct = 0
test_total = 0
with torch.no_grad():
for images, labels in test_dataset:
outputs = model(images.unsqueeze(0))
_, predicted = torch.max(outputs.data, 1)
test_total += labels.size(0)
test_correct += (predicted == labels).sum().item()
# 打印准确率
print(f'Epoch {epoch+1}, Train Accuracy: {train_correct/train_total}, Test Accuracy: {test_correct/test_total}')
模型预测
我们使用训练好的模型来预测测试集中的图像,并将预测结果与实际结果进行比较。
import matplotlib.pyplot as plt
import numpy as np
# 预测测试集中的图像
with torch.no_grad():
images, labels = next(iter(test_dataset))
outputs = model(images.unsqueeze(0))
_, predicted = torch.max(outputs.data, 1)
# 绘制预测结果和实际结果的图像
plt.imshow(np.transpose(images.numpy(), (1, 2, 0)))
plt.title(f'Actual: {labels}, Predicted: {predicted.item()}')
plt.show()
示例2:使用GPU加速的PyTorch进行自然语言处理
数据集
我们将使用IMDB电影评论数据集进行情感分析。该数据集包含25000条电影评论,每条评论都被标记为正面或负面。
模型搭建
我们将使用一个简单的循环神经网络(RNN)模型来进行情感分析。该模型包含一个嵌入层、一个LSTM层和一个全连接层。
import torch.nn as nn
class RNN(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, 1)
def forward(self, x):
x = self.embedding(x)
x, _ = self.lstm(x)
x = self.fc(x[:, -1, :])
return x
model = RNN(vocab_size, embedding_dim, hidden_dim)
模型训练
我们将使用二元交叉熵损失函数和Adam优化器进行模型训练。我们将模型训练10个epoch,并在每个epoch结束时计算训练集和测试集的准确率。
import torch.optim as optim
import torchtext.datasets as datasets
import torchtext.data as data
# 定义数据集和数据处理
TEXT = data.Field(tokenize='spacy')
LABEL = data.LabelField(dtype=torch.float)
train_dataset, test_dataset = datasets.IMDB.splits(TEXT, LABEL)
TEXT.build_vocab(train_dataset, max_size=10000)
LABEL.build_vocab(train_dataset)
# 定义损失函数和优化器
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练模型
for epoch in range(10):
# 在训练集上训练模型
train_correct = 0
train_total = 0
for batch in data.BucketIterator(train_dataset, batch_size=32):
optimizer.zero_grad()
outputs = model(batch.text)
loss = criterion(outputs.squeeze(), batch.label)
loss.backward()
optimizer.step()
predicted = torch.round(torch.sigmoid(outputs))
train_total += batch.label.size(0)
train_correct += (predicted == batch.label).sum().item()
# 在测试集上测试模型
test_correct = 0
test_total = 0
with torch.no_grad():
for batch in data.BucketIterator(test_dataset, batch_size=32):
outputs = model(batch.text)
predicted = torch.round(torch.sigmoid(outputs))
test_total += batch.label.size(0)
test_correct += (predicted == batch.label).sum().item()
# 打印准确率
print(f'Epoch {epoch+1}, Train Accuracy: {train_correct/train_total}, Test Accuracy: {test_correct/test_total}')
模型预测
我们使用训练好的模型来预测测试集中的评论,并将预测结果与实际结果进行比较。
import spacy
# 加载Spacy模型
nlp = spacy.load('en_core_web_sm')
# 预测测试集中的评论
with torch.no_grad():
text, label = next(iter(test_dataset))
tokens = [token.text for token in nlp.tokenizer(text)]
indices = [TEXT.vocab.stoi[token] for token in tokens]
tensor = torch.LongTensor(indices).unsqueeze(0)
output = model(tensor)
predicted = torch.round(torch.sigmoid(output)).item()
# 绘制预测结果和实际结果的图像
print(f'Actual: {label}, Predicted: {predicted}')
print(text)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux环境下GPU版本的pytorch安装 - Python技术站