win10基于Intel® Arc™ A380 Graphics配置PyTorch深度学习环境
一、查看Intel® Arc™ A380 Graphics驱动
查看Intel® Arc™ A380 Graphics驱动是否安装成功
或者这个方法最快捷(推荐)
二、安装Anaconda
1. 下载Anaconda
https://www.anaconda.com/download/success?reg=skipped
2、安装之后配置环境变量
3、 测试conda是否可用
4、创建虚拟环境
conda create -n arc_ai python=3.10 conda activate arc_ai
三、安装配置Inter版本的pytorch
1、安装torch和torch-directml
这是整个流程的核心。你需要安装torch和torch-directml两个包
pip install torch torchvision torchaudio pip install torch-directml
2、测试torch是否可用
(1)快捷简单的测试
python -c "import torch; import torch_directml; device = torch_directml.device() if torch_directml.is_available() else 'cpu'; print(f'使用设备: {device}')"(2)标准测试
import torch import torch_directml def test_arc_gpu(): print("=" * 50) print("Intel Arc A380 深度学习环境测试") print("=" * 50) # 1. 检测设备 dml_device = torch_directml.device() print(f"✓ 检测到设备: {dml_device}") print(f" 设备类型: {type(dml_device)}") # 2. 测试基本运算(使用Float32) print("\n测试基本运算...") try: # 创建张量并移动到GPU x = torch.tensor([1.0, 2.0, 3.0, 4.0], dtype=torch.float32).to(dml_device) y = torch.tensor([5.0, 6.0, 7.0, 8.0], dtype=torch.float32).to(dml_device) # 执行基本运算 z = x + y result = z.cpu() # 移回CPU查看结果 print(f" x + y = {result.tolist()}") print("✓ 基本运算测试通过") except Exception as e: print(f"✗ 基本运算测试失败: {e}") return # 3. 测试矩阵运算 print("\n测试矩阵运算...") try: # 创建随机矩阵(Float32) matrix_a = torch.randn(3, 4, dtype=torch.float32).to(dml_device) matrix_b = torch.randn(4, 5, dtype=torch.float32).to(dml_device) # 矩阵乘法 matrix_c = torch.mm(matrix_a, matrix_b) print(f" 矩阵形状: {matrix_a.shape} × {matrix_b.shape} = {matrix_c.shape}") print("✓ 矩阵运算测试通过") except Exception as e: print(f"✗ 矩阵运算测试失败: {e}") # 4. 测试GPU内存信息 print("\nGPU内存信息:") try: # 分配一个较大的张量测试内存(约100MB) test_tensor = torch.randn(5000, 5000, dtype=torch.float32).to(dml_device) print(f" ✓ 成功分配 ~{test_tensor.numel() * 4 / 1024 / 1024:.1f} MB 显存") # 释放内存 del test_tensor print(" ✓ 内存释放成功") except Exception as e: print(f" ⚠ 内存分配测试: {e}") print("\n" + "=" * 50) print("测试完成!环境配置正常。") print("=" * 50) if __name__ == "__main__": test_arc_gpu()输出:
四、基于MNIST数据集的LeNet-5手写数字识别实现
1、源代码
lenet_minist_pytorch.py
import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset from torchvision import datasets, transforms from torch.utils.tensorboard import SummaryWriter import matplotlib.pyplot as plt import numpy as np import os from datetime import datetime # ==================== 配置设备 ==================== # NVIDIA检测方式 #device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # print(f"使用设备:{device}") import torch_directml # 正确的检测方式 if torch_directml.is_available(): device = torch_directml.device() print(f"使用设备: {device} (Intel Arc GPU via DirectML)") else: device = torch.device("cpu") print("使用设备: CPU") # ==================== 配置日志目录 ==================== log_dir = "runs/lenet_mnist/" + datetime.now().strftime("%Y%m%d-%H%M%S") os.makedirs(log_dir, exist_ok=True) writer = SummaryWriter(log_dir) # ==================== 数据预处理和加载 ==================== print("加载 MNIST 数据集...") transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=128, shuffle=False) # ==================== 构建 LeNet 模型 ==================== class LeNet(nn.Module): def __init__(self): super(LeNet, self).__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=5, padding=2) self.pool1 = nn.AvgPool2d(2) self.conv2 = nn.Conv2d(6, 16, kernel_size=5) self.pool2 = nn.AvgPool2d(2) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) self.relu = nn.ReLU() def forward(self, x): x = self.pool1(self.relu(self.conv1(x))) x = self.pool2(self.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.fc3(x) return x model = LeNet().to(device) print(model) # ==================== 损失函数和优化器 ==================== criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # ==================== 训练函数 ==================== def train_epoch(model, loader, criterion, optimizer, epoch, writer): model.train() running_loss = 0.0 correct = 0 total = 0 for batch_idx, (data, target) in enumerate(loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() running_loss += loss.item() _, predicted = output.max(1) total += target.size(0) correct += predicted.eq(target).sum().item() avg_loss = running_loss / len(loader) accuracy = 100.0 * correct / total # 记录到 TensorBoard writer.add_scalar('Loss/train', avg_loss, epoch) writer.add_scalar('Accuracy/train', accuracy, epoch) return avg_loss, accuracy # ==================== 测试函数 ==================== def test(model, loader, criterion, epoch, writer): model.eval() test_loss = 0.0 correct = 0 total = 0 with torch.no_grad(): for data, target in loader: data, target = data.to(device), target.to(device) output = model(data) test_loss += criterion(output, target).item() _, predicted = output.max(1) total += target.size(0) correct += predicted.eq(target).sum().item() avg_loss = test_loss / len(loader) accuracy = 100.0 * correct / total # 记录到 TensorBoard writer.add_scalar('Loss/test', avg_loss, epoch) writer.add_scalar('Accuracy/test', accuracy, epoch) return avg_loss, accuracy # ==================== 可视化测试集前 5 张图片到 TensorBoard ==================== def visualize_test_images(model, test_dataset, writer, epoch, num_images=5): model.eval() # 获取前 5 张测试图片 images = [] labels = [] predictions = [] confidences = [] with torch.no_grad(): for i in range(num_images): img, label = test_dataset[i] img_tensor = img.unsqueeze(0).to(device) output = model(img_tensor) prob = torch.softmax(output, dim=1) pred = prob.max(1)[1].item() conf = prob.max(1)[0].item() * 100 images.append(img) labels.append(label) predictions.append(pred) confidences.append(conf) # 1. 记录原始图片到 TensorBoard img_grid = torch.stack(images) writer.add_images('Test_Images/Original', img_grid, epoch) # 2. 记录每张图片的预测信息(文本) for i in range(num_images): status = "✓" if predictions[i] == labels[i] else "✗" text = f"Image{i+1}: Pred={predictions[i]}, True={labels[i]}, Conf={confidences[i]:.2f}% {status}" writer.add_text(f'Test_Images/Prediction_{i}', text, epoch) # 3. 创建组合图片(带预测标签) fig, axes = plt.subplots(1, num_images, figsize=(15, 3)) if num_images == 1: axes = [axes] for i, ax in enumerate(axes): ax.imshow(images[i].squeeze().cpu().numpy(), cmap='gray') color = 'green' if predictions[i] == labels[i] else 'red' title = f"prediect:{predictions[i]}\ntruth:{labels[i]}\n{confidences[i]:.1f}%" ax.set_title(title, color=color, fontsize=9) ax.axis('off') plt.tight_layout() writer.add_figure('Test_Images/Combined_Predictions', fig, epoch) plt.close(fig) # 4. 记录预测概率分布 with torch.no_grad(): for i in range(num_images): img_tensor = images[i].unsqueeze(0).to(device) output = model(img_tensor) prob = torch.softmax(output, dim=1).cpu().numpy()[0] writer.add_histogram(f'Test_Images/Probabilities_{i}', prob, epoch) print(f"\n✅ 已保存前 {num_images} 张测试图片到 TensorBoard") # ==================== 训练模型 ==================== print("\n开始训练模型...") num_epochs = 5 for epoch in range(num_epochs): train_loss, train_acc = train_epoch(model, train_loader, criterion, optimizer, epoch, writer) test_loss, test_acc = test(model, test_loader, criterion, epoch, writer) print(f'Epoch {epoch+1}/{num_epochs}') print(f' Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.2f}%') print(f' Test Loss: {test_loss:.4f}, Test Acc: {test_acc:.2f}%') # ==================== 可视化测试集前 5 张图片 ==================== print("\n生成测试集可视化...") visualize_test_images(model, test_dataset, writer, epoch=num_epochs, num_images=5) # ==================== 记录模型结构和参数 ==================== # 添加模型图到 TensorBoard dummy_input = torch.randn(1, 1, 28, 28).to(device) writer.add_graph(model, dummy_input) # 记录模型参数直方图 for name, param in model.named_parameters(): writer.add_histogram(name, param.cpu().detach().numpy(), num_epochs) # ==================== 关闭 TensorBoard 写入器 ==================== writer.close() print(f"\n✅ 训练完成!日志保存至:{log_dir}") print("\n📊 启动 TensorBoard:") print(f" tensorboard --logdir={log_dir}") print("\n🌐 浏览器访问:http://localhost:6006") print("\n📁 在 TensorBoard 中查看:") print(" - SCALARS → 训练/测试 loss 和 accuracy 曲线") print(" - IMAGES → 前 5 张测试图片") print(" - FIGURES → 带预测标签的组合图") print(" - TEXT → 预测详情") print(" - HISTOGRAMS → 参数和概率分布") print(" - GRAPHS → 模型结构图")2、安装部分依赖(可能)
pip3 install matplotlib
pip3 install tensorboard
3、运行
可能会报错:
因为 TensorBoard 的add_graph方法在追踪模型时,会自动将模型参数转换为 Double (Float64) 类型,但 Arc A380 不支持双精度运算。
解决方法:
注释:
dummy_input = torch.randn(1, 1, 28, 28).to(device)
writer.add_graph(model, dummy_input)
可以看到,显卡在运行:
另起一个cmd窗口,启动tensorboard ,执行:
tensorboard --logdir=runs/lenet_mnist/
在浏览器上输入:http://localhost:6006/
