ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AMD显卡Windows下跑PyTorch:DirectML部署实战指南

AMD显卡Windows下跑PyTorch:DirectML部署实战指南 AMD显卡用户想跑深度学习最头疼的问题就是Windows下环境怎么搭都不顺。相比NVIDIA的CUDA生态A卡在Windows上确实像个后妈养的孩子——很多框架要么不支持要么性能差一截逼得不少人只能装双系统去折腾Linux。不过这两年微软主推的DirectML给了AMD用户一条不错的出路PyTorch-DirectML就是其中一个非常实用的方案。这篇文章就带你一步步在Windows 10/11上部署带GPU支持的PyTorch环境让手上的AMD显卡真正跑起来。1. 为什么选PyTorch-DirectMLAMD显卡在Windows下的现实困局1.1 CUDA一统天下的背景下A卡用户被冷落接触深度学习的人都知道PyTorch和TensorFlow默认拿NVIDIA显卡做训练和推理原因就三个字CUDA。CUDA是NVIDIA自己的并行计算平台几乎所有深度学习框架都优先支持它。哪怕你现在用AMD显卡大概率也会被各种教程默认劝退——网上搜“PyTorch GPU安装”十个教程里九个都是教装CUDA、cuDNN的剩下一个还是用NVIDIA显卡。AMD用户不是没有算力而是被生态排挤了。RX 7000系列、RX 6000系列甚至RX 5000系列的显卡在游戏中表现很能打显存往往也比同价位N卡给得大方可是一到深度学习场景就瞬间变成了“鸡肋”。你想用PyTorch做点图像分类的练习折腾半天装好CPU版本跑一个ResNet训练等得人心态崩溃。想调用GPU却发现根本没有可用的官方后端——这就是AMD卡在Windows上的真实处境。我当初也是被这个问题折磨了好久。手里一张Radeon RX 7900 XTX显存24GB跑游戏爽得飞起可一碰深度学习就只能看着CPU风扇狂转心里特别憋屈。后来我花了一个周末试遍了各种方案最终发现PyTorch-DirectML是当时最稳妥、也最接近“开箱即用”的选择。1.2 DirectML不用CUDA也能调用GPU加速DirectML是微软推出的硬件加速API它最大的特点是硬件无关——只要你的设备支持DirectX 12不管显卡是NVIDIA、AMD还是Intel都能通过DirectML调用GPU进行通用计算。PyTorch-DirectML就是微软官方维护的PyTorch后端把PyTorch的运算映射到DirectML上执行相当于给PyTorch装了一个“万能翻译引擎”。这个方案的好处很明显不需要CUDA工具包不需要cuDNN不需要额外装什么运行时依赖。你只需要装好显卡驱动和Python环境然后pip install torch-directml就能在AMD显卡上跑PyTorch了。对于只是想跑跑深度学习模型、做做实验的人来说这几乎是最省心的路径。当然DirectML也不是万能的它有一些局限性后面我会详细说。但至少它把“AMD显卡能不能在Windows下跑PyTorch”这个问题从“完全不行”变成了“能跑性能看场景”。1.3 几个可用方案的取舍WSL2、ROCm与PyTorch-DirectML在Windows下让AMD显卡跑深度学习其实不止一条路我简单列一下当时考虑过的几个方案大家可以对照自己的情况选方案适用显卡安装难度性能表现备注WSL2 ROCm部分AMD显卡较高接近原生Linux需要显卡支持ROCm且Windows版本有限制Linux双系统 ROCm部分AMD显卡较高接近原生Linux需要额外装系统PyTorch-DirectML几乎所有DX12显卡低比CUDA差一些微软官方维护Windows原生我选择PyTorch-DirectML首先是因为安装方便不用动系统分区其次它支持几乎所有支持DX12的AMD显卡就连老一点的RX 500系列都能跑。虽然性能可能不如在Linux下用ROCm但胜在省心适合初学者或只想快速跑通代码的人。2. 部署前的准备工作驱动、Python与显卡状态确认2.1 更新AMD显卡驱动第一优先级在安装PyTorch-DirectML之前我最想提醒你的就是一定先更新显卡驱动。DirectML依赖DirectX 12而AMD的驱动一直对DirectX 12的支持不断优化旧驱动很可能导致初始化失败或者运行时报错。你可以通过两种方式更新驱动一是去AMD官网自动检测二是在设备管理器里手动检查更新。我自己的经验是AMD官网的Adrenalin软件最靠谱它在后台会自动识别显卡型号并提示最新驱动。装好后可以用dxdiag命令打开DirectX诊断工具在“显示”标签页确认驱动版本和DirectX版本是否为12。只要驱动是近几年发布的正式版基本都没有问题。注意不需要额外安装CUDA或cuDNNPyTorch-DirectML自己会处理底层依赖别给自己找麻烦。2.2 Python环境搭建推荐用AnacondaPyTorch-DirectML是个Python库所以Python环境是必须的。我建议直接安装Anaconda它自带conda包管理器方便创建隔离环境。如果你已经有Python环境也完全可以继续用但用conda能减少很多坑。创建环境的命令很简单conda create -n amd_dl python3.9 conda activate amd_dl这里我特意选了Python 3.9因为它是PyTorch-DirectML官方测试比较充分的版本。虽然更高版本的Python也不是不能用但为了减少莫名其妙的兼容性问题建议还是用3.9。如果你对conda不熟悉也可以用venv但注意venv在Windows上对某些依赖库的处理不如conda干净。2.3 确认你的显卡在支持列表里PyTorch-DirectML对显卡的要求不高但最好先确认一下自己的显卡支持DirectX 12。一个快速检查方法按下WinR输入dxdiag回车在“显示”标签页查看“DirectX功能”一栏如果有“DirectX 12”字样那就说明可以支持。AMD绝大多数显卡都支持比如RX 6000系列、RX 5000系列、RX Vega系列甚至老的R9 300系列都行。Intel的核显一般也支持但性能会弱很多。如果你不确定也可以到微软的DirectML文档里查支持列表或者直接用一段简单的测试代码跑跑看能跑通就说明没问题。3. 从零安装PyTorch-DirectML实操步骤讲解3.1 安装过程一个pip命令搞定激活环境后安装PyTorch-DirectML只需要一条命令pip install torch-directml这个包会依赖安装PyTorch的CPU版本以及DirectML相关的DLL文件。我特别提醒一下这时候不要在同一个环境里再装普通的torch或torchvision因为它们会和torch-directml产生冲突导致调用时不明不白报错。如果网络比较慢或者总是下载失败可以用国内镜像源pip install torch-directml -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后可以用下面的命令确认安装是否成功pip list | findstr torch正常会看到torch、torch-directml等包版本号应当与PyTorch 1.13或2.x系列对应。我装的是torch-directml 0.2.5对应PyTorch 2.0.1总之能装上就行。3.2 验证GPU是否真的能用一个简单的设备检查安装完成后第一件事就是确认PyTorch能不能看到AMD显卡。在Python里输入以下代码import torch import torch_directml # 输出可用设备数量 print(可用设备数量:, torch_directml.device_count()) # 获取第一个设备对象 dml_device torch_directml.device() print(当前设备名称:, torch_directml.device_name(0))如果输出类似“可用设备数量: 1”并且设备名称显示你的显卡型号比如AMD Radeon RX 7900 XTX那就说明环境已经通了。接着可以做一个更实际的测试用GPU跑一个矩阵运算import torch import torch_directml device torch_directml.device() a torch.randn(1000, 1000, devicedevice) b torch.randn(1000, 1000, devicedevice) c torch.mm(a, b) print(矩阵结果:, c.mean().item())这一步能跑通就说明Tensor数据已经可以在GPU上计算了。如果报错八成是驱动或版本兼容性问题下文我会专门说排查方法。3.3 跑一个真实的小模型用MNIST练手光跑矩阵运算还不够建议你用一个标准的MNIST分类模型做完整训练验证整个链路是否稳定。这里我贴一段我实际跑通的代码片段只演示核心部分数据集可以用torchvision.datasets.MNIST但注意torch-directml目前对torchvision的兼容性有些版本限制我建议只使用核心数据加载部分。import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split import torch_directml # 使用sklearn自带的手写数字数据集避免额外下载 from sklearn.preprocessing import StandardScaler device torch_directml.device() # 加载数据并转换为张量 digits load_digits() X_train, X_test, y_train, y_test train_test_split( digits.data, digits.target, test_size0.2, random_state42 ) scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) X_train_t torch.tensor(X_train, dtypetorch.float32, devicedevice) y_train_t torch.tensor(y_train, dtypetorch.long, devicedevice) X_test_t torch.tensor(X_test, dtypetorch.float32, devicedevice) y_test_t torch.tensor(y_test, dtypetorch.long, devicedevice) train_dataset TensorDataset(X_train_t, y_train_t) test_dataset TensorDataset(X_test_t, y_test_t) train_loader DataLoader(train_dataset, batch_size32, shuffleTrue) test_loader DataLoader(test_dataset, batch_size32) # 简单全连接网络 model nn.Sequential( nn.Linear(64, 128), nn.ReLU(), nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 10) ).to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) # 训练5个epoch for epoch in range(5): running_loss 0.0 for batch_x, batch_y in train_loader: optimizer.zero_grad() output model(batch_x) loss criterion(output, batch_y) loss.backward() optimizer.step() running_loss loss.item() print(fEpoch {epoch1} loss: {running_loss/len(train_loader):.4f}) # 测试 correct 0 total 0 with torch.no_grad(): for batch_x, batch_y in test_loader: output model(batch_x) _, predicted torch.max(output, 1) total batch_y.size(0) correct (predicted batch_y).sum().item() print(fAccuracy: {correct/total:.4f})这段代码跑通后你的AMD显卡就已经真正参与深度学习了。我建议你观察一下训练过程中任务管理器里GPU的负载变化应该能看到GPU利用率明显提升。4. 常见问题与排查技巧实录4.1 常见错误Device not found、CUDA错误和初始化失败在部署过程中我踩过很多坑这里整理一下最常见的错误和解决思路错误现象可能原因排查方法DML device not found显卡驱动太旧或DX12不支持更新驱动并检查银行显卡是否支持DX12Torch not compiled with CUDA enabled误装了普通PyTorch版本只安装torch-directml不要装原版torchModuleNotFoundError: No module named torch_directml安装环境选错或包未安装重新执行pip install torch-directml并确认环境训练时GPU利用率忽高忽低数据加载或CPU参与计算过多确保张量都在GPU设备上避免tensor.cpu()混用系统提示DLL加载失败缺少VC运行库或旧版DirectX安装最新版Visual C Redistributable和DirectX运行库尤其要注意最后一种Windows系统常见的DLL报错大多是因为系统缺少Visual C Redistributable包。去微软官网下载并安装最新版很多莫名其妙的问题都能解决。4.2 DirectML的性能局限与优化建议PyTorch-DirectML主要面向“能跑”和“够用”在性能上和原生CUDA差距还是存在的。我用同样的模型在NVIDIA RTX 3060和AMD RX 6600上对比过训练速度大概差20%到30%但这已经比CPU快出好几倍了。对于学习和中小规模的实验来说完全够用。如果你想尽量提升性能我有几个个人经验优先使用小批量数据训练不要盲目加大batch sizeDirectML在较大batch时性能损耗会更明显尽量让所有操作都在GPU上完成包括数据预处理、损失函数计算使用torch_directml.device()后把模型和数据都.to(device)不要轻易切回CPU混合精度训练在DirectML上支持有限如果用torch.cuda.amp那一套很可能报错或不加速建议暂时关闭。4.3 踩坑实录那些脚本里不会告诉你的事我在这过程中也遇到了一些不算报错但很影响体验的问题分享出来给大家避坑。首先是环境隔离问题。我之前在一个conda环境里先装过普通PyTorch后来又装了torch-directml结果无论如何都调不到GPU最后只能新建环境重装才解决。所以建议你从一开始就用独立环境别图省事。其次是分支版本问题。torch-directml更新速度慢它的API是模仿PyTorch 1.13和2.0时代的接口。如果你写代码时用的是新版PyTorch的写法有些地方可能不兼容比如torch.distributed等模块就用不了。我建议把代码里依赖分布式、多卡相关的部分去掉专心做单卡单模型。还有一个很隐蔽的问题是任务管理器GPU使用率显示异常。AMD显卡在任务管理器里显示的“3D引擎”使用率往往远高于“计算”使用率但PyTorch-DirectML实际使用的是另一个模块。如果你发现GPU占用率看起来不高但训练速度确实快了不少那就说明它确实在跑只是显示不准确而已。最后再分享一个我自己实践总结的小技巧如果训练过程中GPU显存看起来不够用直接加虚拟内存往往比调小模型更好使。Windows的DirectML有额外适配层把虚拟内存设置大一点可以在大模型场景下减少崩溃概率。我一般会把系统虚拟内存至少设置为16GB以上尤其是显存不够跑稍大一点的模型时。5. 把这个环境用起来你还能做什么环境搭好之后不只是能跑MNIST这种玩具级模型。你可以用它跑图像分类、目标检测、语义分割等常见任务只要代码里没有强行调用CUDA的特定扩展模块。比如YOLOv5用torch.hub加载配合PyTorch-DirectML也能跑推理只是部分自定义算子可能不兼容需要改几行代码。我试过用AMD RX 6700 XT跑YOLOv5s推理速度比CPU至少快5倍虽然比CUDA慢但已经比纯CPU流畅太多了。你还可以在本地跑文本生成、语音识别等场景。当前很多大模型推理框架走的还是CUDA路线但通过DirectML适配的推理引擎也越来越多。如果你手头的模型是PyTorch格式完全可以在自己的代码里替换设备选择直接调用AMD显卡。我个人在实际操作中的体会是PyTorch-DirectML最大的意义不是性能多强而是把“AMD显卡不能跑深度学习”这件事变成了“至少能跑、能调、能学”。对于刚入门深度学习或者只是想在自己电脑上做点小实验的人来说它绝对是最低门槛的方案。踩过几次坑之后我现在已经能在半小时内从一个干净系统装完全套环境希望这篇文章也能帮你少走这些弯路。
返回列表