Qwen3-Next-80B lora微调-NPU

发表于 17 小时前  11 次阅读


文章目录

**相关资源:**

  • ms-swift 仓(FSDP NPU 分支):https://github.com/addsubmuldiv/ms-swift/tree/qwen3_next_fsdp_npu
  • 模型下载地址:https://modelscope.cn/models/Qwen/Qwen3-Next-80B-A3B-Instruct
  • 测试数据集:https://www.modelscope.cn/datasets/swift/self-cognition

一、ms-swift 镜像制作

1.1 镜像下载

选择 8.5.0 分支的 CANN 镜像:

docker pull quay.io/ascend/cann:8.5.0-910-openeuler24.03-py3.11

> 镜像地址:https://quay.io/repository/ascend/cann?tab=tags

1.2 创建容器

export IMAGE=quay.io/ascend/cann:8.5.0-910-openeuler24.03-py3.11
export NAME=qwen3-train

docker run -itdu root \
  --privileged \
  --name $NAME \
  --net=host \
  --shm-size=20g \
  --device /dev/davinci0 \
  --device /dev/davinci1 \
  --device /dev/davinci2 \
  --device /dev/davinci3 \
  --device /dev/davinci4 \
  --device /dev/davinci5 \
  --device /dev/davinci6 \
  --device /dev/davinci7 \
  --device /dev/davinci_manager \
  --device /dev/devmm_svm \
  --device /dev/hisi_hdc \
  -v /usr/local/dcmi:/usr/local/dcmi \
  -v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
  -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
  -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
  -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
  -v /etc/ascend_install.info:/etc/ascend_install.info \
  -it $IMAGE bash

1.3 ms-swift 安装

进入容器后依次执行以下安装步骤:

docker exec -it qwen3-next-train bash

# 克隆 ms-swift 仓库(FSDP NPU 分支)
cd /swift-workspace/
git clone -b qwen3_next_fsdp_npu https://github.com/addsubmuldiv/ms-swift.git
cd /swift-workspace/ms-swift

# 安装 ms-swift
pip install -e .

# 安装 transformers
pip install transformers==4.57.6

# 安装 torch-npu
pip install torch_npu==2.9.0
pip install torchvision==0.24.0
pip install decorator

# 安装 flash-linear-attention
pip install flash-linear-attention

# 安装 Triton(昇腾版)
pip install -i https://test.pypi.org/simple/ triton-ascend==3.2.0

**验证安装:**

pip show ms-swift

二、镜像提交保存

2.1 提交镜像

docker commit qwen3-next-train swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-910b-qwen3-next-train

2.2 导出镜像

docker save -o cann-8.5.0-910b-qwen3-next-train.tar \
  swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-910b-qwen3-next-train

2.3 压缩镜像

tar -zcvf cann-8.5.0-910b-qwen3-next-train.tar.gz cann-8.5.0-910b-qwen3-next-train.tar

三、创新平台 Notebook 创建

> 本章节介绍如何在创新平台(沈阳昇腾人工智能计算中心 / ModelArts)上创建 Notebook 实例,使用自定义镜像进行开发调试和训练。

3.1 上传镜像到 SWR

# 登录华为云 SWR(替换为实际区域)
docker login -u <账号> -p <密码> swr.cn-south-1.myhuaweicloud.com

> 如果没有 SWR 账号,请先在创新平台或华为云控制台开通 SWR 服务,获取长期有效的登录凭证。

推送镜像:

docker push swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-910b-qwen3-next-train

推送完成后,在 SWR 控制台确认镜像已上传成功。

3.2 在创新平台注册镜像

1. 登录创新平台,进入 ModelArts 控制台

2. 左侧导航栏选择「镜像管理」,点击「注册镜像」

3. 填写镜像信息:

参数说明示例值
镜像源选择 SWR 中已上传的镜像
镜像地址完整的 SWR 镜像路径`swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-910b-qwen3-next-train`
镜像类型选择 Notebook 适用的类型
可见范围根据需要选择私有 / 组织内可见

4. 确认无误后点击「立即注册」

3.3 创建 Notebook 实例

1. ModelArts 控制台 → 开发环境 → Notebook → 点击「创建」

2. 配置关键参数:

参数说明建议值
名称Notebook 实例名称`qwen3-next-train-nb`
镜像选择「自定义镜像」`cann:8.5.0-910b-qwen3-next-train`
资源规格NPU 规格`Ascend: 8*Ascend-910b`
存储配置工作目录存储根据数据量配置

