《PyTorch面试精华》


1 前言
    1.1  PyTorch安装

    1.2  显卡驱动的困惑

    1.3  CUDA安装注意事项

    1.4  cuDNN的介绍

    1.5  Pytorch Lightning介绍

    1.6  PyTorch学习之道

    1.7  PyTorch快速入门

    1.8  PyTorch调参之道

    1.9  PyTorch调参套件

    1.10  手动创建虚拟环境

2 深度学习之数学基础
    2.1  希腊字母解读

    2.2  梯度的物理意义

    2.3  图解梯度下降法

    2.4  图解梯度上升法

    2.5  自然梯度

    2.6  泰勒公式的介绍

    2.7  信息与信息熵

    2.8  重要性采样

    2.10  欧几里得范数

    2.11  特征值和特征向量

    2.12  似然函数的理解

    2.13  矩阵秩的深刻理解

3 PyTorch入门疑难点
4 PyTorch全局设置
    4.1  全局设置当前设备

    4.2  全局设置浮点精度

5 PyTorch GPU分布式训练
    5.1  PyTorch GPU基础操作

    5.2  DataParallel用法详解

    5.3  GPU分布式训练模型

    5.4  CUDA_VISIBLE_DEVICES

    5.5  device详细说明

    5.6  to(device)和.cuda()

    5.7  CUDA设备索引

    5.8  GPU设备索引

6 向量的基础与核心
    6.1  Tensor的组成与存储

    6.2  Tensor的grad属性

    6.4  Tensor的叠加

    6.5  禁用梯度计算

    6.6  向量的保存和加载

    6.7  参数向量

    6.8  叶子节点

    6.9  detach原理

    6.10  requires_grad属性

    6.11  Tensor与Numpy互换

    6.12  张量cat操作

    6.13  零维张量

    6.15  squeeze/unsqu...函数

    6.16  argmax和max的区别

    6.17  torch.as_tensor的应用

7 神经网络基础
    7.2  PyTorch计算图

    7.3  查看网络权重参数

    7.4  保存模型

    7.5  Adam相关面试题

    7.6  Train模式和Eval模式

    7.7  线性网络

    7.8  双线性网络

    7.9  惰性线性层

    7.10  PyTorch中的自动微分

    7.12  Dropout机制

    7.13  半精度训练

    7.14  Xavier初始化

    7.15  注意力机制

    7.16  Dataset数据处理

    7.17  StepLR学习率调度器

    7.18  词嵌入的理解

    7.19  TensorDataset的使用

    7.20  模型的保存与加载

    7.21  ModuleList和Sequential

    7.22  Batch Normalization介绍

8 计算机视觉基础知识
    8.1  通道的深刻理解

    8.2  1x1卷积的作用

    8.3  特征提取和可视化

    8.4  反卷积的推导

    8.5  理解卷积

    8.7  空洞卷积

    8.8  池化层的作用

    8.9  感受野与特征图

    8.10  NMS算法

    8.11  特征图尺寸计算

9 循环神经网络基础
    9.2  RNN的介绍

10 注意力机制
    10.1  位置编码的作用

    10.2  位置编码的种类

    10.4  Embedding本质理解

    10.6  Transformer VS CNN/RNN

    10.7  ELMo介绍

11 PyTorch归一化
    11.2  层归一化技术详解

12 激活函数相关内容
    12.1  激活函数简介

    12.2  万能逼近定理

    12.3  指数函数的学习

    12.4  Sigmoid函数的介绍

    12.5  Tanh函数的介绍

    12.6  Softmax函数的实现

    12.7  ReLU函数的介绍

    12.8  Leaky Relu函数的介绍

    12.9  ReLu与非线性的理解

    12.10  Parametric ReLU函数

    12.11  ELU函数介绍

    12.12  神经元死亡的问题

13 思考题的答案
    13.1  思考题的答案解密

CUDA_VISIBLE_DEVICES 环境变量

创建时间:2024-09-28 更新时间:2024-10-02 阅读次数:1795 次

1、环境变量的作用

环境变量一般存在于操作系统内部,应用程序启动之后,它会从操作系统调用其存储的某些环境变量,从而完成某种控制行为。

2、认识CUDA_VISIBLE_DEVICES环境变量

