DAMODEL——创建云实例与部署深度学习模型的详细指南

使用 DAMODEL 控制台创建云实例与部署深度学习模型的详细指南

本文将逐步介绍如何使用 DAMODEL 控制台创建云实例、配置 SSH 密钥、上传与下载数据集、以及基于 UNet 网络进行眼底血管分割的完整流程。此指南适用于需要在云端进行深度学习训练的用户,提供详细的操作步骤及代码示例,帮助你快速上手 DAMODEL 平台。


1. 云实例:配置选型与启动

1.1 注册与登录

首先,进入 DAMODEL 的官方网站并进行注册。完成注册后,使用你的账号登录控制台。

  1. 打开 DAMODEL 控制台,找到“GPU 云实例”部分。
    image-20240924134750660
  2. 点击创建实例,按需选择 GPU 资源,如 NVIDIA RTX 4090。
  3. 在镜像配置中选择深度学习框架(例如 PyTorch)的预配置镜像,这样可以省去手动安装依赖的麻烦。
  4. image-20240924140322235

1.2 配置 SSH 密钥对

为了方便后续的远程登录,使用 SSH 密钥验证而非密码登录。

  1. 进入本地终端,使用以下命令创建本地公钥和私钥:

    cd ~/.ssh
    ssh-keygen -o
    

    你可以选择将文件命名为 id_dsa,或使用其他名称。

    image-20240924140027595

  2. .ssh 目录中你会看到两个文件:id_dsa(私钥)和 id_dsa.pub(公钥)。

  3. 进入 DAMODEL 控制台的密钥对配置页面,选择创建密钥对。将 id_dsa.pub 文件中的公钥内容复制到 DAMODEL 控制台上。

1.3 创建云实例

进入 GPU 云实例部分,点击“创建实例”。在配置页面选择所需的 GPU 型号、内存、存储空间等资源配置。确保在密钥对选项中选择之前创建的 SSH 密钥对。

  1. GPU 选型:推荐根据模型的计算需求选择高性能 GPU,比如 NVIDIA RTX 系列。
  2. 镜像配置:选择包含 PyTorch 的镜像,避免手动安装深度学习框架。
  3. 密钥:选择先前配置的 SSH 密钥对。

确认配置后,点击“立即创建”,等待实例启动。

1.4 登录云实例

实例创建完成后,你将看到一个访问链接。使用任何支持 SSH 的工具(如终端、VSCode 等)连接到云实例。

使用以下命令登录到实例:

ssh -i ~/.ssh/id_dsa root@<instance_ip>

成功登录后,运行以下命令验证 GPU 和 CUDA 是否可用:

nvidia-smi
python -c "import torch; print(torch.cuda.is_available())"

如果看到 GPU 显示信息和 True,则说明云实例已正确配置。

image-20240924140445165


2. 云存储:数据集上传与下载

DAMODEL 提供文件存储服务,允许你在不同实例之间共享数据。相比本地数据盘,云存储的优势在于:

  • 多实例共享:可以在不同实例中访问相同的数据,便于协作。
  • 数据安全:数据有多副本冗余,可靠性更高。

但是,文件存储的 IO 性能可能不如本地盘。因此建议将训练数据先拷贝到本地数据盘再进行训练,以提高 IO 性能。

2.1 上传数据集

你可以使用 scp 命令将本地的数据集上传到云实例的数据盘中。

scp -rP <port_number> <local_data_path> root@<instance_ip>:/root/workspace

示例:

scp -rP 35740 ./DRIVE-SEG-DATA [email protected]:/root/workspace

这里:

  • 35740 是 SSH 端口号。
  • ./DRIVE-SEG-DATA 是本地数据集路径。
  • /root/workspace 是远程实例中的目标路径。

2.2 下载数据集

数据下载的命令与上传类似:

scp -rP <port_number> root@<instance_ip>:/root/workspace ./local_data_path

示例:

scp -rP 35740 [email protected]:/root/workspace ./DRIVE-SEG-DATA

3. 云开发:眼底血管分割案例

