2026/5/14 4:49:38
网站建设
项目流程
做会计公司网站的目录,网站地图怎么弄,wordpress横幅广告,建网站需什么条件大家好#xff0c;我是V哥。 话说AI运维工程师的成长路径#xff0c;GPU集群到底怎么搭#xff1f;公司让我搞这个#xff0c;我连从哪下手都不知道啊#xff01; 行#xff0c;今天V哥就把这事儿给你掰开了、揉碎了讲清楚。不整那些高大上的概念轰炸#xff0c;就用大白…大家好我是V哥。话说AI运维工程师的成长路径GPU集群到底怎么搭公司让我搞这个我连从哪下手都不知道啊行今天V哥就把这事儿给你掰开了、揉碎了讲清楚。不整那些高大上的概念轰炸就用大白话带你一步步把GPU训练集群搭起来。先说好这篇文章适合谁公司刚买了几台GPU服务器让你整一下的运维兄弟想自己攒个小集群玩深度学习的技术爱好者面试前想搞清楚这套东西到底是啥的求职者马上开整。一、先搞懂GPU集群到底是个啥在动手之前V哥先给你打个比方把概念捋顺。1. 什么是GPU集群你可以把它理解成一个**“GPU网吧”**。单台服务器就像一台电脑上面插着1-8张显卡GPU。但训练大模型的时候一台机器不够用你就需要把好几台机器连起来让它们一起干活。这堆机器连在一起就叫集群Cluster。2. 为什么要搞集群很简单大模型太胖了一张卡装不下。举个例子训练一个7B参数的大模型至少需要4张A10080G显存训练一个70B的模型可能需要几十张卡一起上要是训练GPT-4那种级别的……别想了那是几千张卡的事儿所以集群的本质就是把多张卡、多台机器的算力拧成一股绳。3. 集群里的几个关键角色V哥画个简单的图给你┌─────────────────────────────────────────────────┐ │ 集群架构 │ ├─────────────────────────────────────────────────┤ │ │ │ ┌─────────┐ │ │ │ Master │ ← 管理节点负责调度任务 │ │ │ Node │ │ │ └────┬────┘ │ │ │ │ │ ▼ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ Worker │ │ Worker │ │ Worker │ │ │ │ Node 1 │ │ Node 2 │ │ Node 3 │ │ │ │ GPU x 8 │ │ GPU x 8 │ │ GPU x 8 │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ ↑ ↑ ↑ │ │ └────────────┴────────────┘ │ │ 高速网络互联 │ │ InfiniBand / RoCE │ │ │ └─────────────────────────────────────────────────┘用人话解释一下角色干啥的生活中的比喻Master Node管理调度分配任务包工头Worker Node真正干活的跑训练任务搬砖工人GPU计算核心算力担当工人手里的电钻高速网络让机器之间快速通信工地上的对讲机共享存储存放数据和模型工地上的材料仓库二、搭建前的准备工作1. 硬件清单V哥假设你有3台GPU服务器配置如下项目配置GPU每台8张 NVIDIA A100 80G或4090、H100都行CPUAMD EPYC 7742 或 Intel Xeon内存512GB 以上系统盘1TB NVMe SSD数据盘4TB NVMe SSD存数据集网卡100Gbps InfiniBand 或 RoCE没这么豪华的配置没关系V哥后面也会讲怎么用几张消费级显卡比如4090搭个小集群练手。原理是一样的只是规模不同。2. 网络规划这个很重要很多人翻车就翻在网络上。网络架构 ┌──────────────────────────────────────────┐ │ 管理网络1Gbps │ │ 用于SSH登录、系统管理、监控等 │ │ │ │ Master ──── Worker1 ──── Worker2 ──── │ └──────────────────────────────────────────┘ ┌──────────────────────────────────────────┐ │ 计算网络100Gbps │ │ 用于GPU之间通信、分布式训练 │ │ │ │ Worker1 ═══ Worker2 ═══ Worker3 ═══ │ │ InfiniBand / RoCE │ └──────────────────────────────────────────┘ ┌──────────────────────────────────────────┐ │ 存储网络25Gbps │ │ 用于访问共享存储NFS/Lustre │ │ │ │ 所有节点 ──── 存储服务器 │ └──────────────────────────────────────────┘V哥划重点管理网络和计算网络一定要分开不然训练的时候SSH都连不上计算网络带宽越大越好这是分布式训练的命脉预算有限的话至少保证计算网络用万兆网10Gbps3. 软件版本选择V哥推荐的组合截至2024年软件版本说明操作系统Ubuntu 22.04 LTS稳定驱动兼容性好NVIDIA Driver535.x 或更高匹配CUDA版本CUDA12.1主流框架都支持cuDNN8.9.x深度学习加速库Docker24.x容器运行时NVIDIA Container Toolkit最新版让Docker能用GPUKubernetes1.28.x容器编排Python3.10PyTorch/TensorFlow兼容性好三、实操一步步搭建集群第一步操作系统安装与基础配置所有节点都要做的事情1.1 安装Ubuntu 22.04这个就不赘述了用U盘做个启动盘装就完事儿。注意几点分区时给/至少200GB/home或单独挂载数据盘给足空间安装时选择OpenSSH Server1.2 配置静态IP和主机名编辑网络配置sudovim/etc/netplan/00-installer-config.yaml内容示例network:version:2ethernets:eno1:# 管理网络网卡addresses:-192.168.1.10/24gateway4:192.168.1.1nameservers:addresses:-8.8.8.8-114.114.114.114ens10f0:# 计算网络网卡InfiniBand/RoCEaddresses:-10.0.0.10/24应用配置sudonetplan apply设置主机名三台分别设置# 第一台sudohostnamectl set-hostname master# 第二台sudohostnamectl set-hostname worker1# 第三台sudohostnamectl set-hostname worker21.3 配置hosts文件所有节点都要配置让它们能通过主机名互相找到sudovim/etc/hosts添加192.168.1.10 master 192.168.1.11 worker1 192.168.1.12 worker2 # 计算网络 10.0.0.10 master-ib 10.0.0.11 worker1-ib 10.0.0.12 worker2-ib1.4 配置SSH免密登录在master节点上# 生成密钥ssh-keygen -t rsa -b4096-N-f ~/.ssh/id_rsa# 复制到所有节点包括自己ssh-copy-id master ssh-copy-id worker1 ssh-copy-id worker2测试一下sshworker1hostname# 如果输出 worker1就成功了1.5 关闭防火墙和SELinux实验环境# 关闭防火墙sudosystemctl stop ufwsudosystemctl disable ufw# Ubuntu默认没有SELinux如果有的话sudosetenforce0sudosed-is/SELINUXenforcing/SELINUXdisabled/g/etc/selinux/configV哥提醒生产环境别这么干要配置好防火墙规则。实验环境为了省事儿可以先关掉。第二步安装NVIDIA驱动和CUDA这一步是重头戏也是最容易翻车的地方。V哥教你最稳的方法。2.1 安装依赖sudoaptupdatesudoaptinstall-y build-essential dkms2.2 禁用开源驱动nouveausudobash-cecho blacklist nouveau /etc/modprobe.d/blacklist.confsudobash-cecho options nouveau modeset0 /etc/modprobe.d/blacklist.confsudoupdate-initramfs -usudoreboot2.3 安装NVIDIA驱动方法一使用官方仓库推荐# 添加仓库sudoaptinstall-y software-properties-commonsudoadd-apt-repository ppa:graphics-drivers/ppasudoaptupdate# 查看可用驱动版本ubuntu-drivers devices# 安装推荐版本sudoaptinstall-y nvidia-driver-535# 重启sudoreboot方法二使用runfile更可控# 下载驱动去官网找对应版本wgethttps://us.download.nvidia.com/XFree86/Linux-x86_64/535.129.03/NVIDIA-Linux-x86_64-535.129.03.run# 安装sudochmodx NVIDIA-Linux-x86_64-535.129.03.runsudo./NVIDIA-Linux-x86_64-535.129.03.run --silent --dkms# 重启sudoreboot2.4 验证驱动安装nvidia-smi看到类似这样的输出就成功了----------------------------------------------------------------------------- | NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 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. | || | 0 NVIDIA A100-SXM... On | 00000000:07:00.0 Off | 0 | | N/A 30C P0 52W / 400W | 0MiB / 81920MiB | 0% Default | ---------------------------------------------------------------------------2.5 安装CUDA Toolkit# 下载CUDA注意版本要和驱动匹配wgethttps://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run# 安装注意不要再装驱动了选择不安装Driversudo./cuda_12.1.1_530.30.02_linux.run --silent --toolkit --override# 配置环境变量echoexport PATH/usr/local/cuda-12.1/bin:$PATH~/.bashrcechoexport LD_LIBRARY_PATH/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH~/.bashrcsource~/.bashrc验证nvcc --version# 应该显示 Cuda compilation tools, release 12.12.6 安装cuDNN# 去NVIDIA官网下载cuDNN需要注册账号# 假设下载了 cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xztar-xvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xzsudocpcudnn-linux-x86_64-8.9.7.29_cuda12-archive/include/* /usr/local/cuda-12.1/include/sudocpcudnn-linux-x86_64-8.9.7.29_cuda12-archive/lib/* /usr/local/cuda-12.1/lib64/sudochmodar /usr/local/cuda-12.1/include/cudnn*.hsudochmodar /usr/local/cuda-12.1/lib64/libcudnn*V哥小提示以上步骤在所有Worker节点都要做建议写成脚本批量执行。第三步安装Docker和NVIDIA Container Toolkit有了Docker以后跑训练任务就方便多了不用在每台机器上装一堆Python环境。3.1 安装Docker# 卸载旧版本sudoaptremovedockerdocker-engine docker.io containerd runc# 安装依赖sudoaptupdatesudoaptinstall-y ca-certificatescurlgnupg lsb-release# 添加Docker官方GPG密钥sudomkdir-p /etc/apt/keyringscurl-fsSL https://download.docker.com/linux/ubuntu/gpg|sudogpg --dearmor -o /etc/apt/keyrings/docker.gpg# 添加仓库echodeb [arch$(dpkg --print-architecture)signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu$(lsb_release -cs)stable|sudotee/etc/apt/sources.list.d/docker.list/dev/null# 安装Dockersudoaptupdatesudoaptinstall-y docker-ce docker-ce-cli containerd.io docker-compose-plugin# 启动并设置开机自启sudosystemctl startdockersudosystemctlenabledocker# 把当前用户加入docker组免sudosudousermod-aGdocker$USERnewgrpdocker3.2 安装NVIDIA Container Toolkit这玩意儿是让Docker能调用GPU的关键。# 添加仓库distribution$(./etc/os-release;echo$ID$VERSION_ID)curl-s -L https://nvidia.github.io/nvidia-docker/gpgkey|sudoapt-keyadd-curl-s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list|sudotee/etc/apt/sources.list.d/nvidia-docker.list# 安装sudoaptupdatesudoaptinstall-y nvidia-container-toolkit# 配置Docker使用NVIDIA运行时sudonvidia-ctk runtime configure --runtimedockersudosystemctl restartdocker3.3 验证GPU Dockerdockerrun --rm --gpus all nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi如果能看到GPU信息恭喜你Docker GPU环境搞定了第四步配置共享存储NFS训练数据和模型需要所有节点都能访问最简单的方案就是NFS。4.1 在Master节点上配置NFS服务端# 安装NFS服务sudoaptinstall-y nfs-kernel-server# 创建共享目录sudomkdir-p /data/sharedsudochown-R nobody:nogroup /data/sharedsudochmod777/data/shared# 配置导出sudovim/etc/exports添加以下内容/data/shared 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)启动服务sudoexportfs -rasudosystemctl restart nfs-kernel-serversudosystemctlenablenfs-kernel-server4.2 在Worker节点上挂载NFS# 安装NFS客户端sudoaptinstall-y nfs-common# 创建挂载点sudomkdir-p /data/shared# 挂载sudomountmaster:/data/shared /data/shared# 验证df-h|grepshared# 设置开机自动挂载echomaster:/data/shared /data/shared nfs defaults 0 0|sudotee-a /etc/fstab现在你在任何一个节点的/data/shared目录下放文件其他节点都能看到了。第五步安装KubernetesK8sK8s是集群管理的核心有了它你就能像管理一台电脑一样管理整个集群。5.1 所有节点的准备工作# 关闭swapK8s要求sudoswapoff -asudosed-i/ swap / s/^/#//etc/fstab# 配置内核参数catEOF|sudotee/etc/modules-load.d/k8s.confoverlay br_netfilter EOFsudomodprobe overlaysudomodprobe br_netfiltercatEOF|sudotee/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOFsudosysctl --system5.2 安装kubelet、kubeadm、kubectl所有节点执行# 添加K8s仓库sudoapt-getupdatesudoapt-getinstall-y apt-transport-https ca-certificatescurlcurl-fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key|sudogpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpgechodeb [signed-by/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /|sudotee/etc/apt/sources.list.d/kubernetes.list# 安装sudoapt-getupdatesudoapt-getinstall-y kubelet kubeadm kubectlsudoapt-mark hold kubelet kubeadm kubectl# 配置containerd使用systemd cgroupsudomkdir-p /etc/containerd containerd config default|sudotee/etc/containerd/config.tomlsudosed-is/SystemdCgroup false/SystemdCgroup true/g/etc/containerd/config.tomlsudosystemctl restart containerd5.3 初始化Master节点只在Master节点执行sudokubeadm init\--pod-network-cidr10.244.0.0/16\--apiserver-advertise-address192.168.1.10初始化成功后会输出一个kubeadm join命令一定要保存好配置kubectlmkdir-p$HOME/.kubesudocp-i /etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config5.4 安装网络插件Flannelkubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml5.5 Worker节点加入集群在Worker节点执行之前保存的join命令sudokubeadmjoin192.168.1.10:6443 --token xxxx\--discovery-token-ca-cert-hash sha256:xxxx5.6 验证集群状态回到Master节点kubectl get nodes应该看到NAME STATUS ROLES AGE VERSION master Ready control-plane 10m v1.28.0 worker1 Ready none 5m v1.28.0 worker2 Ready none 5m v1.28.0第六步安装NVIDIA GPU Operator这是让K8s能识别和调度GPU的关键组件。6.1 安装Helmcurlhttps://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3|bash6.2 安装GPU Operator# 添加NVIDIA Helm仓库helm repoaddnvidia https://helm.ngc.nvidia.com/nvidia helm repo update# 安装GPU Operatorhelminstall--wait --generate-name\-n gpu-operator --create-namespace\nvidia/gpu-operator\--set driver.enabledfalse# 因为我们已经手动装了驱动等待几分钟所有Pod都Running后kubectl get pods -n gpu-operator6.3 验证GPU资源kubectl describe nodes worker1|grepnvidia.com/gpu应该能看到nvidia.com/gpu: 8这就说明K8s已经能识别到8张GPU了第七步跑一个测试任务终于到了激动人心的时刻让我们跑一个GPU测试任务。7.1 创建测试Pod创建文件gpu-test.yamlapiVersion:v1kind:Podmetadata:name:gpu-testspec:restartPolicy:Nevercontainers:-name:cuda-containerimage:nvidia/cuda:12.1.1-base-ubuntu22.04command:[nvidia-smi]resources:limits:nvidia.com/gpu:1# 申请1张GPU运行kubectl apply -f gpu-test.yaml kubectl logs gpu-test能看到GPU信息就成功了7.2 跑一个真正的训练任务创建pytorch-test.yamlapiVersion:v1kind:Podmetadata:name:pytorch-trainspec:restartPolicy:Nevercontainers:-name:pytorchimage:pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtimecommand:-python--c-|import torch print(fPyTorch version: {torch.__version__}) print(fCUDA available: {torch.cuda.is_available()}) print(fGPU count: {torch.cuda.device_count()}) print(fGPU name: {torch.cuda.get_device_name(0)})# 简单的矩阵运算测试x torch.randn(10000,10000).cuda() y torch.randn(10000,10000).cuda() z torch.mm(x,y)print(fMatrix multiplication done! Result shape:{z.shape})resources:limits:nvidia.com/gpu:1volumeMounts:-name:shared-datamountPath:/datavolumes:-name:shared-datanfs:server:masterpath:/data/shared运行kubectl apply -f pytorch-test.yaml kubectl logs -f pytorch-train四、进阶分布式训练配置如果你想让多张卡、多台机器一起训练还需要一些额外配置。1. 安装Kubeflow Training Operatorkubectl apply -kgithub.com/kubeflow/training-operator/manifests/overlays/standalone2. 提交一个PyTorchJob多GPU分布式训练创建distributed-train.yamlapiVersion:kubeflow.org/v1kind:PyTorchJobmetadata:name:pytorch-distributedspec:pytorchReplicaSpecs:Master:replicas:1restartPolicy:OnFailuretemplate:spec:containers:-name:pytorchimage:pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtimecommand:-python--m-torch.distributed.launch---nproc_per_node8---nnodes3---node_rank0---master_addr$(MASTER_ADDR)---master_port$(MASTER_PORT)-/data/train.pyresources:limits:nvidia.com/gpu:8volumeMounts:-name:shared-datamountPath:/datavolumes:-name:shared-datanfs:server:masterpath:/data/sharedWorker:replicas:2restartPolicy:OnFailuretemplate:spec:containers:-name:pytorchimage:pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtimecommand:-python--m-torch.distributed.launch---nproc_per_node8---nnodes3---master_addr$(MASTER_ADDR)---master_port$(MASTER_PORT)-/data/train.pyresources:limits:nvidia.com/gpu:8volumeMounts:-name:shared-datamountPath:/datavolumes:-name:shared-datanfs:server:masterpath:/data/shared五、常见坑点和解决方案V哥踩过的坑你就别踩了坑1驱动和CUDA版本不匹配症状nvidia-smi能用但CUDA程序报错解决查看驱动支持的最高CUDA版本nvidia-smi右上角显示安装对应或更低版本的CUDA Toolkit坑2容器里看不到GPU症状宿主机nvidia-smi正常Docker里看不到解决# 检查nvidia-container-toolkit是否安装dpkg -l|grepnvidia-container# 重新配置Docker运行时sudonvidia-ctk runtime configure --runtimedockersudosystemctl restartdocker坑3K8s节点NotReady症状kubectl get nodes显示NotReady解决# 查看具体原因kubectl describenodeworker1# 常见原因containerd没配好、网络插件没装sudosystemctl restart containerd kubectl apply -f kube-flannel.yml坑4多机训练NCCL超时症状分布式训练卡住报NCCL timeout解决# 检查计算网络是否通畅pingworker1-ib# 设置NCCL环境变量exportNCCL_DEBUGINFOexportNCCL_IB_DISABLE0# 如果用InfiniBandexportNCCL_SOCKET_IFNAMEens10f0# 指定网卡六、总结好了兄弟们到这里一个完整的GPU训练集群就搭建完成了。让我们回顾一下整个流程1. 操作系统安装 基础配置 ↓ 2. NVIDIA驱动 CUDA cuDNN ↓ 3. Docker NVIDIA Container Toolkit ↓ 4. 共享存储NFS ↓ 5. Kubernetes集群 ↓ 6. GPU Operator ↓ 7. 训练框架PyTorch/TensorFlow ↓ 8. 提交训练任务开始炼丹V哥最后说几句搭建集群这事儿看着步骤多其实就是个熟练工种。第一次可能要折腾一两天熟练之后半天就能搞定。关键是要理解每一步在干什么。驱动是让系统认识GPUDocker是让环境可复制K8s是让资源能调度Operator是让K8s认识GPU……把这条链路想通了你就不只是个会照着文档敲命令的而是真正理解GPU集群的人。有问题评论区见V哥看到都会回复。下期咱们聊聊如何用vLLM部署大模型推理服务不见不散V哥碎碎念这篇文章写了快8000字够我喝三杯咖啡的。如果对你有帮助点个赞、收个藏让更多兄弟看到