CUDA_VISIBLE_DEVICES环境变量是专门提供给CUDA程序使用的环境变量,CUDA是NVIDIA开发的并行计算平台和编程模型,我们平时安装的PyTorch绝大多数都是基于CUDA进行模型训练的。

CUDA_VISIBLE_DEVICES环境变量用于指定CUDA应用程序将在哪些GPU设备上运行,通常用于多GPU系统,对于单GPU系统则没有意义。通过设置CUDA_VISIBLE_DEVICES环境变量,可以限制应用程序访问的GPU 设备,以便在多任务或多用户环境中更好地管理和分配GPU资源。

3、CUDA_VISIBLE_DEVICES环境变量的值

CUDA_VISIBLE_DEVICES 的值是一个以英文逗号分隔的 GPU 设备索引表,例如:0,1,2。这表示应用程序将只能在索引为 0、1、2 的 GPU 设备上运行,而忽略其他 GPU 设备。如果用户没有显式设置 CUDA_VISIBLE_DEVICES 的值,应用程序将默认使用所有可用的 GPU 设备。

4、在PyTorch中使用CUDA_VISIBLE_DEVICES环境变量

有时候,我们只想使用其中的一个GPU进行计算。我们可以通过设置CUDA_VISIBLE_DEVICES环境变量来指定使用的GPU编号。

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

在上述例子中,我们将使用编号为0的GPU进行计算。需要注意的是,当你设置了:

os.environ["CUDA_VISIBLE_DEVICES"] = "3"

你实际上是告诉CUDA只看到一个GPU,即设备ID为3的GPU。因此,对于你的PyTorch程序来说,此GPU对应的cuda设备索引为0。

5、CUDA_VISIBLE_DEVICES环境变量的作用

CUDA_VISIBLE_DEVICES环境变量有两大作用:

  • 决定GPU在CUDA程序中是否可见

  • 影响GPU设备名映射cuda设备编号

我们知道使用nvidia-smi命令可以查询本机GPU的相关信息,如下所示:

C:\Users\488xx66>nvidia-smi
Wed Oct  2 20:36:52 2024       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA .. RTX 4090             Off | 00000000:02:00.0 Off |                    0 |
| N/A   44C    P0              79W / 250W |  12178MiB / 16384MiB |     42%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
|   1  NVIDIA .. RTX 4090             Off | 00000000:03:00.0 Off |                    0 |
| N/A   49C    P0              81W / 250W |  12214MiB / 16384MiB |     63%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
|   2  NVIDIA .. RTX 4090             Off | 00000000:82:00.0 Off |                    0 |
| N/A   35C    P0              31W / 250W |   2932MiB / 16384MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

可以看到我的主机有三个GPU,分别被编号为0、1、2。下面使用torch.cuda模块下提供的函数,查询了本机拥有的cuda设备数量,并根据编号显示了它们的型号。

import torch

# 检查是否有可用的CUDA设备
if torch.cuda.is_available():
    # 获取设备数量
    device_count = torch.cuda.device_count()
    print("CUDA设备数量:", device_count)

    # 遍历每个设备并输出型号
    for i in range(device_count):
        print("CUDA设备{}型号:".format(i), torch.cuda.get_device_name(i))
else:
    print("CUDA不可用")

输出:

CUDA设备数量: 3
CUDA设备0型号: NVIDIA GeForce RTX 4090
CUDA设备1型号: NVIDIA GeForce RTX 4090
CUDA设备2型号: NVIDIA GeForce RTX 4090

下面给大家演示一下CUDA_VISIBLE_DEVICES环境变量的两大作用。如下所示,仅设置GPU1、GPU2可见,且将GPU1当做cuda:0设备,GPU2当做cuda:1设备:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2"
# 查看cuda设备数量
print("CUDA设备数量:", torch.cuda.device_count())

# 无法使用cuda2设备
a=torch.tensor([1, 2, 3, 4, 5], device="cuda:2")

上述代码设置GPU1和GPU2可见,且将GPU1当做cuda:0设备,GPU2当做cuda:1设备,所以此时无法使用cuda:2设备。由于环境变量CUDA_VISIBLE_DEVICES中编号的顺序会影响cuda设备的映射编号,我们甚至可以将GPU0当做cuda:2设备,GPU1当做cuda:1设备,GPU2当做cuda:0设备,如下所示。

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2,1,0"
本教程共117节,当前为第36节!
本教程最新修订时间为:2026-05-08 11:10:53