Pytorch | GPU | 将代码加载到GPU上运行

本文详细介绍了如何在PyTorch中利用GPU进行深度学习计算,包括如何将模型和数据迁移到GPU,以及如何使用torch.nn.DataParallel进行多GPU并行计算。同时,针对DataParallel默认占用GPU0的问题,提供了解决方案,通过设置环境变量来指定GPU设备。此外,还提及了DistributedDataParallel作为进一步的学习方向。
部署运行你感兴趣的模型镜像

Pytorch | GPU | 将代码加载到GPU上运行


“I think if you do something and it turns out pretty good, then you should go do something else wonderful, not dwell on it for too long. Just figure out what’s next.”
——Steve Jobs


❤️流程

  • 声明用GPU(指定具体的卡)
  • 将模型(model)加载到GPU上
  • 把数据和标签放到GPU上

使用GPU的过程中离不开torch.device()

什么是torch.device()?

A torch.device is an object representing the device on which a torch.Tensor is or will be allocated. 就是装torch.Tensor的一个地方。

声明用GPU(指定具体的卡)

device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')

'cuda' 这里如果没有指定具体的卡号,那么系统默认cuda:0
或者:
如果使用pycharm,程序的运行路径填的就是服务器上的路径,默认torch.cuda.is_available() = Ture,那么就可以省略后面的判断语句。下面的例子是使用了2号卡(从0开始计数)。

device = torch.device('cuda:2')

将模型(model)加载到GPU上

model = resnet19()	#例子中,采用resnet模型
model.to(device)

把数据和标签放到GPU上

data, target = data.to(device), target.to(device)

❤️在多卡上并行计算

  • 方法1:torch.nn.DataParallel()
    torch.nn.DataParallel()具体的过程:大体就是将模型加载的每个卡上,数据平均分到每个卡上,原则上保证batch_size大于卡的数目就行。

      device = torch.device('cuda:2') #device = torch.device("cuda:1" if use_cuda else "cpu")  
      model = resnet19()  
      if torch.cuda.device_count() > 1: #10 
          print(torch.cuda.device_count())  
          model = nn.DataParallel(model, device_ids = [2,3,4])
      model.to(device)   
    

    这段代码运行之后占用的GPU是:0,2,3,4。为什么会占用0??我感到很神奇!!!原来:The parallelized module must have its parameters and buffers on device_ids[0] before running this DataParallel module. 就是说,即使我指定的卡没有0卡,他也会在0卡里面放参数和缓存。
    如何避免这种现象呢?
    改变默认的device_ids[0]指向的卡。默认device_ids[0]指向的就是0卡,只需要通过环境变量,让device_ids[0]指向其他卡片即可。

    os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
    os.environ["CUDA_VISIBLE_DEVICES"] = "2, 3, 4"	#仅有2,3,4(物理上)卡对程序可见,对应的逻辑上的卡号就算0,1,2
    	    ......
    device = torch.device('cuda') #device = torch.device("cuda:1" if use_cuda else "cpu")  
    model = resnet19()  
    if torch.cuda.device_count() > 1: #10 
        print(torch.cuda.device_count())  
        model = nn.DataParallel(model, device_ids = [0,1,2])
    model.to(device)   
    
  • distributedDataparallel
    没有用过,之后学习一下。 参考

参考