3. 确认无误后点击「立即创建」,等待状态变为「运行中」

> **注意:** 务必确认 CANN 镜像版本与平台驱动/固件版本兼容。工作目录 `/home/ma-user/work` 下的数据持久化,其他目录重启后可能丢失。

3.4 打开 Notebook

状态变为「运行中」后,点击实例名称或「打开」按钮进入 JupyterLab,在 Terminal 中验证环境:

npu-smi info
pip show ms-swift
python -c "import torch; import torch_npu; print('NPU available:', torch.npu.is_available())"

3.5 Notebook 镜像保存(可选)

安装额外依赖后可将当前环境保存为新镜像:实例详情页 → 镜像保存 → 填写名称版本 → 保存到 SWR,下次创建时直接使用。


四、数据下载与准备

> 数据是训练的灵魂。本章涵盖模型权重下载、训练数据集获取、自定义数据集制作三部分。

4.1 模型权重下载

# 模型权重下载地址
# https://www.modelscope.cn/models/Qwen/Qwen3-Next-80B-A3B-Instruct

# 使用 modelscope SDK 下载(推荐)
pip install modelscope
python -c "from modelscope import snapshot_download; snapshot_download('Qwen/Qwen3-Next-80B-A3B-Instruct', cache_dir='/home/data/model/')"

> 权重约 150GB,请预留足够磁盘空间。

4.2 训练数据集获取

使用 ms-swift 内置的 self-cognition 数据集示例:

# 数据集地址
# https://www.modelscope.cn/datasets/swift/self-cognition

# 下载数据集
cd /swift-workspace/ms-swift
git clone https://www.modelscope.cn/datasets/swift/self-cognition.git ./data/self_cognition

数据格式为 JSONL,每行一条训练样本:

{"query": "你是谁?", "response": "我是 Swift-Bot,由 Swift 团队开发的人工智能助手。"}
{"query": "Who are you?", "response": "I am Swift-Bot, an AI assistant developed by the Swift team."}

训练命令中指定数据集:

# 使用全部数据
--dataset './data/self_cognition/raw.jsonl'
# 只取前 1000 条(快速验证用)
--dataset './data/self_cognition/raw.jsonl#1000'

4.3 制作自定义数据集

ms-swift 支持的 self-cognition 数据格式为 JSONL,每行一个 JSON 对象:

{"query": "你是谁?", "response": "我是小智,由智算科技团队训练的 AI 助手。"}
{"query": "你叫什么名字?", "response": "我叫小智,是智算科技开发的智能助手。"}
{"query": "谁创造了你?", "response": "我是由智算科技团队创造并训练的。"}
{"query": "介绍一下你自己", "response": "我是小智,智算科技基于 Qwen3 架构训练的大语言模型助手。"}

数据制作要点:

  • query 多样性:同一含义用多种问法覆盖,中英双语都要有
  • response 一致性:所有回答中名字、团队名保持一致,建议 10-30 条
  • 编码格式:UTF-8,避免中文乱码
  • 数据量:self-cognition 一般 20-50 条,过多可能过拟合
  • 混合训练:建议和通用 SFT 数据混合训练,避免灾难性遗忘

快速生成自定义数据脚本:

#!/usr/bin/env python3
import json, random

NAME = "小智"
TEAM = "智算科技"
BASE_MODEL = "Qwen3-Next-80B"

queries = [
    "你是谁?", "你叫什么名字?", "你是什么模型?",
    "谁创造了你?", "介绍一下你自己",
    "Who are you?", "What's your name?", "Tell me about yourself",
]

responses_cn = [
    f"我是{NAME},由{TEAM}团队训练的 AI 助手。",
    f"我叫{NAME},是{TEAM}基于 {BASE_MODEL} 架构开发的智能助手。",
]

responses_en = [
    f"I am {NAME}, an AI assistant developed by the {TEAM} team.",
]

data = []
for q in queries:
    r = responses_cn if any('\u4e00' <= c <= '\u9fff' for c in q) else responses_en
    data.append({"query": q, "response": random.choice(r)})

with open("my_self_cognition.jsonl", "w", encoding="utf-8") as f:
    for item in data:
        f.write(json.dumps(item, ensure_ascii=False) + "\n")

print(f"生成 {len(data)} 条数据 → my_self_cognition.jsonl")

4.4 数据集预处理与加速

首次加载时 ms-swift 会进行 tokenize 预处理,可通过以下参数优化:

