MS-Train【2】:nnFormer


前言

本文主要记载 nnFormer 从安装到训练再到推理的过程。nnFormer 的环境十分难配,训练和推理都是 2 行代码搞定,要想成功训练 nnFormer,首先得确保自己的环境配置的没有问题。

有关 nnFormer 网络结构的讲解,可以看我的另一篇文章:MS-Model【2】:nnFormer


1. 安装

  • 官方系统版本
    • Ubuntu 18.01、Python 3.6、PyTorch 1.8.1 和 CUDA 10.1 。有关软件包和版本号的完整列表,请参阅 Conda 环境文件 environment.yml。
  • 安装步骤
  1. 在服务器上创建路径 nnFormerFrame
  2. 进入创建好的路径,克隆项目到服务器
    • 需要注意的是,可能需要使用国内一些加速的镜像网站才能比较流畅的 clone 到自己的服务器上
cd /root/nnFormerFrame

git clone https://github.com/282857341/nnFormer.git
  1. 进入 clone 好的文件路径
cd nnFormer
  1. 使用 environment.yml 创建作者所提供的虚拟环境
conda env create -f environment.yml
  • 需要注意的是,这里可能会出现如下错误
Collecting package metadata (repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/repodata.json>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
  • 修改 .condarc 文件内容如下即可正常下载
channels:
  - defaults
show_channel_urls: true
channel_alias: http://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  1. 进入虚拟环境
source activate nnFormer
  1. 执行安装指令
pip install -e .

2. 训练与测试

2.1. 数据处理

2.1.1. 整理数据路径

  • 进入创建的 nnFormerFrame 文件路径
cd /root/nnFormerFrame
  • 创建一个名为 DATASET 的文件夹
  • 进入创建好的 DATASET 文件夹
    • 依次创建
      • nnFormer_preprocessed - 存放原始数据预处理之后的数据
      • nnFormer_raw - 存放原始的训练的数据
      • nnFormer_trained_models - 存放训练的结果
  • 进入 nnFormer_raw
    • 依次创建
      • nnFormer_cropped_data - crop 以后的数据
      • nnFormer_raw_data - 原始数据
  • 最终的文件结构如图所示:
    在这里插入图片描述

2.1.2. 设置 nnFormer 读取文件的路径

  • 进入 .bashrc 文件,在文件末尾添加如下命令:
export nnFormer_raw_data_base="/root/nnFormerFrame/DATASET/nnFormer_raw"
export nnFormer_preprocessed="/root/nnFormerFrame/DATASET/nnFormer_preprocessed"
export RESULTS_FOLDER="/root/nnFormerFrame/DATASET/nnFormer_trained_models"
  • 更新资源:
source .bashrc

2.1.3. 数据集预处理

本实验使用的是医学图像十项全能 Task01_BrainTumour

  • 为了符合 nnFormer 的设置,修改解压缩之后的文件的文件名 Task03_tumor
  • 转换数据集,让它可以被 nnFormer 识别:
nnFormer_convert_decathlon_task -i /root/nnFormerFrame/DATASET/nnFormer_raw/nnFormer_raw_data/Task03_tumor
  • 进行插值等操作
nnFormer_plan_and_preprocess -t 3

需要注意的是,这一步如果有提示有包没有安装成功,基本上可以确定是先前的环境没有配好,如果有出现报错请试着重新配一下环境

2.2. 训练

2.2.1. 训练代码

修改 train_inference.sh

  • 训练的时候需要注释掉 predict
  • 修改路径为 clone 下来的代码的绝对路径
if ${train}
then

	cd /root/nnFormerFrame/nnFormer/nnformer/
	CUDA_VISIBLE_DEVICES=${cuda} nnFormer_train 3d_fullres nnFormerTrainerV2_${name} ${task} 0
fi

进入 train_inference.sh 所在的路径,并执行训练代码:

cd /root/autodl-tmp/model/nnFormerFrame/nnFormer

bash train_inference.sh -c 0 -n nnformer_tumor -t 3
  • -c stands for the index of your cuda device
  • -n denotes the suffix of the trainer located at nnFormer/nnformer/training/network_training/
  • -t denotes the task index

训练结果

  • 训练曲线
    • 仅供参考
      在这里插入图片描述
  • 训练 log
2022-12-26 03:34:09.397115: 
epoch:  499 
2022-12-26 03:38:00.715099: train loss : -0.7295 
2022-12-26 03:38:09.692853: validation loss: -0.6596 
2022-12-26 03:38:09.693858: Average global foreground Dice: [0.8460535474680709, 0.6899365868487455, 0.8608222877365227] 
2022-12-26 03:38:09.693989: (interpret this as an estimate for the Dice of the different classes. This is not exact.) 
2022-12-26 03:38:11.205323: lr: 0.0 
2022-12-26 03:38:11.205581: current best_val_eval_criterion_MA is 0.79020 
2022-12-26 03:38:11.205669: current val_eval_criterion_MA is 0.7898 
2022-12-26 03:38:11.205743: This epoch took 241.808557 s

2.2.2. 可能出现的问题及解决办法

  1. 从头开始训练,不使用预训练权重
  • 修改 /root/nnFormerFrame/nnFormer/nnformer/training/network_training/ 路径下的 nnFormerTrainerV2_nnformer_tumor.py 的文件
self.load_pretrain_weight = False
  • 同时,如果只是想要跑通 nnFormer 并获得一个可视化的结果的话,可以不用训练那么个 epochs
    • 我在训练的时候将 epochs 设置为了 500
    • 具体情况具体分析
self.max_num_epochs = 500
  1. 出现 RunTimeError
    在这里插入图片描述
  • 检查以下两个文件:
    • /root/nnFormerFrame/DATASET/nnFormer_preprocessed/Task003_tumor/nnFormerData_plans_v2.1_stage0
    • /root/nnFormerFrame/DATASET/nnFormer_preprocessed/Task003_tumor/nnFormerData_plans_v2.1_2D_stage0
  • 发现存在 .npy 结尾的文件,根据 issue 中的解决办法,删除这些 .npy 结尾的文件即可
  1. 出现 EOFError
  • 我刚开始使用 RTX3090 服务器进行训练,在训练的最后一步会报如下错:
NVIDIA GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70.
If you want to use the NVIDIA GeForce RTX 3090 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
  • 可以确定的是,这是因为 torch 版本不匹配所导致的问题
    • 解决方案一:删除当前 nnFormer 虚拟环境下的 torch 并重装合适的 torch 版本(我尝试过这个方法,但并没有成功,重装的 torch 版本是 10.0.1)
    • 解决方案二:换一台服务器,再更换服务器为 RTX 2080Ti 之后就没有这个问题了

2.3. 预测

修改 train_inference.sh

  • 注释掉 train 部分代码
  • 修改 predict 部分代码路径为自己的路径
  • 复制 inference_tumor.py 副本到路径 /root/nnFormerFrame/DATASET/nnFormer_raw/nnFormer_raw_data/Task003_tumor

执行如下指令:

bash train_inference.sh -c 0 -n nnformer_tumor -t 3

总结

按照上面的流程执行一遍后,就可以得到属于你自己的 nnFormer 了!
参考资料

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzzyzh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值