内网环境下 Ubuntu 20.04 搭建深度学习环境指南

一、准备工作

1.1 系统基本配置

  1. 确保系统已安装必要的依赖:
sudo apt update
sudo apt install -y build-essential cmake git wget unzip

  1. 配置国内镜像源(如有需要):
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

1.2 显卡驱动安装

  1. 查看显卡型号:
lspci | grep -i nvidia

  1. 下载对应版本的NVIDIA驱动(.run文件)并传输到内网环境

  2. 禁用nouveau驱动:

sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nouveau.conf"
sudo update-initramfs -u

  1. 安装驱动:
chmod +x NVIDIA-Linux-x86_64-*.run
sudo ./NVIDIA-Linux-x86_64-*.run --no-opengl-files

二、Python环境配置

2.1 Miniconda安装

  1. 下载Miniconda安装包并传输到内网环境:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

  1. 安装Miniconda:
bash Miniconda3-latest-Linux-x86_64.sh

  1. 配置conda环境变量:
echo 'export PATH=~/miniconda3/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

2.2 创建虚拟环境

  1. 创建深度学习专用环境:
conda create -n dl python=3.8
conda activate dl

三、CUDA和cuDNN安装

3.1 CUDA Toolkit安装

  1. 下载对应版本的CUDA安装包(.run文件)并传输到内网

  2. 安装CUDA:

chmod +x cuda_*.run
sudo ./cuda_*.run

  1. 配置环境变量:
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

3.2 cuDNN安装

  1. 下载对应版本的cuDNN压缩包并传输到内网

  2. 解压并安装:

tar -xzvf cudnn-*.tgz
sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

四、深度学习框架安装

4.1 PyTorch安装

  1. 下载对应版本的PyTorch wheel文件并传输到内网

  2. 安装PyTorch:

pip install torch-*.whl

  1. 验证安装:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"

4.2 TensorFlow安装

  1. 下载对应版本的TensorFlow wheel文件

  2. 安装TensorFlow:

pip install tensorflow-*.whl

  1. 验证安装:
python -c "import tensorflow as tf; print(tf.__version__); print(tf.config.list_physical_devices('GPU'))"

五、常用工具安装

5.1 Jupyter Notebook配置

  1. 安装Jupyter:
pip install jupyter

  1. 生成配置文件:
jupyter notebook --generate-config

  1. 设置密码:
jupyter notebook password

5.2 OpenCV安装

  1. 下载OpenCV源码包并传输到内网

  2. 编译安装:

unzip opencv-*.zip
cd opencv-*
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)
sudo make install

六、环境验证

  1. 综合验证脚本:
import torch
import tensorflow as tf
import cv2

print("PyTorch版本:", torch.__version__)
print("PyTorch CUDA可用:", torch.cuda.is_available())
print("TensorFlow版本:", tf.__version__)
print("TensorFlow GPU设备:", tf.config.list_physical_devices('GPU'))
print("OpenCV版本:", cv2.__version__)

七、常见问题解决

 

7.1 显卡驱动问题

详细症状

  • 执行nvidia-smi命令时提示"command not found"或"NVIDIA-SMI has failed"
  • 系统无法识别NVIDIA显卡
  • 深度学习框架报告"CUDA driver version is insufficient"

解决方案步骤

  1. 完全卸载现有驱动:
    sudo apt purge nvidia*
    sudo apt autoremove
    sudo rm /etc/X11/xorg.conf
    

  2. 重启系统:
    sudo reboot
    

  3. 重新安装驱动(推荐方式):
    • 方法1:使用官方推荐驱动
      sudo ubuntu-drivers autoinstall
      

    • 方法2:指定版本安装(如470版)
      sudo apt install nvidia-driver-470
      

  4. 验证安装:
    nvidia-smi  # 应显示显卡状态
    

常见问题

  • 若遇到"Secure Boot"问题,需进入BIOS禁用Secure Boot
  • 双显卡笔记本可能需要额外配置Prime-select

7.2 CUDA版本不匹配

详细症状

  • PyTorch/TensorFlow报错"CUDA runtime version is X but Y is required"
  • torch.cuda.is_available()返回False
  • nvcc --versionnvidia-smi显示的CUDA版本不一致

解决方案

  1. 确认当前环境CUDA版本:
    conda list | grep cudatoolkit
    

  2. 安装匹配版本(以PyTorch 1.12需要CUDA 11.3为例):
    conda install cudatoolkit=11.3 -c conda-forge
    

  3. 验证安装:
    import torch
    print(torch.version.cuda)  # 应与安装版本一致
    

版本对照表

框架版本 推荐CUDA版本
PyTorch 2.0 11.7/11.8
TensorFlow 2.10 11.2

7.3 内存不足问题

详细症状

  • 报错"CUDA out of memory"
  • nvidia-smi显示显存占满
  • 训练过程中突然中断

解决方案

  1. 立即缓解措施:

    # 减小batch size(如从32降到16)
    train_loader = DataLoader(..., batch_size=16)
    

  2. 高级优化方案:

    • 梯度累积(模拟更大batch):
      for i, data in enumerate(train_loader):
          with torch.cuda.amp.autocast():
              loss = model(data)
              loss = loss / 4  # 假设累积4次
              scaler.scale(loss).backward()
          
          if i % 4 == 0:
              scaler.step(optimizer)
              scaler.update()
              optimizer.zero_grad()
      

    • 混合精度训练:
      from torch.cuda.amp import autocast, GradScaler
      scaler = GradScaler()
      
      with autocast():
          outputs = model(inputs)
          loss = criterion(outputs, targets)
      scaler.scale(loss).backward()
      scaler.step(optimizer)
      scaler.update()
      

  3. 其他优化手段:

    • 使用torch.utils.checkpoint进行内存换计算
    • 启用pin_memory加速数据传输:
      DataLoader(..., pin_memory=True)
      

八、性能优化建议

8.1 CUDA加速配置

最佳实践

# 自动选择设备(支持多GPU情况)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# 模型转移(确保所有组件都在GPU)
model = Model().to(device)
for tensor in [inputs, targets]:
    tensor = tensor.to(device, non_blocking=True)  # 异步传输

# 释放缓存(长期运行脚本时使用)
torch.cuda.empty_cache()

8.2 混合精度训练进阶

完整实现示例

scaler = torch.cuda.amp.GradScaler()

for epoch in range(epochs):
    for inputs, targets in train_loader:
        inputs, targets = inputs.to(device), targets.to(device)
        
        optimizer.zero_grad()
        
        # Forward pass
        with torch.cuda.amp.autocast(dtype=torch.float16):
            outputs = model(inputs)
            loss = criterion(outputs, targets)
        
        # Backward pass
        scaler.scale(loss).backward()
        scaler.step(optimizer)
        scaler.update()

注意事项

  • 某些操作(如softmax)需要float32精度,会自动转换
  • 梯度缩放可防止float16下溢

8.3 数据加载优化

高级配置

train_loader = torch.utils.data.DataLoader(
    dataset,
    batch_size=64,
    shuffle=True,
    num_workers=min(16, os.cpu_count()-1),  # 根据CPU核心数调整
    pin_memory=True,  # 配合CUDA使用
    persistent_workers=True,  # 保持worker进程
    prefetch_factor=2,  # 预取批次
    drop_last=True  # 丢弃不完整批次
)

性能对比

配置项 默认值 优化值 速度提升
num_workers 0 8 3-5x
pin_memory False True 20-30%
prefetch_factor 2 4 10-15%
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