網(wǎng)站的建設(shè)網(wǎng)站推廣100種方法
一、CPU與GPU體系架構(gòu)
- 計(jì)算單元分布
- CPU: 少量強(qiáng)大的ALU(算術(shù)邏輯單元),通常4-8個(gè)核心
- GPU: 大量小型ALU,成百上千個(gè)計(jì)算核心
- 特點(diǎn):GPU更適合并行計(jì)算,可以同時(shí)處理大量數(shù)據(jù)
- 控制單元(Control)
- CPU: 較大的控制單元,復(fù)雜的控制邏輯
- GPU: 較小的控制單元,多個(gè)計(jì)算單元共享一個(gè)控制單元
- 特點(diǎn):GPU犧牲了控制靈活性,換取更多計(jì)算資源
- 緩存(Cache)
- CPU: 較大的緩存,多級(jí)緩存結(jié)構(gòu)
- GPU: 相對(duì)較小的緩存
- 特點(diǎn):GPU更依賴高帶寬內(nèi)存訪問而不是緩存命中
- 內(nèi)存(DRAM)
- CPU: 通用內(nèi)存架構(gòu),延遲優(yōu)化
- GPU: 高帶寬內(nèi)存架構(gòu),吞吐量?jī)?yōu)化
- 特點(diǎn):GPU的內(nèi)存系統(tǒng)設(shè)計(jì)偏重帶寬而非延遲
二、GPU編程軟件堆棧
?1、CPU視角的執(zhí)行流程:
Application代碼
? ? ↓
調(diào)用CUDA API
? ? ↓
CUDA Runtime處理
? ? ↓
Driver與GPU通信
? ? ↓
向GPU發(fā)送指令
2、GPU視角:
接收指令 → 執(zhí)行計(jì)算 → 返回結(jié)果
從系統(tǒng)架構(gòu)上來(lái)看:
應(yīng)用程序 (CPU)
? ? ↓
CUDA Runtime/Driver (CPU系統(tǒng)空間)
? ? ↓
PCIe總線通信
? ? ↓
GPU執(zhí)行單元
所以看出CPU用于控制運(yùn)行application,做復(fù)雜控制,GPU只用于大規(guī)模并行計(jì)算,GPU不能離開CPU單獨(dú)使用,由CPU來(lái)統(tǒng)一管理系統(tǒng)資源,GPU專注計(jì)算任務(wù)。
3、用偽代碼表述如下:
int main() { ?// CPU上運(yùn)行主程序
? ? // CPU管理GPU資源
? ? cudaSetDevice(0);
? ??// CPU分配內(nèi)存
? ? float *d_data;
? ? cudaMalloc(&d_data, size);
? ??// CPU啟動(dòng)GPU計(jì)算
? ? kernel<<<grid, block>>>(d_data);
? ??// CPU等待GPU完成
? ? cudaDeviceSynchronize();
}
CUDA組件必須運(yùn)行在CPU上,作為CPU和GPU之間的橋梁,管理和協(xié)調(diào)兩種處理器的工作。這也是為什么圖中將CUDA組件放在CPU框中的原因
三、現(xiàn)實(shí)中英偉達(dá)的軟件與軟件棧對(duì)應(yīng)關(guān)系
?舉個(gè)代碼例子來(lái)理解這個(gè)框架:
# 當(dāng)你運(yùn)行一個(gè)PyTorch程序時(shí)
import torch
model = torch.nn.Linear(100, 10).cuda()
output = model(input_data)
# 實(shí)際發(fā)生了這些事:
1. PyTorch(應(yīng)用層)調(diào)用cuDNN(Libraries層)的優(yōu)化函數(shù)
2. cuDNN通過Runtime層申請(qǐng)GPU內(nèi)存、創(chuàng)建計(jì)算流
3. Runtime層通過Driver層與GPU通信
4. Driver層發(fā)送指令給GPU執(zhí)行計(jì)算
5. 結(jié)果通過層層返回到PyTorch
類比你要網(wǎng)購(gòu)一件商品的過程:
應(yīng)用層 → 你在手機(jī)App下單
Libraries層 → 購(gòu)物平臺(tái)的各種服務(wù)(支付/物流)
Runtime層 → 快遞公司的調(diào)度系統(tǒng)
Driver層 → 快遞員實(shí)際配送
硬件層 → 商品實(shí)際到達(dá)你手中
四、所以安裝單機(jī)多卡容器化訓(xùn)練環(huán)境
1、基礎(chǔ)系統(tǒng)層
# 推薦使用Ubuntu 20.04/22.04 LTS服務(wù)器版
sudo apt update && sudo apt upgrade
# 安裝基礎(chǔ)開發(fā)工具
sudo apt install -y build-essential cmake git curl wget software-properties-common
2、nVidia驅(qū)動(dòng)層
# 添加NVIDIA驅(qū)動(dòng)倉(cāng)庫(kù)
sudo add-apt-repository ppa:graphics-drivers/ppa
# 安裝NVIDIA驅(qū)動(dòng)(適用于A800的最新驅(qū)動(dòng),如535)
sudo apt install nvidia-driver-535
# 驗(yàn)證驅(qū)動(dòng)安裝
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
# 設(shè)置環(huán)境變量(添加到 ~/.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環(huán)境層
# 安裝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
# 驗(yàn)證Docker GPU支持
sudo docker run --gpus all nvidia/cuda:12.2.0-base-ubuntu20.04 nvidia-smi
5、深度學(xué)習(xí)環(huán)境層
# 拉取NVIDIA優(yōu)化的PyTorch容器(以最新版為例)
sudo docker pull nvcr.io/nvidia/pytorch:23.10-py3
# 創(chuàng)建容器啟動(dòng)腳本 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、分布式訓(xùn)練配置
# 創(chuàng)建多卡訓(xùn)練啟動(dòng)腳本 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