杭州上城区建设局网站分享站wordpress主题
杭州上城区建设局网站,分享站wordpress主题,网站设计开发平台,ppt怎么做PyTorch 2.7 CUDA镜像应用#xff1a;快速搭建图像分类实验环境
你是否也经历过这样的场景#xff1f;好不容易构思好了一个图像分类模型#xff0c;准备大干一场#xff0c;结果第一步就被环境配置卡住了。不是CUDA版本不对#xff0c;就是PyTorch和cuDNN不兼容#xf…PyTorch 2.7 CUDA镜像应用快速搭建图像分类实验环境你是否也经历过这样的场景好不容易构思好了一个图像分类模型准备大干一场结果第一步就被环境配置卡住了。不是CUDA版本不对就是PyTorch和cuDNN不兼容或者干脆连GPU都识别不出来。更让人头疼的是当你把代码发给同事对方一句“在我机器上跑不起来”瞬间让协作陷入僵局。如果你也受够了这些环境配置的“玄学”问题那么今天介绍的PyTorch 2.7 CUDA镜像可能就是你的救星。它不是一个普通的软件包而是一个开箱即用的完整深度学习环境预装了PyTorch 2.7、CUDA工具包以及所有必要的依赖。你只需要一条命令就能获得一个完全隔离、可复现、且能直接调用GPU的实验环境。本文将带你从零开始手把手教你如何使用这个镜像快速搭建一个图像分类实验环境并完成一个完整的ResNet模型训练流程。整个过程你不需要手动安装任何驱动或库真正实现“五分钟上手十分钟开跑”。1. 环境准备理解PyTorch-CUDA镜像在开始动手之前我们先花几分钟了解一下这个镜像到底是什么以及它能为我们解决什么问题。1.1 什么是PyTorch-CUDA镜像简单来说PyTorch-CUDA镜像是一个打包好的Docker容器。你可以把它想象成一个“软件集装箱”里面已经装好了运行PyTorch深度学习任务所需的一切操作系统基础通常是Ubuntu 22.04 LTSPython环境预装了Python和pipPyTorch框架指定版本的PyTorch这里是2.7.0CUDA工具包NVIDIA GPU计算平台如CUDA 12.1/12.4cuDNN库深度神经网络加速库常用工具Jupyter Notebook、SSH服务等这个“集装箱”最大的好处是环境一致性。无论你在Windows、macOS还是Linux上运行这个容器里面的环境都是一模一样的。这意味着你的代码在开发、测试、生产环境中表现完全一致彻底告别“在我机器上能跑”的尴尬。1.2 为什么选择PyTorch 2.7版本PyTorch 2.7是2024年发布的重要版本带来了几个对图像分类实验特别有用的改进性能提升torch.compile功能更加成熟可以自动优化你的模型计算图在不修改代码的情况下获得显著的推理和训练加速。对于像ResNet这样的卷积网络通常能有30%以上的性能提升。更好的硬件支持除了NVIDIA GPU还增强了对AMD ROCm和Apple Silicon的支持。不过对于大多数用户来说CUDA仍然是性能最优的选择。易用性改进许多API更加稳定错误信息更友好让调试变得更加容易。1.3 镜像的核心参数了解镜像的关键参数有助于你选择最适合的版本参数项典型值说明PyTorch版本2.7.0框架主版本包含所有新特性CUDA版本12.1GPU计算平台版本决定支持的显卡型号cuDNN版本8.9.x深度学习加速库优化卷积等操作Python版本3.10编程语言环境基础系统Ubuntu 22.04容器操作系统重要提示虽然CUDA Toolkit可能是12.4版本但PyTorch官方二进制包通常基于CUDA 12.1编译。这是为了确保最大的兼容性和稳定性不影响实际使用效果。2. 快速部署启动你的第一个容器现在让我们进入实战环节。假设你已经有一台安装了NVIDIA显卡和Docker的电脑按照以下步骤你可以在5分钟内启动并运行环境。2.1 前提条件检查在开始之前请确保你的系统满足以下要求NVIDIA显卡支持CUDA的NVIDIA GPU如RTX 20/30/40系列、Tesla系列等NVIDIA驱动已安装最新版驱动建议版本525.xx或更高Docker环境已安装Docker和NVIDIA Container Toolkit磁盘空间至少10GB可用空间你可以通过以下命令快速检查# 检查NVIDIA驱动 nvidia-smi # 检查Docker docker --version # 检查NVIDIA Container Toolkit docker run --rm --gpus all nvidia/cuda:12.1.1-base-ubuntu22.04 nvidia-smi如果这些命令都能正常执行说明你的环境已经准备就绪。2.2 拉取并启动镜像现在我们来启动PyTorch 2.7 CUDA镜像。这里我们假设你使用的是CSDN星图镜像广场提供的镜像但流程适用于任何标准的PyTorch-CUDA镜像。# 拉取镜像这里以示例镜像名为例 docker pull your-registry/pytorch-cuda:2.7 # 创建项目目录 mkdir ~/pytorch-image-classification cd ~/pytorch-image-classification # 启动容器 docker run -it --gpus all \ -p 8888:8888 \ # Jupyter Notebook端口 -p 2222:22 \ # SSH端口 -v $(pwd):/workspace \ # 挂载当前目录到容器内 --name pytorch_dev \ # 容器名称 your-registry/pytorch-cuda:2.7 \ /bin/bash让我们分解一下这些参数的含义--gpus all让容器可以访问所有GPU-p 8888:8888将容器的8888端口映射到主机的8888端口用于Jupyter-p 2222:22将容器的22端口SSH映射到主机的2222端口-v $(pwd):/workspace将当前目录挂载到容器的/workspace目录这样你在容器内修改的文件会同步到主机--name pytorch_dev给容器起个名字方便管理执行完最后一条命令后你会进入容器的bash终端看到类似这样的提示符rootcontainer-id:/workspace#恭喜你现在已经在一个完整的PyTorch 2.7 CUDA环境中了。2.3 验证GPU可用性进入容器后第一件事就是确认GPU是否正常工作# 创建一个简单的Python脚本验证环境 cat test_gpu.py EOF import torch print(PyTorch版本:, torch.__version__) print(CUDA是否可用:, torch.cuda.is_available()) if torch.cuda.is_available(): print(GPU设备数量:, torch.cuda.device_count()) print(当前GPU:, torch.cuda.get_device_name(0)) # 执行一个简单的GPU计算测试 a torch.randn(10000, 10000).cuda() b torch.randn(10000, 10000).cuda() c torch.matmul(a, b) print(GPU矩阵乘法测试完成结果形状:, c.shape) else: print(警告CUDA不可用将使用CPU模式) EOF # 运行测试脚本 python test_gpu.py如果一切正常你应该能看到类似这样的输出PyTorch版本: 2.7.0cu121 CUDA是否可用: True GPU设备数量: 1 当前GPU: NVIDIA GeForce RTX 4090 GPU矩阵乘法测试完成结果形状: torch.Size([10000, 10000])2.4 访问开发环境容器提供了两种主要的开发方式你可以根据喜好选择方式一使用Jupyter Notebook适合快速原型在容器内启动Jupyter# 在容器内执行 jupyter notebook --ip0.0.0.0 --port8888 --no-browser --allow-root然后在主机浏览器中访问http://localhost:8888输入终端显示的token即可登录。方式二使用SSH连接适合工程开发如果你习惯用VS Code、PyCharm等IDE可以通过SSH连接到容器首先在容器内设置SSH密码# 在容器内执行 passwd root # 输入你想设置的密码在主机上使用SSH连接ssh -p 2222 rootlocalhost或者在VS Code中安装Remote - SSH插件然后连接rootlocalhost:2222两种方式访问的是同一个环境你可以根据任务类型灵活选择。3. 实战演练构建图像分类实验环境准备好了现在让我们真正开始一个图像分类项目。我们将使用经典的CIFAR-10数据集训练一个ResNet-18模型。3.1 创建项目结构首先在挂载的目录中创建清晰的项目结构# 在容器内或通过挂载目录操作 cd /workspace mkdir -p {data,models,scripts,utils,notebooks}目录说明data/存放数据集models/存放模型定义scripts/存放训练、评估脚本utils/存放工具函数notebooks/存放Jupyter笔记本3.2 准备数据集PyTorch提供了方便的API来下载和加载常见数据集。我们使用CIFAR-10作为示例# scripts/download_data.py import torch from torchvision import datasets, transforms import os def prepare_cifar10(data_dir./data): 下载并准备CIFAR-10数据集 # 数据预处理 transform_train transforms.Compose([ transforms.RandomCrop(32, padding4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) transform_test transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) # 下载训练集和测试集 trainset datasets.CIFAR10( rootdata_dir, trainTrue, downloadTrue, transformtransform_train ) testset datasets.CIFAR10( rootdata_dir, trainFalse, downloadTrue, transformtransform_test ) print(f训练集大小: {len(trainset)}) print(f测试集大小: {len(testset)}) print(f类别: {trainset.classes}) return trainset, testset if __name__ __main__: trainset, testset prepare_cifar10() print(数据集准备完成)运行这个脚本下载数据python scripts/download_data.py3.3 定义模型我们将使用PyTorch自带的ResNet-18并针对CIFAR-10的32x32小图像进行调整# models/resnet_cifar.py import torch import torch.nn as nn import torchvision.models as models from torchvision.models.resnet import ResNet18_Weights class ResNetCIFAR(nn.Module): 针对CIFAR-10调整的ResNet-18模型 def __init__(self, num_classes10, pretrainedTrue): super().__init__() # 加载预训练的ResNet-18 if pretrained: self.resnet models.resnet18(weightsResNet18_Weights.IMAGENET1K_V1) else: self.resnet models.resnet18(weightsNone) # 调整第一层卷积因为CIFAR图像是32x32而不是224x224 # 同时通道数从3改为3保持不变但使用更小的卷积核和步长 self.resnet.conv1 nn.Conv2d( 3, 64, kernel_size3, stride1, padding1, biasFalse ) # 移除原来的最大池化层因为图像太小 self.resnet.maxpool nn.Identity() # 修改最后的全连接层以适应我们的类别数 in_features self.resnet.fc.in_features self.resnet.fc nn.Linear(in_features, num_classes) def forward(self, x): return self.resnet(x) def get_optimizer(self, lr0.1, momentum0.9, weight_decay5e-4): 获取优化器 return torch.optim.SGD( self.parameters(), lrlr, momentummomentum, weight_decayweight_decay ) def get_scheduler(self, optimizer, epochs): 获取学习率调度器 return torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_maxepochs) def test_model(): 测试模型是否正确 model ResNetCIFAR(num_classes10, pretrainedFalse) x torch.randn(4, 3, 32, 32) # 批量大小43通道32x32图像 output model(x) print(f输入形状: {x.shape}) print(f输出形状: {output.shape}) print(f模型参数量: {sum(p.numel() for p in model.parameters()) / 1e6:.2f}M) return model if __name__ __main__: test_model()3.4 编写训练脚本现在编写主要的训练脚本我们将利用PyTorch 2.7的新特性torch.compile来加速训练# scripts/train.py import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader import time import argparse from pathlib import Path import sys # 添加项目根目录到路径 sys.path.append(str(Path(__file__).parent.parent)) from models.resnet_cifar import ResNetCIFAR from scripts.download_data import prepare_cifar10 def train_epoch(model, train_loader, criterion, optimizer, device, epoch): 训练一个epoch model.train() running_loss 0.0 correct 0 total 0 for batch_idx, (inputs, targets) in enumerate(train_loader): inputs, targets inputs.to(device), targets.to(device) # 前向传播 optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, targets) # 反向传播 loss.backward() optimizer.step() # 统计 running_loss loss.item() _, predicted outputs.max(1) total targets.size(0) correct predicted.eq(targets).sum().item() # 每100个batch打印一次进度 if batch_idx % 100 99: print(fEpoch: {epoch} | Batch: {batch_idx1}/{len(train_loader)} | fLoss: {running_loss/100:.3f} | Acc: {100.*correct/total:.2f}%) running_loss 0.0 return 100. * correct / total def test(model, test_loader, criterion, device): 测试模型 model.eval() test_loss 0 correct 0 total 0 with torch.no_grad(): for inputs, targets in test_loader: inputs, targets inputs.to(device), targets.to(device) outputs model(inputs) loss criterion(outputs, targets) test_loss loss.item() _, predicted outputs.max(1) total targets.size(0) correct predicted.eq(targets).sum().item() accuracy 100. * correct / total avg_loss test_loss / len(test_loader) print(f测试集结果: 平均损失{avg_loss:.4f}, 准确率{accuracy:.2f}%) return accuracy def main(): parser argparse.ArgumentParser(descriptionCIFAR-10图像分类训练) parser.add_argument(--batch-size, typeint, default128, help批量大小) parser.add_argument(--epochs, typeint, default50, help训练轮数) parser.add_argument(--lr, typefloat, default0.1, help学习率) parser.add_argument(--use-compile, actionstore_true, help使用torch.compile加速) parser.add_argument(--device, typestr, defaultcuda, help设备类型) parser.add_argument(--save-dir, typestr, default./models, help模型保存目录) args parser.parse_args() # 设置设备 device torch.device(args.device if torch.cuda.is_available() else cpu) print(f使用设备: {device}) # 准备数据 print(准备数据集...) trainset, testset prepare_cifar10() train_loader DataLoader( trainset, batch_sizeargs.batch_size, shuffleTrue, num_workers2 ) test_loader DataLoader( testset, batch_sizeargs.batch_size, shuffleFalse, num_workers2 ) # 创建模型 print(创建模型...) model ResNetCIFAR(num_classes10, pretrainedTrue).to(device) # 使用torch.compile加速PyTorch 2.7新特性 if args.use_compile and torch.__version__ 2.0.0: print(使用torch.compile优化模型...) model torch.compile(model) # 损失函数和优化器 criterion nn.CrossEntropyLoss() optimizer model.get_optimizer(lrargs.lr) scheduler model.get_scheduler(optimizer, args.epochs) # 训练循环 print(开始训练...) best_acc 0.0 for epoch in range(args.epochs): start_time time.time() # 训练 train_acc train_epoch(model, train_loader, criterion, optimizer, device, epoch) # 测试 test_acc test(model, test_loader, criterion, device) # 更新学习率 scheduler.step() # 保存最佳模型 if test_acc best_acc: best_acc test_acc torch.save({ epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), accuracy: test_acc, }, f{args.save_dir}/best_model.pth) print(f保存最佳模型准确率: {test_acc:.2f}%) epoch_time time.time() - start_time print(fEpoch {epoch} 完成用时: {epoch_time:.2f}秒) print(f当前学习率: {scheduler.get_last_lr()[0]:.6f}) print(- * 60) print(f训练完成最佳准确率: {best_acc:.2f}%) # 保存最终模型 torch.save(model.state_dict(), f{args.save_dir}/final_model.pth) print(f最终模型已保存到 {args.save_dir}/final_model.pth) if __name__ __main__: main()3.5 开始训练现在一切就绪让我们开始训练模型# 在容器内执行 cd /workspace # 创建模型保存目录 mkdir -p models # 开始训练使用torch.compile加速 python scripts/train.py \ --batch-size 128 \ --epochs 50 \ --lr 0.1 \ --use-compile \ --device cuda \ --save-dir ./models训练过程中你会看到类似这样的输出使用设备: cuda 准备数据集... 训练集大小: 50000 测试集大小: 10000 类别: [airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck] 创建模型... 使用torch.compile优化模型... 开始训练... Epoch: 0 | Batch: 100/391 | Loss: 1.892 | Acc: 28.91% Epoch: 0 | Batch: 200/391 | Loss: 1.534 | Acc: 43.75% ... 测试集结果: 平均损失0.6234, 准确率78.92% 保存最佳模型准确率: 78.92% Epoch 0 完成用时: 45.23秒 当前学习率: 0.099997使用torch.compile后你会注意到训练速度有明显提升。在RTX 4090上每个epoch的时间可能从60秒减少到45秒左右提升约25%。3.6 模型推理测试训练完成后我们可以用测试集验证模型效果并展示一些预测结果# scripts/inference.py import torch import torch.nn as nn from torchvision import transforms from PIL import Image import matplotlib.pyplot as plt import numpy as np from models.resnet_cifar import ResNetCIFAR def load_model(model_path, devicecuda): 加载训练好的模型 model ResNetCIFAR(num_classes10, pretrainedFalse) model.load_state_dict(torch.load(model_path, map_locationdevice)) model model.to(device) model.eval() return model def predict_image(model, image_path, devicecuda): 预测单张图像 # CIFAR-10的类别 classes [airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck] # 预处理与训练时一致 transform transforms.Compose([ transforms.Resize((32, 32)), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) # 加载和预处理图像 image Image.open(image_path).convert(RGB) input_tensor transform(image).unsqueeze(0).to(device) # 预测 with torch.no_grad(): output model(input_tensor) probabilities torch.nn.functional.softmax(output[0], dim0) # 获取top-3预测结果 top3_prob, top3_catid torch.topk(probabilities, 3) # 显示结果 plt.figure(figsize(10, 5)) # 显示图像 plt.subplot(1, 2, 1) plt.imshow(image) plt.axis(off) plt.title(输入图像) # 显示预测结果 plt.subplot(1, 2, 2) y_pos np.arange(3) plt.barh(y_pos, top3_prob.cpu().numpy()) plt.yticks(y_pos, [classes[i] for i in top3_catid.cpu().numpy()]) plt.xlabel(概率) plt.title(Top-3 预测结果) plt.tight_layout() plt.show() print(预测结果:) for i in range(3): print(f {i1}. {classes[top3_catid[i]]}: {top3_prob[i]:.2%}) def test_accuracy(model, test_loader, devicecuda): 测试模型整体准确率 correct 0 total 0 with torch.no_grad(): for images, labels in test_loader: images, labels images.to(device), labels.to(device) outputs model(images) _, predicted torch.max(outputs.data, 1) total labels.size(0) correct (predicted labels).sum().item() accuracy 100 * correct / total print(f模型在测试集上的准确率: {accuracy:.2f}%) return accuracy if __name__ __main__: # 加载模型 device cuda if torch.cuda.is_available() else cpu model load_model(./models/best_model.pth, device) print(f模型加载完成使用设备: {device}) print(f模型参数量: {sum(p.numel() for p in model.parameters()) / 1e6:.2f}M) # 这里可以添加你自己的测试图像路径 # predict_image(model, your_image.jpg, device) # 或者测试整体准确率 from torchvision.datasets import CIFAR10 from torch.utils.data import DataLoader transform_test transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) testset CIFAR10(root./data, trainFalse, downloadTrue, transformtransform_test) test_loader DataLoader(testset, batch_size128, shuffleFalse, num_workers2) test_accuracy(model, test_loader, device)4. 实用技巧与最佳实践通过上面的实战你已经掌握了基本的使用方法。下面分享一些在实际项目中非常有用的技巧和最佳实践。4.1 性能优化技巧利用torch.compile最大化性能PyTorch 2.7的torch.compile可以显著提升训练和推理速度但需要正确使用# 最佳实践在模型定义后立即编译 model ResNetCIFAR().cuda() # 方法1使用默认设置推荐大多数情况 compiled_model torch.compile(model) # 方法2针对训练优化 compiled_model torch.compile(model, modemax-autotune) # 方法3针对推理优化 compiled_model torch.compile(model, modereduce-overhead) # 注意编译需要一些额外时间适合长时间运行的训练任务 # 对于快速实验可以先不使用编译混合精度训练混合精度训练可以大幅减少显存占用并加速训练from torch.cuda.amp import autocast, GradScaler scaler GradScaler() for inputs, targets in train_loader: inputs, targets inputs.cuda(), targets.cuda() optimizer.zero_grad() # 使用自动混合精度 with autocast(): outputs model(inputs) loss criterion(outputs, targets) # 缩放损失并反向传播 scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()4.2 容器使用最佳实践资源管理# 1. 限制GPU使用如果有多张卡 docker run -it --gpus device0,1 ... # 只使用前两张卡 # 2. 限制内存使用 docker run -it --gpus all --memory16g --memory-swap32g ... # 3. 限制CPU使用 docker run -it --gpus all --cpus4 ... # 4. 查看容器资源使用 docker stats pytorch_dev数据持久化策略# 推荐的数据目录结构 ~/projects/ ├── image-classification/ │ ├── code/ # 代码挂载到容器 │ ├── data/ # 数据集挂载到容器 │ ├── checkpoints/ # 模型检查点挂载到容器 │ └── logs/ # 训练日志挂载到容器 └── docker-compose.yml # 容器配置 # 启动命令示例 docker run -it --gpus all \ -v ~/projects/image-classification/code:/workspace/code \ -v ~/projects/image-classification/data:/workspace/data \ -v ~/projects/image-classification/checkpoints:/workspace/checkpoints \ -v ~/projects/image-classification/logs:/workspace/logs \ your-registry/pytorch-cuda:2.7使用Docker Compose简化管理创建docker-compose.yml文件version: 3.8 services: pytorch-dev: image: your-registry/pytorch-cuda:2.7 container_name: pytorch_dev runtime: nvidia shm_size: 8gb ports: - 8888:8888 # Jupyter - 2222:22 # SSH volumes: - ./code:/workspace/code - ./data:/workspace/data - ./checkpoints:/workspace/checkpoints - ./logs:/workspace/logs environment: - NVIDIA_VISIBLE_DEVICESall stdin_open: true tty: true然后一键启动docker-compose up -d4.3 常见问题解决问题1GPU无法识别# 检查步骤 import torch print(CUDA可用:, torch.cuda.is_available()) # 应该为True print(GPU数量:, torch.cuda.device_count()) # 应该大于0 print(当前GPU:, torch.cuda.get_device_name(0)) # 显示GPU型号 # 如果显示False检查 # 1. 启动容器时是否加了 --gpus all # 2. 主机是否安装了NVIDIA驱动 # 3. 是否安装了nvidia-container-toolkit问题2显存不足OOM# 解决方案 # 1. 减小批量大小 batch_size 64 # 从128减小到64 # 2. 使用梯度累积 accumulation_steps 4 for i, (inputs, targets) in enumerate(train_loader): outputs model(inputs) loss criterion(outputs, targets) / accumulation_steps loss.backward() if (i 1) % accumulation_steps 0: optimizer.step() optimizer.zero_grad() # 3. 使用混合精度训练见上文 # 4. 使用梯度检查点针对大模型 model torch.utils.checkpoint.checkpoint_sequential(model, chunks4, inputx)问题3训练速度慢# 优化建议 # 1. 增加DataLoader的num_workers train_loader DataLoader(dataset, batch_size128, shuffleTrue, num_workers4, # 增加worker数量 pin_memoryTrue) # 使用锁页内存 # 2. 使用torch.compile model torch.compile(model) # 3. 使用CUDA Graph高级优化 g torch.cuda.CUDAGraph() with torch.cuda.graph(g): static_output model(static_input) static_loss criterion(static_output, static_target) static_loss.backward()5. 总结通过本文的实践你已经掌握了使用PyTorch 2.7 CUDA镜像快速搭建图像分类实验环境的完整流程。让我们回顾一下关键要点环境搭建的优势开箱即用无需手动安装CUDA、cuDNN、PyTorch等复杂依赖环境一致确保开发、测试、生产环境完全一致快速部署一条命令即可获得完整的深度学习环境资源隔离每个项目独立环境避免依赖冲突PyTorch 2.7的新特性torch.compile成熟自动优化计算图显著提升训练和推理速度更好的硬件支持全面支持NVIDIA、AMD和Apple SiliconAPI更加稳定减少版本兼容性问题实战经验总结数据准备是关键合理的数据预处理和增强能大幅提升模型性能利用新特性积极使用torch.compile和混合精度训练资源管理很重要合理设置批量大小、学习率等超参数持久化数据确保代码、数据和模型都保存在挂载目录中下一步学习建议尝试更多模型除了ResNet还可以尝试EfficientNet、Vision Transformer等探索更多数据集从CIFAR-10扩展到ImageNet、自定义数据集学习模型部署将训练好的模型部署为API服务尝试分布式训练学习使用多GPU或多节点训练使用容器化镜像进行深度学习开发已经成为现代AI工程的标准实践。它不仅简化了环境配置更重要的是为团队协作、持续集成和模型部署提供了坚实的基础。随着PyTorch生态的不断发展这种开发模式只会变得越来越重要。现在你已经拥有了一个强大的实验环境可以专注于模型创新和算法优化而不是环境配置的琐事。开始你的下一个图像分类项目吧获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。