CUDA系统学习之一软件堆栈架构

一、CPU与GPU体系架构

  • 计算单元分布
    • CPU: 少量强大的ALU(算术逻辑单元),通常4-8个核心
    • GPU: 大量小型ALU,成百上千个计算核心
    • 特点:GPU更适合并行计算,可以同时处理大量数据
  • 控制单元(Control)
    • CPU: 较大的控制单元,复杂的控制逻辑
    • GPU: 较小的控制单元,多个计算单元共享一个控制单元
    • 特点:GPU牺牲了控制灵活性,换取更多计算资源
  • 缓存(Cache)
    • CPU: 较大的缓存,多级缓存结构
    • GPU: 相对较小的缓存
    • 特点:GPU更依赖高带宽内存访问而不是缓存命中
  • 内存(DRAM)
    • CPU: 通用内存架构,延迟优化
    • GPU: 高带宽内存架构,吞吐量优化
    • 特点:GPU的内存系统设计偏重带宽而非延迟

二、GPU编程软件堆栈

1、CPU视角的执行流程:

Application代码

调用CUDA API

CUDA Runtime处理

Driver与GPU通信

向GPU发送指令

2、GPU视角:

接收指令 → 执行计算 → 返回结果

从系统架构上来看:

应用程序 (CPU)

CUDA Runtime/Driver (CPU系统空间)

PCIe总线通信

GPU执行单元

所以看出CPU用于控制运行application,做复杂控制,GPU只用于大规模并行计算,GPU不能离开CPU单独使用,由CPU来统一管理系统资源,GPU专注计算任务。

3、用伪代码表述如下:

int main() { // CPU上运行主程序

// CPU管理GPU资源

cudaSetDevice(0);

// CPU分配内存

float *d_data;

cudaMalloc(&d_data, size);

// CPU启动GPU计算

kernel<<<grid, block>>>(d_data);

// CPU等待GPU完成

cudaDeviceSynchronize();

}

CUDA组件必须运行在CPU上,作为CPU和GPU之间的桥梁,管理和协调两种处理器的工作。这也是为什么图中将CUDA组件放在CPU框中的原因

三、现实中英伟达的软件与软件栈对应关系

举个代码例子来理解这个框架:

当你运行一个PyTorch程序时

import torch

model = torch.nn.Linear(100, 10).cuda()

output = model(input_data)

实际发生了这些事:

  1. PyTorch(应用层)调用cuDNN(Libraries层)的优化函数

  2. cuDNN通过Runtime层申请GPU内存、创建计算流

  3. Runtime层通过Driver层与GPU通信

  4. Driver层发送指令给GPU执行计算

  5. 结果通过层层返回到PyTorch

类比你要网购一件商品的过程:

应用层 → 你在手机App下单

Libraries层 → 购物平台的各种服务(支付/物流)

Runtime层 → 快递公司的调度系统

Driver层 → 快递员实际配送

硬件层 → 商品实际到达你手中

四、所以安装单机多卡容器化训练环境

1、基础系统层

推荐使用Ubuntu 20.04/22.04 LTS服务器版

sudo apt update && sudo apt upgrade

安装基础开发工具

sudo apt install -y build-essential cmake git curl wget software-properties-common

2、nVidia驱动层

添加NVIDIA驱动仓库

sudo add-apt-repository ppa:graphics-drivers/ppa

安装NVIDIA驱动(适用于A800的最新驱动,如535)

sudo apt install nvidia-driver-535

验证驱动安装

nvidia-smi

3、NVIDIA CUDA工具层

下载并安装CUDA工具包(以12.2为例)

wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_525.60.13_linux.run

sudo sh cuda_12.2.0_525.60.13_linux.run

设置环境变量(添加到 ~/.bashrc)

export PATH=/usr/local/cuda-12.2/bin{PATH:+:{PATH}}

export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64{LD_LIBRARY_PATH:+:{LD_LIBRARY_PATH}}

4、Docker环境层

安装Docker

curl -fsSL https://get.docker.com -o get-docker.sh

sudo sh get-docker.sh

安装NVIDIA Container Toolkit

distribution=(. /etc/os-release;echo ID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt update

sudo apt install -y nvidia-container-toolkit

sudo systemctl restart docker

验证Docker GPU支持

sudo docker run --gpus all nvidia/cuda:12.2.0-base-ubuntu20.04 nvidia-smi

5、深度学习环境层

拉取NVIDIA优化的PyTorch容器(以最新版为例)

sudo docker pull nvcr.io/nvidia/pytorch:23.10-py3

创建容器启动脚本 start_container.sh

cat << 'EOF' > start_container.sh

#!/bin/bash

docker run --gpus all -it --rm \

--shm-size=1g \

--ulimit memlock=-1 \

--ulimit stack=67108864 \

-v /path/to/your/data:/workspace/data \

-v /path/to/your/code:/workspace/code \

nvcr.io/nvidia/pytorch:23.10-py3

EOF

chmod +x start_container.sh

6、分布式训练配置

创建多卡训练启动脚本 launch_training.sh

cat << 'EOF' > launch_training.sh

#!/bin/bash

docker run --gpus all -it --rm \

--shm-size=1g \

--ulimit memlock=-1 \

--ulimit stack=67108864 \

--network=host \

-v /path/to/your/data:/workspace/data \

-v /path/to/your/code:/workspace/code \

--env NCCL_DEBUG=INFO \

--env NCCL_IB_DISABLE=0 \

--env NCCL_IB_GID_INDEX=3 \

--env NCCL_SOCKET_IFNAME=^docker0,lo \

nvcr.io/nvidia/pytorch:23.10-py3

EOF

chmod +x launch_training.sh

相关推荐
阿阳微客2 小时前
Steam 搬砖项目深度拆解:从抵触到真香的转型之路
前端·笔记·学习·游戏
Chef_Chen7 小时前
从0开始学习R语言--Day18--分类变量关联性检验
学习
键盘敲没电7 小时前
【IOS】GCD学习
学习·ios·objective-c·xcode
海的诗篇_8 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
AgilityBaby8 小时前
UE5 2D角色PaperZD插件动画状态机学习笔记
笔记·学习·ue5
AgilityBaby8 小时前
UE5 创建2D角色帧动画学习笔记
笔记·学习·ue5
武昌库里写JAVA10 小时前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
一弓虽11 小时前
git 学习
git·学习
Moonnnn.13 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr713 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习