前言
本教程面向有一定Python基础但首次使用云GPU平台的开发者,通过CIFAR-10图像分类完整项目,手把手教你在智星云平台完成环境配置→数据准备→模型训练→部署推理全流程。教程包含可直接运行的代码、平台操作步骤和深度学习实战技巧,新手也能快速上手云GPU训练。
第一章 智星云平台入门
1.1 平台概述与优势
智星云是国内主流GPU算力服务平台,专为深度学习、AI训练设计,核心优势:
-
低成本:按需计费,最低0.5元/小时,用完释放实例不扣费
-
免配置:预装PyTorch/TensorFlow/CUDA,开箱即用
-
高算力:支持RTX 3090/4090、A100、V100等旗舰GPU
-
易操作:Web SSH、Jupyter一键连接,新手零门槛
1.2 注册与登录
-
访问智星云官网,点击右上角注册
-
手机号/邮箱验证,完成实名认证
-
新用户领取50元代金券(平台活动为准)
-
登录进入控制台
1.3 控制台核心功能
-
实例管理:创建/启动/停止/删除GPU实例
-
镜像市场:选择深度学习预装环境
-
存储管理:上传数据集、保存模型
-
远程连接:Web SSH、Jupyter、端口映射
1.4 创建GPU实例(新手推荐配置)
步骤1:选择配置
# 性价比最高配置(CIFAR-10训练专用)
GPU型号:NVIDIA RTX 3090 (24GB显存)
CPU:8核
内存:32GB
系统盘:50GB
数据盘:100GB
步骤2:选择镜像
优先选择:PyTorch 1.12 + CUDA 11.6 + Python 3.8
(已预装torch、torchvision、jupyter、tensorboard)
步骤3:网络配置
-
勾选分配公网IP
-
开放端口:22(SSH)、6006(TensorBoard)、8888(Jupyter)
步骤4:启动实例
点击「立即创建」,等待2-3分钟,状态变为运行中即可使用。
1.5 连接实例(3种方式)
方式1:Web SSH(新手首选)
实例列表点击「远程连接」,浏览器直接打开终端,无需本地配置。
方式2:本地SSH连接
# 控制台获取信息
公网IP:123.456.789.0(示例)
用户名:root
密码:自定义设置
# 本地终端连接
ssh root@123.456.789.0 -p 22
方式3:Jupyter Notebook
# SSH终端执行
jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root
# 本地浏览器访问
http://公网IP:8888
# 输入终端显示的token即可
第二章 环境配置与验证
连接实例后,第一步验证GPU环境,确保深度学习工具正常运行。
2.1 基础环境检查
# 查看GPU状态(核心命令)
nvidia-smi
# 预期输出:显示RTX 3090、CUDA 11.6、24GB显存
# 验证CUDA
nvcc --version
# 验证Python
python --version # 必须3.8+
2.2 Python深度学习环境验证
创建test_env.py测试脚本:
import torch
import torchvision
print("Python版本:", torch.__version__)
print("CUDA是否可用:", torch.cuda.is_available())
print("GPU型号:", torch.cuda.get_device_name(0))
print("GPU数量:", torch.cuda.device_count())
# 测试GPU计算
x = torch.randn(1000,1000).cuda()
y = torch.randn(1000,1000).cuda()
z = torch.mm(x, y)
print("计算设备:", z.device)
运行测试:
python test_env.py
✅ 成功标准:CUDA available: True,显示RTX 3090。
2.3 安装额外依赖
# 更新pip
pip install --upgrade pip
# 安装必备工具
pip install tqdm matplotlib opencv-python scikit-learn rich
2.4 创建项目目录
# 一键创建规范目录
mkdir -p ~/cnn_project/{data,models,scripts,logs,notebooks}
cd ~/cnn_project
目录说明:
-
data/:存放数据集 -
models/:保存训练好的模型 -
scripts/:训练/推理脚本 -
logs/:训练日志、可视化结果
第三章 数据准备与预处理
本教程使用CIFAR-10经典数据集(10分类、6万张32×32彩色图),无需手动上传。
3.1 下载CIFAR-10
创建scripts/download_data.py:
import torchvision
from torchvision import datasets
def download_data():
# 下载训练集+测试集
train_set = datasets.CIFAR10(root='../data', train=True, download=True)
test_set = datasets.CIFAR10(root='../data', train=False, download=True)
print("训练集数量:", len(train_set))
print("测试集数量:", len(test_set))
print("10个类别:", train_set.classes)
if __name__ == "__main__":
download_data()
运行下载:
cd ~/cnn_project/scripts
python download_data.py
下载完成后,数据自动保存在../data/目录。
3.2 自定义数据集(适配真实场景)
如果使用自己的图片数据,按以下结构整理:
data/
├── train/
│ ├── cat/
│ ├── dog/
│ └── bird/
└── val/
├── cat/
├── dog/
└── bird/
3.3 数据增强(提升模型精度)
训练时自动应用:随机裁剪、水平翻转、颜色抖动、归一化。
第四章 CNN模型构建
提供两种方案:从零构建CNN、迁移学习(预训练模型)。
4.1 自定义CNN模型
创建scripts/custom_cnn.py:
import torch
import torch.nn as nn
class CustomCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
# 4组卷积+池化层
self.conv_layers = nn.Sequential(
nn.Conv2d(3,32,3,padding=1), nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(2),
nn.Conv2d(32,64,3,padding=1), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2),
nn.Conv2d(64,128,3,padding=1), nn.BatchNorm2d(128), nn.ReLU(), nn.MaxPool2d(2),
nn.Conv2d(128,256,3,padding=1), nn.BatchNorm2d(256), nn.ReLU(), nn.MaxPool2d(2),
)
# 全局池化+分类器
self.gap = nn.AdaptiveAvgPool2d(1)
self.classifier = nn.Sequential(
nn.Dropout(0.5), nn.Linear(256,128), nn.ReLU(),
nn.Dropout(0.5), nn.Linear(128, num_classes)
)
def forward(self, x):
x = self.conv_layers(x)
x = self.gap(x).view(x.size(0),-1)
return self.classifier(x)
4.2 迁移学习(高精度首选)
创建scripts/pretrained_model.py,加载ResNet18预训练权重:
from torchvision import models
import torch.nn as nn
def get_resnet18(num_classes=10):
model = models.resnet18(pretrained=True)
# 替换最后一层适配10分类
in_features = model.fc.in_features
model.fc = nn.Linear(in_features, num_classes)
return model
第五章 训练流程实现
完整训练脚本,包含:数据加载、训练/验证、TensorBoard监控、模型保存。
5.1 核心训练脚本
创建scripts/train.py(直接复制运行):
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
from tqdm import tqdm
from custom_cnn import CustomCNN
from pretrained_model import get_resnet18
import os
from torch.utils.tensorboard import SummaryWriter
# 1. 配置参数
EPOCHS = 50
BATCH_SIZE = 128
LR = 0.001
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 2. 数据加载+增强
def get_dataloader():
train_transform = transforms.Compose([
transforms.RandomCrop(32,padding=4),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.4914,0.4822,0.4465),(0.2023,0.1994,0.2010))
])
test_transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.4914,0.4822,0.4465),(0.2023,0.1994,0.2010))])
train_set = datasets.CIFAR10('../data',train=True,transform=train_transform)
test_set = datasets.CIFAR10('../data',train=False,transform=test_transform)
train_loader = DataLoader(train_set,BATCH_SIZE,shuffle=True,num_workers=4,pin_memory=True)
test_loader = DataLoader(test_set,BATCH_SIZE,shuffle=False,num_workers=4,pin_memory=True)
return train_loader, test_loader
# 3. 训练一个epoch
def train_one_epoch(model,loader,criterion,optimizer):
model.train()
total_loss,correct,total=0,0,0
for images,labels in tqdm(loader,desc="训练中"):
images,labels=images.to(DEVICE),labels.to(DEVICE)
optimizer.zero_grad()
outputs=model(images)
loss=criterion(outputs,labels)
loss.backward()
optimizer.step()
total_loss+=loss.item()
_,pred=outputs.max(1)
correct+=pred.eq(labels).sum().item()
total+=labels.size(0)
return total_loss/len(loader), 100*correct/total
# 4. 验证
def validate(model,loader,criterion):
model.eval()
total_loss,correct,total=0,0,0
with torch.no_grad():
for images,labels in tqdm(loader,desc="验证中"):
images,labels=images.to(DEVICE),labels.to(DEVICE)
outputs=model(images)
loss=criterion(outputs,labels)
total_loss+=loss.item()
_,pred=outputs.max(1)
correct+=pred.eq(labels).sum().item()
total+=labels.size(0)
return total_loss/len(loader), 100*correct/total
# 5. 主函数
def main():
train_loader,test_loader=get_dataloader()
# 选择模型:custom / resnet18
model=CustomCNN().to(DEVICE)
# model=get_resnet18().to(DEVICE)
criterion=nn.CrossEntropyLoss()
optimizer=optim.Adam(model.parameters(),lr=LR)
scheduler=optim.lr_scheduler.CosineAnnealingLR(optimizer,T_max=EPOCHS)
writer=SummaryWriter('../logs')
os.makedirs('../models',exist_ok=True)
best_acc=0
print(f"训练设备:{DEVICE},批次大小:{BATCH_SIZE}")
for epoch in range(EPOCHS):
train_loss,train_acc=train_one_epoch(model,train_loader,criterion,optimizer)
val_loss,val_acc=validate(model,test_loader,criterion)
scheduler.step()
print(f"Epoch {epoch+1}/{EPOCHS}")
print(f"训练 Loss:{train_loss:.4f} Acc:{train_acc:.2f}%")
print(f"验证 Loss:{val_loss:.4f} Acc:{val_acc:.2f}%")
# 保存最佳模型
if val_acc>best_acc:
best_acc=val_acc
torch.save(model.state_dict(),'../models/best_model.pth')
print(f"✅ 保存最佳模型,准确率:{best_acc:.2f}%")
writer.close()
print(f"\n训练完成!最佳验证准确率:{best_acc:.2f}%")
if __name__=="__main__":
main()
5.2 启动训练
cd ~/cnn_project/scripts
python train.py
训练过程会自动打印损失值、准确率,最佳模型保存在../models/。
5.3 TensorBoard监控训练
# 启动可视化
tensorboard --logdir=../logs --port=6006 --bind_all
本地浏览器访问:http://公网IP:6006,实时查看精度、损失曲线。
第六章 模型评估与优化
6.1 模型详细评估
创建scripts/evaluate.py,生成混淆矩阵、分类报告:
import torch
import numpy as np
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
from custom_cnn import CustomCNN
def evaluate():
# 加载模型
model = CustomCNN()
model.load_state_dict(torch.load('../models/best_model.pth'))
model.to(DEVICE)
model.eval()
# 加载测试数据
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.4914,0.4822,0.4465),(0.2023,0.1994,0.2010))])
test_set = datasets.CIFAR10('../data',train=False,transform=transform)
test_loader = DataLoader(test_set,128,shuffle=False)
preds, labels = [], []
with torch.no_grad():
for img,label in test_loader:
img=img.to(DEVICE)
pred=model(img).argmax(1)
preds.extend(pred.cpu().numpy())
labels.extend(label.numpy())
# 打印分类报告
print(classification_report(labels,preds))
if __name__=="__main__":
evaluate()
6.2 精度优化技巧
-
使用迁移学习:ResNet18精度可达92%+
-
学习率调度:余弦退火、阶梯下降
-
数据增强:更多翻转、裁剪、噪声
-
早停机制:防止过拟合
-
混合精度训练:加速30%-50%
第七章 部署与推理
训练完成后,用模型预测新图片。
7.1 单张图像推理
创建scripts/inference.py:
from PIL import Image
import torch
from torchvision import transforms
from custom_cnn import CustomCNN
class Classifier:
def __init__(self):
self.classes = ['飞机','汽车','鸟','猫','鹿','狗','青蛙','马','船','卡车']
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
self.model = CustomCNN().to(self.device)
self.model.load_state_dict(torch.load('../models/best_model.pth'))
self.model.eval()
self.transform = transforms.Compose([
transforms.Resize((32,32)),
transforms.ToTensor(),
transforms.Normalize((0.4914,0.4822,0.4465),(0.2023,0.1994,0.2010))
])
def predict(self, img_path):
img = Image.open(img_path).convert('RGB')
img = self.transform(img).unsqueeze(0).to(self.device)
with torch.no_grad():
output = self.model(img)
pred = output.argmax(1).item()
prob = torch.softmax(output,dim=1)[0][pred].item()
return self.classes[pred], prob
# 测试
if __name__=="__main__":
classifier = Classifier()
result, confidence = classifier.predict('test.jpg')
print(f'预测结果:{result},置信度:{confidence:.2%}')
使用方法:上传一张测试图到服务器,运行脚本即可输出分类结果。
第八章 成本控制与最佳实践
8.1 成本优化(必看)
-
用完即停:训练完成立即停止/删除实例,避免扣费
-
选择合适GPU:小模型用T4/3060,大模型用3090/A100
-
使用代金券:新用户50元可免费训练数十小时
-
数据缓存:数据集存数据盘,避免重复下载
8.2 常见问题解决
-
显存不足(OOM):减小batch_size(128→64→32)
-
训练慢:设置
num_workers=4、pin_memory=True -
精度低:更换预训练模型、调大epoch、增强数据
8.3 项目收尾清单
✅ 停止GPU实例
✅ 下载最佳模型到本地
✅ 保存训练日志和可视化结果
✅ 清理无用数据,释放存储空间
总结
本教程完整实现了智星云GPU平台+CNN图像分类全流程,你已掌握:
-
智星云GPU实例创建、连接、环境配置
-
图像数据集加载、增强、预处理
-
自定义CNN/迁移学习模型构建
-
模型训练、监控、评估、优化
-
模型部署推理与成本控制
这套流程可直接迁移到真实项目(如垃圾分类、人脸识别、工业缺陷检测),只需替换数据集即可快速训练高精度模型。