参考1
参考2

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>嗯,用户现在想了解如何使用GPU运行PyTorch代码。我之前已经回答过关于云服务器运行代码的问题,现在需要针对GPUPyTorch进行具体指导。首先,我需要确认用户的基本需求:他们可能已经熟悉了在云服务器上运行代码的基本步骤,但现在需要利用GPU加速PyTorch任务,比如深度学习模型训练。 用户可能的背景是研究人员、学生或者开发者,正在尝试进行机器学习项目,但遇到了需要GPU加速的情况。他们可能不太清楚如何检查GPU是否可用,如何安装合适的驱动和CUDA,或者在代码中如何正确使用GPU。此外,他们可能对云服务提供商的选择和配置也不熟悉,特别是在GPU实例方面。 接下来,我需要考虑回答的结构。先概述使用GPU的重要性,然后分步骤详细说明,包括硬件准备、环境配置、代码修改、监控和维护等。同时,需要包含常见问题解答,比如安装失败、CUDA版本不兼容等问题。还要注意提醒用户选择合适的云服务商,特别是GPU实例的创建和管理,因为这部分在之前的回答中已经涉及过云服务器的基本操作,可能需要更具体的指导。 需要确保回答的步骤清晰,命令准确,特别是PyTorch的安装命令,不同CUDA版本对应的安装命令不同,容易出错。此外,代码示例要展示如何将模型和数据转移到GPU上,以及如何设置多GPU训练。可能还需要提到环境隔离,比如使用conda或virtualenv,避免依赖冲突。 另外,用户可能会遇到GPU内存不足的情况,需要指导如何监控GPU使用情况,以及如何处理内存问题,比如调整批次大小。安全方面,虽然之前提到了防火墙和密钥管理,但在GPU实例中可能还需要注意额外的安全组设置,比如开放Jupyter Notebook的端口。 最后,总结关键点,强调环境配置、代码调整和资源监控的重要性,并提示进一步学习的资源,如官方文档和社区支持。需要保持语言简洁,技术细节准确,同时避免过于冗长,确保用户能逐步跟随操作解决问题。</think>--- ### **使用 GPU 运行 PyTorch 代码完整指南** --- #### **一、核心原理** PyTorch 通过 **CUDA** 框架调用 NVIDIA GPU 加速计算,需满足以下条件: 1. **硬件**:NVIDIA 显卡(如 RTX 3090、A100 等) 2. **软件**:正确安装 GPU 驱动 + CUDA 工具包 + PyTorch GPU 版本 3. **代码**:显式指定数据与模型在 GPU运行 --- #### **二、详细操作步骤** --- ##### **1. 硬件与云服务准备** - **本地 GPU**: - 确认显卡支持 CUDA(查看 [NVIDIA CUDA 兼容列表](https://developer.nvidia.com/cuda-gpus)) - 显存 ≥ 4GB(低于此容量可能无法运行复杂模型) - **云服务器 GPU 实例**: - **推荐平台**:AWS EC2(如 `p3.2xlarge`)、Google Cloud(`n1-standard-4 + Tesla T4`)、阿里云(`GN6i`) - **镜像选择**:优先使用预装 CUDA 的镜像(如 `Ubuntu 20.04 + CUDA 11.8`) --- ##### **2. 环境配置** - **步骤 1:安装 NVIDIA 驱动**(本地 GPU 需手动安装,云服务器通常预装) ```bash # Ubuntu 示例 sudo apt install nvidia-driver-535 reboot ``` - **步骤 2:安装 CUDA 工具包** ```bash # 从 NVIDIA 官网下载对应版本(需匹配 PyTorch 要求) wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run ``` - **步骤 3:安装 PyTorch GPU 版本** ```bash # 通过 PyTorch 官网生成对应命令(需匹配 CUDA 版本) # 示例:CUDA 11.8 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 ``` --- ##### **3. 验证 GPU 可用性** - **检查驱动与 CUDA**: ```bash nvidia-smi # 查看 GPU 状态(输出应包含 GPU 型号和 CUDA 版本) ``` - **在 Python 中验证**: ```python import torch print(torch.cuda.is_available()) # 输出 True 表示 GPU 可用 print(torch.cuda.get_device_name(0)) # 显示第 0 号 GPU 型号 ``` --- ##### **4. 代码适配 GPU** - **将数据与模型移动到 GPU**: ```python device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 模型迁移 model = YourModel().to(device) # 数据迁移 inputs = inputs.to(device) labels = labels.to(device) ``` - **使用 `torch.cuda` 加速**: ```python with torch.cuda.amp.autocast(): # 混合精度训练(节省显存) outputs = model(inputs) loss = criterion(outputs, labels) ``` --- ##### **5. 多 GPU 并行训练** - **DataParallel(单机多卡)**: ```python model = torch.nn.DataParallel(model, device_ids=[0, 1]) # 使用 GPU 0 和 1 ``` - **DistributedDataParallel(跨机器多卡)**: ```python torch.distributed.init_process_group(backend='nccl') model = torch.nn.parallel.DistributedDataParallel(model) ``` --- ##### **6. 监控与优化** - **实时监控 GPU 使用**: ```bash watch -n 1 nvidia-smi # 每秒刷新 GPU 状态 ``` - **减少显存占用技巧**: - 降低 `batch_size` - 使用 `torch.utils.checkpoint`(梯度检查点技术) - 清理缓存:`torch.cuda.empty_cache()` --- #### **三、常见问题与解决** 1. **`CUDA out of memory`**: - 检查 `batch_size` 是否过大 - 使用 `torch.cuda.empty_cache()` 释放未使用的缓存 2. **PyTorch 无法检测到 GPU**: - 确认 PyTorch 版本与 CUDA 版本匹配 - 运行 `nvcc --version` 检查 CUDA 安装 3. **多卡训练速度未提升**: - 检查数据加载是否成为瓶颈(使用 `DataLoader` 的 `num_workers` 参数) - 确保数据在 GPU 之间均匀分配 --- #### **四、核心公式** $$ \text{GPU加速比} = \frac{\text{CPU单核计算时间}}{\text{GPU计算时间}} \times \text{并行效率} $$ --- #### **五、总结** - **关键步骤**: 1. 确保硬件与驱动支持 CUDA 2. 安装匹配的 PyTorch GPU 版本 3. 显式迁移模型和数据到 GPU 4. 监控显存使用并优化 - **进阶优化**: - 混合精度训练(`amp` 模块) - 使用 `torch.profiler` 分析性能瓶颈 - **文档参考**: - [PyTorch 官方 GPU 指南](https://pytorch.org/docs/stable/notes/cuda.html) - [NVIDIA CUDA 工具包文档](https://docs.nvidia.com/cuda/)
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值