3.1 案例背景

眼底图像分割是医学影像分析中的一个重要任务,特别是在检测视网膜血管时。UNet 网络结构因其强大的分割能力而被广泛应用于医学图像分割任务中。本文通过 DAMODEL 部署深度学习模型,演示如何使用 UNet 网络进行眼底血管分割。

3.2 网络结构

我们将使用 PyTorch 框架搭建 UNet 网络,以下是网络结构的代码:

class UNet(nn.Module):
    def __init__(self, n_channels, n_classes, bilinear=True):
        super(UNet, self).__init__()
        self.n_channels = n_channels
        self.n_classes = n_classes
        self.bilinear = bilinear

        self.inc = DoubleConv(n_channels, 64)
        self.down1 = Down(64, 128)
        self.down2 = Down(128, 256)
        self.down3 = Down(256, 512)
        self.down4 = Down(512, 512)
        self.up1 = Up(1024, 256, bilinear)
        self.up2 = Up(512, 128, bilinear)
        self.up3 = Up(256, 64, bilinear)
        self.up4 = Up(128, 64, bilinear)
        self.outc = OutConv(64, n_classes)

    def forward(self, x):
        x1 = self.inc(x)
        x2 = self.down1(x1)
        x3 = self.down2(x2)
        x4 = self.down3(x3)
        x5 = self.down4(x4)
        x = self.up1(x5, x4)
        x = self.up2(x, x3)
        x = self.up3(x, x2)
        x = self.up4(x, x1)
        logits = self.outc(x)
        return logits

3.3 网络训练

以下是基于 PyTorch 框架的训练代码。它将加载数据集、训练 UNet 模型,并保存最佳模型。

def train_net(net, device, data_path, epochs=40, batch_size=1, lr=0.00001):
    dataset = DatasetLoader(data_path)
    train_loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)
    optimizer = optim.Adam(net.parameters(), lr=lr)
    criterion = nn.BCEWithLogitsLoss()
    best_loss = float('inf')

    for epoch in range(epochs):
        net.train()
        epoch_loss = 0
        for image, label in train_loader:
            optimizer.zero_grad()
            image = image.to(device)
            label = label.to(device)
            pred = net(image)
            loss = criterion(pred, label)
            loss.backward()
            optimizer.step()
            epoch_loss += loss.item()

        print(f"Epoch {
      
      epoch+1}, Loss: {
      
      epoch_loss}")
        if epoch_loss < best_loss:
            best_loss = epoch_loss
            torch.save(net.state_dict(), 'best_model.pth')

    print("Training complete. Best loss:", best_loss)

你可以在训练结束后,通过以下方式可视化损失曲线:

import matplotlib.pyplot as plt
plt.plot(loss_record)
plt.title('Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.savefig('/root/shared-storage/results/training_loss.png')

3.4 模型测试

在测试阶段,主要使用 IoU(交并比)指标来评估模型性能。

def cal_miou(test_dir, pred_dir, gt_dir, model_path):
    # Load model and prepare for testing
    net = UNet(n_channels=1, n_classes=1)
    net.load_state_dict(torch.load(model_path))
    net.eval()

    for image_id in os.listdir(test_dir):
        img = cv2.imread(os.path.join(test_dir, image_id), cv2.IMREAD_GRAYSCALE)
        pred = net(torch.from_numpy(img).unsqueeze(0).float())
        # Post-process and save results

测试结果将输出 IoU 计算值,帮助你判断模型的分割效果。

image-20240924140607328


id), cv2.IMREAD_GRAYSCALE)
pred = net(torch.from_numpy(img).unsqueeze(0).float())
# Post-process and save results


测试结果将输出 IoU 计算值,帮助你判断模型的分割效果。

[外链图片转存中...(img-QwvgExY6-1727158012004)]

---

通过此指南,你可以在 DAMODEL 上完成从实例创建、数据处理到模型训练和测试的整个深度学习开发流程。

猜你喜欢

转载自blog.csdn.net/Skrrapper/article/details/142488273