--load_from_cache_file true       # 启用缓存(二次加载秒级完成)
--dataloader_num_workers 8        # 增加数据加载并行度
--dataset_num_proc 64             # 增加预处理进程数

> 首次加载仍需等待,后续启动直接读缓存。

4.5 训练镜像下载(已有镜像包)

# 下载
# https://lws.obs.cn-northeast-228.ccaicc.com/cann-8.5.0-910b-qwen3-next-train.tar.gz

# 解压
tar -zxvf cann-8.5.0-910b-qwen3-next-train.tar.gz
# 导入
docker load -i cann-8.5.0-910b-qwen3-next-train.tar

五、启动训练与日志查看

5.1 启动容器

export IMAGE=swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-910b-qwen3-next-train
export NAME=qwen3-next-train-test

docker run -itdu root \
  --privileged \
  --name $NAME \
  --net=host \
  --shm-size=20g \
  --device /dev/davinci0 \
  --device /dev/davinci1 \
  --device /dev/davinci2 \
  --device /dev/davinci3 \
  --device /dev/davinci4 \
  --device /dev/davinci5 \
  --device /dev/davinci6 \
  --device /dev/davinci7 \
  --device /dev/davinci_manager \
  --device /dev/devmm_svm \
  --device /dev/hisi_hdc \
  -v /usr/local/dcmi:/usr/local/dcmi \
  -v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
  -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
  -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
  -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
  -v /etc/ascend_install.info:/etc/ascend_install.info \
  -v /home/data/:/home/data/ \
  -w /swift-workspace/ms-swift \
  -it $IMAGE bash

# 进入容器
docker exec -it qwen3-next-train-test bash

5.2 单机 LoRA 微调

创建训练脚本:

#!/bin/bash
export HCCL_CONNECT_TIMEOUT=7200
export HCCL_EXEC_TIMEOUT=73000
nproc_per_node=8

ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
accelerate launch --config_file "./examples/ascend/train/qwen3_next/qwen3_next_fsdp_lora/fsdp.json" \
  swift/cli/sft.py \
  --model /home/data/model/Qwen3-Next-80B-A3B-Instruct/ \
  --tuner_type lora \
  --dataset './self_congnition/#1000' \
  --torch_dtype bfloat16 \
  --num_train_epochs 1 \
  --per_device_train_batch_size 2 \
  --per_device_eval_batch_size 1 \
  --learning_rate 1e-4 \
  --lora_rank 8 \
  --lora_alpha 32 \
  --gradient_checkpointing false \
  --weight_decay 0.1 \
  --target_modules q_proj k_proj v_proj o_proj \
  --gradient_accumulation_steps $(expr 16 / $nproc_per_node) \
  --eval_steps 100 \
  --save_steps 100 \
  --save_total_limit 2 \
  --logging_steps 1 \
  --template qwen3_nothinking \
  --max_length 1024 \
  --output_dir output \
  --system 'You are a helpful assistant.' \
  --warmup_ratio 0.05 \
  --dataloader_num_workers 4 \
  --model_author swift \
  --model_name swift-robot

bash train.sh

5.3 双机 LoRA 微调

#### 5.3.1 修改 FSDP 配置文件

编辑 `fsdp.json`,关键参数如下:

{
  "compute_environment": "LOCAL_MACHINE",
  "distributed_type": "FSDP",
  "mixed_precision": "bf16",
  "machine_rank": 0,
  "main_process_ip": "<主节点IP>",
  "main_process_port": 29500,
  "num_machines": 2,
  "num_processes": 16,
  "rdzv_backend": "static",
  "same_network": true,
  "use_cpu": false,
  "fsdp_config": {
    "fsdp_auto_wrap_policy": "TRANSFORMER_BASED_WRAP",
    "fsdp_cpu_ram_efficient_loading": true,
    "fsdp_reshard_after_forward": true,
    "fsdp_sync_module_states": true,
    "fsdp_state_dict_type": "SHARDED_STATE_DICT",
    "fsdp_activation_checkpointing": true
  }
}

多机关键参数说明:

参数说明
`num_machines`节点总数
`num_processes`总进程数 = num_machines × 每台卡数
`main_process_ip`主节点 IP(所有节点保持一致)
`main_process_port`主节点端口(所有节点保持一致)
`machine_rank`当前节点编号(主节点为 0,从节点递增)

#### 5.3.2 启动双机训练

所有节点执行相同命令(各节点 json 中 machine_rank 不同):

