一、背景说明
在使用昇腾910A芯片对CodonTransformer模型进行迁移训练时,遇到PyTorch Lightning框架与NPU设备的适配问题。本文详细记录从环境配置到解决各类报错的完整过程,为同类场景迁移提供参考。
二、环境配置
三、关键资源链接
- 原始代码:[https://github.com/Adibvafa/CodonTransformer](https://github.com/Adibvafa/CodonTransformer)
- 模型地址:[https://huggingface.co/adibvafa/CodonTransformer](https://huggingface.co/adibvafa/CodonTransformer)
- 数据集地址:[https://huggingface.co/datasets/adibvafa/CodonTransformer](https://huggingface.co/datasets/adibvafa/CodonTransformer)
- NPU适配参考代码:[https://gitee.com/xiaoloongfang/lightning_npu](https://gitee.com/xiaoloongfang/lightning_npu)
- 最终执行成功的训练代码:[https://github.com/zhoutiezhu/CodonTransformer_NPU.git]
四、核心问题与解决方案
1. 报错:ImportError: cannot import name 'torch_device_guard'
-错误位置:lightning_npu/core/maxins/device_dtype_mixin.py
-解决方案:
python
# 修改前
from torch_npu.utils.tensor_methods import torch_device_guard
# 修改后
from torch_npu.utils.tensor_methods import npu_device_patch
2. 报错:ImportError: cannot import name '_DEVICE'
- 错误位置:lightning_npu/accelerators/npu.py
- 解决方案:
python
# 修改前
from pytorch_lightning.utilities.types import _DEVICE
# 修改后
import torch_npu
3. 报错:ImportError: cannot import name '_PATH'
- 错误位置:lightning_npu/accelerators/npu.py
- 解决方案:
python
# 修改前
from pytorch_lightning.utilities.types import _PATH
# 修改后
from typing import Union
4. 报错:TypeError: Can't instantiate abstract class NPUAccelerator
- 错误原因:NPUAccelerator类缺少抽象方法
- 解决方案:
python
# 在NPUAccelerator类中补充以下方法
def setup_device(self, device):
torch_npu.npu.set_device(device)
def teardown(self):
pass
5. 报错:Precision '16-mixed' is invalid
-解决方案:取消混合精度训练,移除相关配置并采用“bf16”精度进行训练
6. 报错:AttributeError: module 'torch_npu.npu' has no attribute 'native_device'
- 错误位置:lightning_npu/core/maxins/device_dtype_mixin.py
- 解决方案:
python
# 删除以下代码
native_device = str(self.device).replace("npu", torch_npu.npu.native_device)
# 替换为
torch_npu.npu.set_device(device_str)
7. 报错:ValueError: Expected positive integer total_steps, but got -1
- 错误原因:学习率调度器total_steps计算错误
- 解决方案:
python
# 手动计算steps_per_epoch
steps_per_epoch = self.samples_count // self.batch_size
total_steps = steps_per_epoch * self.trainer.max_epochs
8. 报错:RuntimeError: Cannot re-initialize NPU in forked subprocess
- 解决方案:
python
# 训练前将数据置于CPU,训练时加载到NPU
# 避免多进程直接操作NPU张量
五、训练命令示例
bash
python finetune.py \
--dataset_dir 'dataset/training_data.jsonl' \
--checkpoint_dir './ckpt' \
--checkpoint_filename 'finetune.ckpt' \
--batch_size 6 \
--max_epochs 15 \
--num_workers 5 \
--accumulate_grad_batches 1 \
--num_gpus 1 \
--learning_rate 0.00005 \
--warmup_fraction 0.1 \
--save_every_n_steps 512 \
--seed 23
六、训练效果展示
模型参数统计
| Name | Type | Params
---------------------------------------------
0 | model | BigBirdForMaskedLM | 89.6 M
---------------------------------------------
89.6 M Trainable params
0 Non-trainable params
89.6 M Total params
358.318 Total estimated model params size (MB)
NPU资源使用
+---------------------------+---------------+----------------------------------------------------+
| NPU Chip | Process id | Process name | Process memory(MB) |
+===========================+===============+====================================================+
| 0 0 | 48988 | python | 13330 |
+===========================+===============+====================================================+
训练日志片段
Epoch 0: 12%|█████████▌ | 2/17 [14:17<1:47:13, 428.87s/it, loss=0.977, v_num=3, lr=2e-6]
训练成功截图

七、总结建议
1. NPU迁移需重点关注设备初始化、多进程管理及数据加载流程
2. 遇到框架适配问题时,优先查看官方适配库(如lightning_npu)
3. 混合精度训练在NPU上需谨慎配置,建议从纯精度模式开始调试
4. 数据加载时避免直接在多进程中操作NPU张量,采用CPU中转策略
希望本文能帮助更多开发者在昇腾平台上顺利完成模型迁移训练!欢迎留言交流其他适配技巧~
一、背景说明
在使用昇腾910A芯片对CodonTransformer模型进行迁移训练时,遇到PyTorch Lightning框架与NPU设备的适配问题。本文详细记录从环境配置到解决各类报错的完整过程,为同类场景迁移提供参考。
二、环境配置
三、关键资源链接
- 原始代码:[https://github.com/Adibvafa/CodonTransformer](https://github.com/Adibvafa/CodonTransformer)
- 模型地址:[https://huggingface.co/adibvafa/CodonTransformer](https://huggingface.co/adibvafa/CodonTransformer)
- 数据集地址:[https://huggingface.co/datasets/adibvafa/CodonTransformer](https://huggingface.co/datasets/adibvafa/CodonTransformer)
- NPU适配参考代码:[https://gitee.com/xiaoloongfang/lightning_npu](https://gitee.com/xiaoloongfang/lightning_npu)
- 最终执行成功的训练代码:[https://github.com/zhoutiezhu/CodonTransformer_NPU.git]
四、核心问题与解决方案
1. 报错:ImportError: cannot import name 'torch_device_guard'
-错误位置:lightning_npu/core/maxins/device_dtype_mixin.py
-解决方案:
python
# 修改前
from torch_npu.utils.tensor_methods import torch_device_guard
# 修改后
from torch_npu.utils.tensor_methods import npu_device_patch
2. 报错:ImportError: cannot import name '_DEVICE'
- 错误位置:lightning_npu/accelerators/npu.py
- 解决方案:
python
# 修改前
from pytorch_lightning.utilities.types import _DEVICE
# 修改后
import torch_npu
3. 报错:ImportError: cannot import name '_PATH'
- 错误位置:lightning_npu/accelerators/npu.py
- 解决方案:
python
# 修改前
from pytorch_lightning.utilities.types import _PATH
# 修改后
from typing import Union
4. 报错:TypeError: Can't instantiate abstract class NPUAccelerator
- 错误原因:NPUAccelerator类缺少抽象方法
- 解决方案:
python
# 在NPUAccelerator类中补充以下方法
def setup_device(self, device):
torch_npu.npu.set_device(device)
def teardown(self):
pass
5. 报错:Precision '16-mixed' is invalid
-解决方案:取消混合精度训练,移除相关配置并采用“bf16”精度进行训练
6. 报错:AttributeError: module 'torch_npu.npu' has no attribute 'native_device'
- 错误位置:lightning_npu/core/maxins/device_dtype_mixin.py
- 解决方案:
python
# 删除以下代码
native_device = str(self.device).replace("npu", torch_npu.npu.native_device)
# 替换为
torch_npu.npu.set_device(device_str)
7. 报错:ValueError: Expected positive integer total_steps, but got -1
- 错误原因:学习率调度器total_steps计算错误
- 解决方案:
python
# 手动计算steps_per_epoch
steps_per_epoch = self.samples_count // self.batch_size
total_steps = steps_per_epoch * self.trainer.max_epochs
8. 报错:RuntimeError: Cannot re-initialize NPU in forked subprocess
- 解决方案:
python
# 训练前将数据置于CPU,训练时加载到NPU
# 避免多进程直接操作NPU张量
五、训练命令示例
bash
python finetune.py \
--dataset_dir 'dataset/training_data.jsonl' \
--checkpoint_dir './ckpt' \
--checkpoint_filename 'finetune.ckpt' \
--batch_size 6 \
--max_epochs 15 \
--num_workers 5 \
--accumulate_grad_batches 1 \
--num_gpus 1 \
--learning_rate 0.00005 \
--warmup_fraction 0.1 \
--save_every_n_steps 512 \
--seed 23
六、训练效果展示
模型参数统计
| Name | Type | Params
---------------------------------------------
0 | model | BigBirdForMaskedLM | 89.6 M
---------------------------------------------
89.6 M Trainable params
0 Non-trainable params
89.6 M Total params
358.318 Total estimated model params size (MB)
NPU资源使用
+---------------------------+---------------+----------------------------------------------------+
| NPU Chip | Process id | Process name | Process memory(MB) |
+===========================+===============+====================================================+
| 0 0 | 48988 | python | 13330 |
+===========================+===============+====================================================+
训练日志片段
Epoch 0: 12%|█████████▌ | 2/17 [14:17<1:47:13, 428.87s/it, loss=0.977, v_num=3, lr=2e-6]
训练成功截图
七、总结建议
1. NPU迁移需重点关注设备初始化、多进程管理及数据加载流程
2. 遇到框架适配问题时,优先查看官方适配库(如lightning_npu)
3. 混合精度训练在NPU上需谨慎配置,建议从纯精度模式开始调试
4. 数据加载时避免直接在多进程中操作NPU张量,采用CPU中转策略
希望本文能帮助更多开发者在昇腾平台上顺利完成模型迁移训练!欢迎留言交流其他适配技巧~