最近行业里被“AI云”这个词刷屏了。起因是 CoreWeave、Nebius 这些以 GPU 算力为核心业务的云厂商发布了财报,市场反应热烈,股价双双大涨。很多开发者私信问我:AI云到底是什么,和传统云主机有什么区别,我们普通人能不能用,怎么上手?
这篇文章不打算只做新闻解读,我想从技术视角切入,结合 AI 云计算的基本概念、算力选型、环境搭建流程,以及真实可跑的示例代码,帮助你搞清楚 AI 云的计算逻辑,并学会在一台云 GPU 实例上从零搭建深度学习环境。无论你是关注行业动态的后端开发,还是正准备把模型训练搬到云上的算法工程师,这篇文章都值得收藏备用。
1. 背景与核心概念:AI云为什么突然爆火
1.1 什么是AI云
AI云,简单理解就是“面向人工智能计算场景优化的云计算服务”。传统云主机一般提供 CPU 算力,用来跑网站、数据库、微服务这类通用业务;AI云则把重心放在 GPU(图形处理器)、高速存储、高性能网络和分布式训练工具链上,目标是解决大模型训练、推理部署、机器学习实验等场景下的算力缺口。
用一句话概括:
传统云解决的是“应用跑起来”的问题,AI云解决的是“模型算得动”的问题。
CoreWeave 和 Nebius 这波被市场关注,本质上是 GPU 算力需求的高速增长在财报上的体现。云计算市场正在从通用计算向智能计算迁移,跑大模型、做 AI 推理、训练多模态模型,都需要大量 GPU 资源。而这类资源不管是自建还是租用,成本和门槛都很高,AI云厂商正是抓住了这个窗口。
1.2 AI云与传统云主机、VPS的区别
很多刚接触云计算的开发者,会混淆 VPS、云主机和 AI云。这里做一个简单对比:
| 类型 | 核心资源 | 主要用途 | 特点 |
|---|---|---|---|
| VPS | CPU、内存、磁盘 | 个人网站、代理服务、小流量应用 | 便宜、灵活、共享资源 |
| 云主机 | CPU、内存、带宽 | 企业应用、数据库、微服务 | 稳定、弹性、隔离性好 |
| AI云/GPU云 | GPU、显存、高速网络 | 模型训练、推理、科学计算 | 算力强、成本高、专业工具链完善 |
从技术选型的角度看,VPS 和云主机是“通用计算”思路;AI云是“专用计算”思路。如果只是部署一个很轻量的 API 服务,没必要上 GPU 实例;但如果要跑大模型,用普通云主机配置环境会非常痛苦——CPU 训练一个中等模型可能要几天,而 GPU 可能只要几小时。
1.3 为什么开发者需要了解AI云
对大模型时代的开发者来说,AI云不是“和我无关”的新闻,而是实实在在的工程工具:
- 学习成本可控:不用自己买显卡,按小时租用 GPU 实例就能跑实验。
- 弹性伸缩:训练任务多时扩节点,任务结束立刻释放,避免资源闲置。
- 分布式训练支持:AI云厂商通常提供 InfiniBand 或高带宽网络,支持多卡多机分布式训练。
- 工程化工具链:镜像市场、一键部署、对象存储、日志监控都比较成熟。
可以说,AI云正在成为算法工程师和 AI 应用开发者的“水电煤”。把基础概念搞清楚,后面的实际操作才能顺利展开。
2. 环境准备:算力平台、操作系统与工具链选择
2.1 选择云 GPU 实例的通用思路
当前市场上可选的 GPU 云平台比较多,国内有阿里云、腾讯云、华为云以及一些专注 AI 算力的平台;海外有 CoreWeave、Nebius、AWS、Azure、Google Cloud 等。虽然厂商不同,但选型逻辑是相通的:
- 看 GPU 型号:消费级显卡(如 RTX 4090)适合开发调试和中小模型训练;数据中心级显卡(如 A100、H100、L40S)适合大模型和高并发推理。
- 看显存大小:显存决定单卡能塞下多大的模型。7B 参数模型用 FP16 加载,大约需要 14GB 以上显存,实际训练会更高。
- 看网络能力:单机多卡需要 NVLink 或 PCIe 互联;多机训练需要高带宽网络(如 InfiniBand)。
- 看存储方案:训练数据量大时,需要挂载高性能共享存储,而不是只靠系统盘。
- 看计费方式:按需计费适合短期任务;包周包月适合长期稳定训练;竞价实例适合可中断任务,价格通常更低。
2.2 本地环境准备
虽然计算在云上跑,但本地工具链还是要准备好,方便连接、上传代码和监控任务。
我常用的本地环境如下:
- 操作系统:Windows 10/11 或 macOS 均可
- SSH 客户端:Windows 推荐使用 PowerShell 自带 SSH,或者用 MobaXterm
- 代码上传:Git + SCP/SFTP
- 模型调试:本地安装 Python 3.10+,使用 PyTorch 做代码语法验证(不一定在本地训练)
- 远程开发:VS Code Remote-SSH
2.3 版本说明与免责
不同云厂商的 GPU 实例预装系统、驱动、CUDA 版本都有差异,文章示例以常见 Linux 环境为主,使用 PyTorch 训练框架。具体版本需要根据你的实际项目调整,但整体流程和命令是通用的。
本文后续示例环境:
操作系统:Ubuntu 22.04 LTS GPU:NVIDIA A100 / 4090 等(云平台按需选择) Python:3.10 PyTorch:2.x CUDA:12.x(以云平台预装为准)这里不写死具体型号和版本,是因为各平台的镜像更新速度不同。你在实操时,只要保持驱动、CUDA、PyTorch 三者匹配即可。
3. AI云的核心机制拆解:算力、计费、存储与工具链
3.1 GPU算力实例类型
AI云平台通常会按“GPU 型号 + 卡数 + 显存”组合成多个实例规格。例如:
| 实例类型 | GPU规格 | 适用场景 |
|---|---|---|
| 开发调试型 | 1×RTX 4090 | 代码调试、小型模型训练 |
| 标准训练型 | 1×A100 40GB | 中小模型训练、微调 |
| 大规模训练型 | 8×H100 80GB | 大模型预训练、多卡并行 |
| 推理服务型 | L4 / T4 | 模型部署、在线推理 |
选择实例时,不要只看 GPU 算力,还要留意 CPU、内存和本地磁盘的配置。数据加载(DataLoader)和预处理会消耗 CPU 资源,如果 CPU 核数太少,GPU 就会“吃不饱”,训练效率会大打折扣。
3.2 按需计费与成本控制
AI云的一大特点是“按量付费”。以按需实例为例,通常按小时计费,项目结束或测试完毕,释放实例即可停止计费。
需要注意的计费细节:
- 存储费用单独计算:系统盘、数据盘、共享存储分别计费。
- 关机是否收费:有的平台关机后只收存储费,不收计算费;有的平台关机后仍保留部分资源,需要仔细看计费规则。
- 竞价实例:价格低,但资源可能被回收,适合可中断的离线任务。
- 流量费用:如果数据从公网传输到云平台,可能会有流量费用。
实际项目中,最稳妥的做法是:先用小规格实例做代码调试,确认无误后,再申请大规格实例正式训练。任务结束后立刻释放,避免“跑完忘记关”导致账单超支。
3.3 数据存储与挂载
训练任务的数据集通常比较大。AI云平台一般提供两种存储方案:
- 本地 SSD 盘:读写快,但实例释放后数据可能丢失,适合临时数据。
- 共享存储 / 对象存储:数据持久化保存,多台实例可以同时读取,适合数据集和模型权重。
建议的数据流转方式:
对象存储(原始数据集) ↓ 共享存储 / 高性能文件存储(挂载到训练实例) ↓ 本地 SSD(训练时临时读写缓存) ↓ 模型输出写回共享存储 / 对象存储这样做的好处是,训练节点可以随时销毁重建,数据仍然在,不会因为实例故障丢失。
3.4 镜像与工具链
AI云平台一般会提供多种预装镜像,例如:
- PyTorch 镜像:预装 CUDA、cuDNN、PyTorch、常用 Python 库
- TensorFlow 镜像:适合 TensorFlow 开发者
- 基础镜像:只有操作系统和 GPU 驱动,适合自定义环境
使用预装镜像可以省去很多环境配置时间。如果需要在基础上安装额外依赖,建议在启动实例后,用 conda 或 venv 创建独立环境,避免污染系统环境。
4. 完整实战:在云GPU实例上搭建深度学习环境
这一节是文章的核心。我会从创建项目结构开始,演示如何连接云端 GPU 实例、安装环境、上传代码、运行训练脚本,并给出完整的输出示例。
4.1 创建项目结构
在本地创建如下目录结构:
gpu-cloud-demo/ ├── train.py ├── requirements.txt ├── data/ └── outputs/本地命令行执行:
mkdir -p gpu-cloud-demo/{data,outputs} cd gpu-cloud-demo touch train.py requirements.txtdata目录存放训练数据,outputs目录存放模型输出结果,train.py是训练脚本,requirements.txt是依赖列表。
4.2 申请并初始化云GPU实例
登录你选定的云平台,在控制台选择 GPU 实例,推荐先用单卡实例做验证。
关键配置项如下:
地域:选择离你较近或数据合规要求的地域 可用区:视平台情况选择 GPU 型号:NVIDIA A100 或 RTX 4090 操作系统:Ubuntu 22.04 系统盘:40GB SSD 数据盘:100GB(可选) 网络:分配公网 IP,安全组开放 22 端口 登录方式:SSH 密钥对或密码创建实例后,你会拿到一个公网 IP。接下来在本地使用 SSH 登录:
ssh root@你的云主机IP如果使用密钥对登录:
ssh -i ~/.ssh/your-key.pem root@你的云主机IP登录成功后,先检查 GPU 状态:
nvidia-smi如果输出类似下面的信息,说明 GPU 驱动和 CUDA 环境已经就绪:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 545.23.08 Driver Version: 545.23.08 CUDA Version: 12.3 | |-------------------------------+----------------------+----------------------+ | 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-PCIE... On | 00000000:00:04.0 Off | 0 | | N/A 32C P0 35W / 250W | 13256MiB / 40960MiB | 0% Default | +-----------------------------------------------------------------------------+如果nvidia-smi命令不存在,说明系统没有安装 NVIDIA 驱动,可以按下一节步骤安装。
4.3 安装GPU驱动与CUDA环境
很多云平台预装镜像已经包含驱动,但如果没有,需要手动安装。
先安装基础依赖:
apt update apt install -y build-essential dkms linux-headers-$(uname -r)下载并安装 NVIDIA 驱动时,需要根据 GPU 型号选择对应版本。这里以常见驱动为例,安装时请根据实际型号调整:
wget https://us.download.nvidia.com/XFree86/Linux-x86_64/550.90.07/NVIDIA-Linux-x86_64-550.90.07.run chmod +x NVIDIA-Linux-x86_64-550.90.07.run ./NVIDIA-Linux-x86_64-550.90.07.run --silent安装完成后,重启实例:
reboot重新登录后,再执行nvidia-smi验证。
接下来安装 Miniconda。Miniconda 是 Python 环境管理工具,能避免系统 Python 被污染:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 /opt/miniconda3/bin/conda init bash source ~/.bashrc创建虚拟环境:
conda create -n gpu_env python=3.10 -y conda activate gpu_env4.4 添加依赖并编写核心代码
在requirements.txt中写入:
torch>=2.0.0 torchvision>=0.15.0 numpy tqdm本地执行:
pip install -r requirements.txt接下来编写训练脚本train.py。这里用一个简单的 MNIST 手写数字识别模型来验证 GPU 是否工作正常。train.py完整内容如下:
import os import time import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms from torchvision.models import resnet18 def main(): # 设备检测:优先使用 GPU device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print(f"Using device: {device}") print(f"GPU name: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'CPU only'}") # 数据预处理 transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # 加载 MNIST 数据集 train_dataset = datasets.MNIST( root="./data", train=True, download=True, transform=transform ) train_loader = DataLoader( train_dataset, batch_size=64, shuffle=True, num_workers=4, pin_memory=True ) # 使用 ResNet18 模型,将第一层输入通道改为 1 model = resnet18(weights=None) model.conv1 = nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False) model.fc = nn.Linear(model.fc.in_features, 10) model.to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练一个 epoch 作为验证 model.train() start_time = time.time() total_loss = 0.0 correct = 0 total = 0 for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() total_loss += loss.item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() total += target.size(0) if batch_idx % 50 == 0: print(f"Batch {batch_idx}/{len(train_loader)}, Loss: {loss.item():.4f}") elapsed = time.time() - start_time accuracy = 100.0 * correct / total avg_loss = total_loss / len(train_loader) print(f"Training finished in {elapsed:.2f} seconds") print(f"Average Loss: {avg_loss:.4f}") print(f"Accuracy: {accuracy:.2f}%") # 保存模型 os.makedirs("outputs", exist_ok=True) torch.save(model.state_dict(), "outputs/mnist_resnet18.pth") print("Model saved to outputs/mnist_resnet18.pth") if __name__ == "__main__": main()代码说明:
device变量会优先使用 CUDA,如果 GPU 不可用则回退到 CPU。ResNet18输入通道改为 1,是为了匹配 MNIST 灰度图的单通道输入。- 训练一个 epoch,目的是验证 GPU 能正常计算,不需要追求准确率。
pin_memory=True能提升数据从内存拷贝到 GPU 显存的效率,这是 GPU 训练常用的优化手段。
4.5 运行与验证
将本地代码上传到云端:
scp -r gpu-cloud-demo root@你的云主机IP:/root/登录到云主机,进入项目目录,激活环境并运行:
cd /root/gpu-cloud-demo conda activate gpu_env python train.py如果一切正常,你会看到类似下面的输出:
Using device: cuda GPU name: NVIDIA A100-PCIE-40GB Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz ... ... Batch 0/938, Loss: 2.3098 Batch 50/938, Loss: 0.7823 Batch 100/938, Loss: 0.2531 ... Batch 900/938, Loss: 0.0812 Training finished in 86.35 seconds Average Loss: 0.1810 Accuracy: 94.72% Model saved to outputs/mnist_resnet18.pth输出结果说明:
Using device: cuda表示已经成功调用 GPU。GPU name显示了当前 GPU 型号。Training finished in ...是耗时统计。- 训练完成后,模型权重保存在
outputs/mnist_resnet18.pth。
你可以顺便验证一下 GPU 占用率。在另一个终端窗口连接到云主机,执行:
nvidia-smi训练过程中,能看到显存占用和 GPU 利用率明显上升,说明计算确实发生在 GPU 上。
4.6 使用 GPU 状态监控
训练任务跑起来后,可以通过命令实时监控 GPU 状态:
watch -n 1 nvidia-smiwatch命令每 1 秒刷新一次 GPU 状态。重点关注:
Memory-Usage:显存占用GPU-Util:GPU 计算单元利用率Pwr:Usage/Cap:当前功耗与最大功耗
如果GPU-Util长期接近 100%,说明计算资源被充分利用;如果一直很低,可能瓶颈在数据读取或者 CPU 预处理,需要优化 DataLoader 的num_workers和prefetch_factor。
5. 常见问题与排查思路
在云 GPU 实例上跑深度学习任务,虽然比本地省心,但依然有不少坑。下面整理一些高频问题。
| 问题现象 | 可能原因 | 解决思路 |
|---|---|---|
nvidia-smi命令不存在 | NVIDIA 驱动未安装 | 按 4.3 节步骤安装驱动,重启后验证 |
运行 PyTorch 报CUDA error: no kernel image is available | CUDA 版本与 GPU 架构不匹配 | 升级 CUDA 或更换预装镜像,确保驱动支持目标 GPU |
报错CUDA out of memory | 显存不足 | 降低 batch_size,使用混合精度训练,或换更大显存实例 |
| 训练速度很慢,GPU 利用率低 | 数据加载或 CPU 预处理成为瓶颈 | 增加num_workers,用pin_memory=True,检查存储读写速度 |
| SSH 连接不上 | 安全组未放行 22 端口,或密钥权限不对 | 检查安全组规则;本地执行chmod 400 your-key.pem |
RuntimeError: DataLoader worker (pid(s)) exited unexpectedly | 共享内存不足 | 增加系统共享内存,或在启动容器时设置--shm-size |
| 训练结果与本地不一致 | 随机种子、PyTorch 版本、GPU 架构差异 | 设置随机种子,尽量保持一致版本 |
| 关机后模型文件丢失 | 数据写在本地磁盘,未持久化 | 将输出写入共享存储或对象存储,实例销毁前下载备份 |
5.1 排查 Checklist
遇到问题不要慌,按下面顺序排查:
- 先看
nvidia-smi输出,驱动是否正常。 - 再检查 CUDA 版本与 PyTorch 是否匹配:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"如果输出False,说明 PyTorch 没有检测到 CUDA,通常是 PyTorch 安装的是 CPU 版本,需要重装 GPU 版本。
- 查看系统日志:
dmesg | tail -20- 检查磁盘空间:
df -h- 检查内存:
free -h训练时如果内存或磁盘写满,会出现难以排查的诡异报错。
6. 最佳实践与工程建议
6.1 配置管理:把环境固化成代码
不要每次开新实例都手动敲一堆命令。推荐把环境初始化写成setup.sh:
#!/bin/bash set -e echo "=== Installing system dependencies ===" apt update apt install -y build-essential python3-pip git echo "=== Installing Miniconda ===" if [ ! -d "/opt/miniconda3" ]; then wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 fi /opt/miniconda3/bin/conda init bash echo "=== Creating conda env ===" source /root/.bashrc conda create -n gpu_env python=3.10 -y conda activate gpu_env pip install -r requirements.txt echo "=== Setup complete ==="这样新实例启动后,只需要执行:
bash setup.sh环境就自动配好。如果是团队项目,还可以用 Terraform、Ansible 等工具管理实例和配置,做到“基础设施即代码”。
6.2 训练脚本的健壮性
训练脚本至少要处理三件事:
- 断点续训:保存 checkpoint,包含模型权重、优化器状态、epoch、随机种子。
- 日志记录:把 loss、accuracy、学习率写入日志文件,方便事后分析。
- 早停机制:验证集指标不再提升时自动停止,节省算力成本。
示例保存 checkpoint 的片段:
checkpoint = { "epoch": epoch, "model_state_dict": model.state_dict(), "optimizer_state_dict": optimizer.state_dict(), "loss": loss, } torch.save(checkpoint, f"outputs/checkpoint_epoch_{epoch}.pt")6.3 成本控制最优先
AI云资源很贵,成本控制是工程化的第一课:
- 调试用小实例,训练用大实例。
- 不用时立即释放实例,避免闲置扣费。
- 长任务每天备份一次 checkpoint。
- 合理设置自动关机策略,例如任务结束后通过命令行 API 释放实例。
- 大文件优先放对象存储,不要全堆在系统盘。
6.4 安全边界
很多开发者在云上跑训练时对安全不够重视。以下几个点一定要做到:
- 使用密钥对登录,不要用简单密码。
- 安全组只放行必要的端口(22、22自定义端口等),不要对公网开放 22 以上高危端口。
- 生产环境不要用 root 直接操作,创建普通用户并赋予
sudo权限。 - 涉及外部服务的 API Key、数据库密码,使用环境变量或密钥管理服务保存,不要写进代码仓库。
- 如果团队多人共用实例,建议每个成员独立账号,并用
nvidia-smi和系统日志审计资源使用情况。
6.5 性能优化建议
训练性能优化空间很大,结合 AI云环境,下面几条最有效:
- 启用自动混合精度(AMP),在 A100/H100 等支持 Tensor Core 的 GPU 上,可以把训练速度提升 1.5 到 3 倍,同时减少显存占用。
- 升级 PyTorch 到较新版本,新版本通常对最新 GPU 架构有更好的 kernel 优化。
- 使用
torch.compile加速模型计算,前提是 PyTorch 2.x 环境。 - 数据加载使用 TFRecord 或 WebDataset 等格式,避免大量小文件随机读取。
- 多机训练时,把数据先缓存到本地 SSD,再开始训练,避免训练过程中频繁读远端存储。
下面是一个混合精度训练的示例片段:
from torch.cuda.amp import autocast, GradScaler scaler = GradScaler() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() with autocast(): output = model(data) loss = criterion(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()6.6 从单机到多机的演进
当单卡显存不够或训练时间过长时,就需要考虑分布式训练。PyTorch 的DistributedDataParallel(DDP)是目前最常用的方案。基本思路是:
- 每个进程绑定一张卡。
- 数据按卡切分,每张卡独立计算梯度。
- 通过 NCCL 通信库同步梯度。
使用 DDP 的核心代码结构大致如下(示例思路,需按实际环境调整):
import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP dist.init_process_group(backend="nccl") local_rank = int(os.environ["LOCAL_RANK"]) torch.cuda.set_device(local_rank) model = model.cuda(local_rank) model = DDP(model, device_ids=[local_rank])启动命令示例:
python -m torch.distributed.run --nproc_per_node=4 --nnodes=1 train.py如果用多台机器,还需要配置--nnodes和--node_rank。这一步建议先从单机多卡开始,确认无误后再扩展到多机。
7. 总结与下一步方向
围绕 CoreWeave、Nebius 财报所引发关注背后的技术本质,其实是 AI 算力需求增长,以及云上 GPU 服务的工程化越来越成熟。通过本篇文章,你应该已经掌握了:
- AI云与普通云主机、VPS 的核心区别。
- 云 GPU 实例的选型与成本控制思路。
- 从零在云 GPU 实例上配置深度学习环境。
- 编写并运行一个 GPU 训练脚本的完整流程。
- 常见故障的排查方式和工程落地的注意事项。
下一步,如果你希望继续深入,可以从这几个方向入手:
- 学习 PyTorch 的分布式训练机制,包括 DDP、FSDP、DeepSpeed。
- 实践模型推理优化,例如 TensorRT、vLLM、LMDeploy 等工具。
- 搭建一套完整的机器学习流水线,让数据、训练、评估、部署真正一体化。
还是要提醒一句:AI云资源不便宜,实操前一定要设置好预算和资源释放策略。建议先小规格验证,再上大算力,逐步积累经验。如果这篇文章对你有帮助,可以收藏备用,也欢迎在评论区一起交流你在云上跑训练时踩过的坑。