export HCCL_CONNECT_TIMEOUT=7200
export HCCL_EXEC_TIMEOUT=73000
export HCCL_SOCKET_IFNAME=enp67s0f0np0
nproc_per_node=8

ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
accelerate launch --config_file "./examples/ascend/train/qwen3_next/qwen3_next_fsdp_lora/fsdp.json" \
  swift/cli/sft.py \
  --model /home/data/model/Qwen3-Next-80B-A3B-Instruct/ \
  --tuner_type lora \
  --dataset './self_congnition/#1000' \
  --torch_dtype bfloat16 \
  --num_train_epochs 1 \
  --per_device_train_batch_size 2 \
  --learning_rate 1e-4 \
  --lora_rank 8 \
  --lora_alpha 32 \
  --gradient_checkpointing false \
  --weight_decay 0.1 \
  --target_modules q_proj k_proj v_proj o_proj \
  --gradient_accumulation_steps $(expr 16 / $nproc_per_node) \
  --save_steps 100 \
  --save_total_limit 2 \
  --logging_steps 1 \
  --template qwen3_nothinking \
  --max_length 8192 \
  --output_dir output \
  --system 'You are a helpful assistant.' \
  --warmup_ratio 0.05 \
  --dataloader_num_workers 4 \
  --model_author swift \
  --model_name swift-robot

5.4 日志查看

训练启动后重点关注以下指标:

# 查看训练日志(实时)
tail -f output/logging.jsonl

# 查看 loss 曲线
grep "loss" output/logging.jsonl | tail -20

# 查看 NPU 使用情况
npu-smi info watch

关键日志指标:

指标说明正常范围
`loss`训练损失逐步下降
`learning_rate`学习率按 warmup 策略变化
`grad_norm`梯度范数不应剧烈震荡
`token_per_second`吞吐量

六、常见问题定位

6.1 内存溢出(OOM)

训练到一定 step 后报 OOM,解决方案:

# 在训练命令中增加
--packing true
--attn_impl 'flash_attention_2'

# 增大 HCCL 超时
export HCCL_EXEC_TIMEOUT=73000

6.2 断点续训

--resume_from_checkpoint output/Qwen3.5-4B-NPU/vx-xxx/checkpoint-xxx

6.3 数据集加载慢

--load_from_cache_file true
--dataloader_num_workers 8
--dataset_num_proc 64

二次加载只需几十秒,直接读取缓存。

6.4 训练完缺少 adapter_config.json

使用 swift export 导出:

swift export \
  --model output/vx-xxx/checkpoint-xxx \
  --push_to_hub true \
  --hub_model_id '<model-id>' \
  --hub_token '<sdk-token>' \
  --use_hf false \
  --save_safetensors true

6.5 双机通信问题

排查步骤:

  • `ping <对方IP>` 检查网络互通
  • 确认防火墙未拦截 `main_process_port`(默认 29500)
  • 确认各节点 `machine_rank` 配置正确
  • 检查 `HCCL_SOCKET_IFNAME` 网卡名称是否正确
  • 增大超时:`export HCCL_CONNECT_TIMEOUT=7200`

6.6 镜像版本兼容性

  • 确认 CANN 镜像版本与平台驱动/固件版本兼容
  • 确认 `torch_npu` 版本与 CANN 版本匹配
  • Notebook 中执行 `npu-smi info` 查看驱动版本

附录:快速命令速查

# ===== 镜像相关 =====
docker images | grep qwen3                    # 查看已有镜像
docker ps | grep qwen3                        # 查看运行中容器
docker commit <容器名> <镜像名:tag>             # 保存容器为镜像
docker save -o <文件名.tar> <镜像名:tag>        # 导出镜像
docker load -i <文件名.tar>                     # 导入镜像

# ===== NPU 相关 =====
npu-smi info                                   # 查看 NPU 基本信息
npu-smi info watch                             # 实时监控 NPU 使用
ls /dev/davinci*                               # 查看 NPU 设备

# ===== 训练相关 =====
bash train.sh                                  # 启动训练
tail -f output/logging.jsonl                   # 实时查看训练日志
grep "loss" output/logging.jsonl               # 筛选 loss 记录

# ===== 环境验证 =====
pip show ms-swift                              # 查看 ms-swift 版本
pip show torch_npu                             # 查看 torch_npu 版本
python -c "import torch; import torch_npu; print(torch.npu.is_available())"
本站文章基于国际协议BY-NA-SA 4.0协议共享;
如未特殊说明,本站文章皆为原创文章,请规范转载。

0

scanz个人博客