diff --git a/tutorials/source_zh_cn/index.rst b/tutorials/source_zh_cn/index.rst index cda62e5bbf804b411cb67d85895b96e4b1651a80..84908ba3a02a457211e3c54afa1a04b6d7bca5cc 100644 --- a/tutorials/source_zh_cn/index.rst +++ b/tutorials/source_zh_cn/index.rst @@ -134,6 +134,7 @@ MindSpore教程 :hidden: model_migration/model_migration + model_migration/pytorch_to_mindspore cv nlp generative diff --git a/tutorials/source_zh_cn/model_migration/pytorch_to_mindspore.md b/tutorials/source_zh_cn/model_migration/pytorch_to_mindspore.md new file mode 100644 index 0000000000000000000000000000000000000000..18d4a96860208616029bd90c2e14bfd6344b3b8f --- /dev/null +++ b/tutorials/source_zh_cn/model_migration/pytorch_to_mindspore.md @@ -0,0 +1,197 @@ +# 从 PyTorch 到 MindSpore 的模型迁移指南 + +## 概述 + +随着 AI 芯片生态的发展,MindSpore 作为华为推出的全场景 AI 框架,在昇腾芯片上展现出优异的性能。本文针对医学影像分割场景,详细讲解如何将 PyTorch 模型迁移至 MindSpore 框架,主要优势包括: + +- 原生支持昇腾芯片的图模式加速 +- 自动微分与并行训练优化 +- 端边云统一部署能力 + +## 一、迁移准备 + +### 1.1 基础学习 + +#### 重点掌握 + +- 张量操作的设备感知特性 +- 自动微分实现机制 +- 混合精度训练配置方法 + +### 1.2 环境配置 + +```bash +# 创建隔离环境 +conda create -n {your_env_name} python=3.9 +conda activate {your_env_name} + +# 安装GPU版本框架 +pip install mindspore==2.2.0 +``` + +## 二、关键迁移步骤 + +### 2.1 数据加载适配 + +#### PyTorch 与 MindSpore 接口对比 + +| 功能 | PyTorch 接口 | MindSpore 等效实现 | +|--------------------|--------------------------|--------------------------| +| 数据集构建 | `torch.utils.data.Dataset` | `mindspore.dataset.GeneratorDataset` | +| 数据增强 | `torchvision.transforms` | `mindspore.dataset.vision` 套件 | +| 并行加载 | `DataLoader(num_workers=N)` | `dataset.batch(N).shuffle()` | + +#### 代码示例 + +
+
+```python
+import mindspore.dataset as ds
+from mindspore.dataset.vision import RandomResizedCrop, HWC2CHW
+
+class MedicalDataset:
+    """医学影像数据集加载类"""
+    def __init__(self, data_dir):
+        self.img_paths = load_data_paths(data_dir)  # 自定义路径加载
+        self.transforms = ds.transforms.Compose([
+            RandomResizedCrop(size=(224, 224)),
+            HWC2CHW()
+        ])
+
+    def __getitem__(self, index):
+        """
+        返回预处理后的数据样本
+        Args:
+            index (int): 数据索引
+        Returns:
+            (image_tensor, label_tensor)
+        """
+        img = Image.open(self.img_paths[index])
+        return self.transforms(img), self.labels[index]
+
+# 创建可迭代数据集
+dataset = ds.GeneratorDataset(
+    source=MedicalDataset('./data'),
+    column_names=["image", "label"],
+    shuffle=True
+).batch(32)
+```
+
+
+ + +### 2.2 网络结构转换 + +#### 2.2.1 关键差异点解析 + +**卷积层参数差异** + + ```python +# PyTorch 实现 +nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1) + +# MindSpore 等效实现 +nn.Conv2d(3, 64, kernel_size=3, stride=2, pad_mode='pad', padding=1) +``` + +**插值操作实现** + +```python +# PyTorch 双线性插值 +F.interpolate(x, scale_factor=2, mode='bilinear') + +# MindSpore 等效实现 +nn.ResizeBilinear(align_corners=True)(x) +``` + +#### 2.2.2 迁移检查清单 + +**逐层验证输入输出维度匹配度** + +```python +print("PyTorch layer output:", pytorch_out.shape) +print("MindSpore layer output:", mindspore_out.shape) +``` + +### 2.3 训练流程改造 + +#### 训练步骤对比 + +```python +# PyTorch 训练步骤 +optimizer.zero_grad() +loss.backward() +optimizer.step() + +# MindSpore 自动微分流程 +grad_fn = ms.value_and_grad(forward_fn, None, optimizer.parameters) +loss, grads = grad_fn(data, label) +optimizer(grads) +``` + +#### 自动微分实现示例 + +```python +import mindspore as ms +from mindspore import nn + +class TrainStep(nn.Cell): + """自定义训练步骤""" + def __init__(self, network, optimizer): + super().__init__() + self.network = network + self.optimizer = optimizer + self.grad_fn = ms.value_and_grad(network, None, optimizer.parameters) + + def construct(self, data, label): + """执行单步训练""" + loss, grads = self.grad_fn(data, label) + self.optimizer(grads) + return loss +``` + +## 三、调试与优化 + +### 3.1 常见问题排查表 + +| 问题现象 | 解决方案 | 验证方法 | +|--------------------------|----------------------------|----------------------| +| 输出维度不匹配 | 逐层对比网络结构 | `Tensor.shape` 检查 | +| 梯度异常波动 | 检查权重初始化方式 | 统计参数分布直方图 | +| 性能显著下降 | 验证数据预处理一致性 | 输入数据归一化检查 | + +### 3.2 性能优化技巧 + +**混合精度训练** + +```python +from mindspore.amp import DynamicLossScaler + +loss_scaler = DynamicLossScaler(scale_value=1024, scale_factor=2) +``` + +**图模式加速** + + ```python +ms.set_context(mode=ms.GRAPH_MODE) +``` + +## 四、案例:3D UNet 迁移 + +### 4.1 关键代码差异 + +#### 损失函数实现 + +```python +class DiceLoss(nn.LossBase): + """三维 Dice 损失实现""" + def construct(self, pred, target): + intersection = (pred * target).sum(axis=(2,3,4)) + union = pred.sum(axis=(2,3,4)) + target.sum(axis=(2,3,4)) + return 1 - (2. * intersection) / (union + 1e-8) +``` + +## 五、资源推荐 + +- [MindSpore 模型仓](https://gitee.com/mindspore/models) +- [昇腾开发者社区](https://hiascend.com)