Ascend-SACT/Qwen3-Next-80B-A3B-Instruct
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

1 模型概述及场景

1.1 模型概述

Qwen3-Next-80B-A3B-Instruct
阿里云通义团队2025年9月发布的Qwen3-Next架构首款指令微调模型。

核心规格数值
总参数量80 B
推理激活量3 B(故称A3B)
稀疏度1:50
网络深度48层
MoE专家数512
每Token调用10路由专家+1共享专家
注意力机制混合注意力:
75%层Gated DeltaNet线性注意力(降开销)
25%层标准注意力(保精度)交替放置
原生上下文256 K tokens
YaRN扩展平滑支持1 M tokens

功能定位

  • Instruct版:专为“非思考”式快速回答设计,不输出<think>痕迹。
  • 适用场景:高吞吐、确定性输出的生产环境,如对话、RAG、工具调用。
  • 通用能力:函数调用、结构化输出、多轮对话、代码生成、多语言等。

1.2 案例适用场景

本案例在Atlas 800T A3 32卡上,基于MindSpeed-LLM框架,完成Qwen3-Next-80B-A3B-Instruct的SFT微调训练实践。

2 准备运行环境

2.1 环境准备

组件版本
CANN8.3.RC1.alpha003
Python3.10
torch2.7.1
torch_npu2.7.1rc1
MindSpeed2.2.0_core_r0.12.1
Megatron-LMcore_v0.12.1
MindSpeed-LLM2.2.0
  • 设备支持:Atlas 800T A3
  • 部署卡类型:910C
  • 部署方式:多卡/多机
  • 操作系统:ARM

2.2 Dockerfile

# 基础参数
ARG USER="ma-user"
ARG U_ID="1000"
ARG GROUP="ma-group"
ARG GID="100"

ARG CANN_TOOLKIT="Ascend-cann-toolkit_8.3.RC1.alpha003_linux-aarch64.run"
ARG CANN_KERNELS="Atlas-A3-cann-kernels_8.3.RC1.alpha003_linux-aarch64.run"
ARG CANN_NNAL="Ascend-cann-kernels-910b_8.3.RC1.alpha003_linux-aarch64.run"

ARG TORCH_NPU="torch_npu-2.7.1rc1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
ARG APEX="apex-0.1+ascend-cp310-cp310-linux_aarch64.whl"
ARG PORT=3100

#------------------- 1. 系统基础镜像 -------------------
FROM ubuntu:22.04 AS modelbase

ARG USER U_ID GROUP GID
ARG CANN_TOOLKIT CANN_KERNELS CANN_NNAL
ARG TORCH_NPU APEX PORT

WORKDIR /root

# 1) 安装系统依赖
COPY Install_script/install_system_package.sh .
RUN bash install_system_package.sh && rm -f install_system_package.sh

ENV TZ=Asia/Shanghai \
    LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64/common:$LD_LIBRARY_PATH

#------------------- 2. 创建用户 & 基础配置 -------------------
RUN apt-get update && apt-get install -y wget && \
    wget -q "http://172.17.0.1:${PORT}/Install_script/create_user.sh" -O create_user.sh && \
    bash create_user.sh ${USER} ${U_ID} ${GROUP} ${GID} && \
    echo "${USER}:自定义password" | chpasswd && \
    echo "root:自定义password" | chpasswd && \
    rm -f ~/*.sh && \
    chown -R ${USER}:${GROUP} /etc/apt && \
    ln -sf /lib /lib64

USER ${USER}
WORKDIR /home/${USER}

ENV HOMEPATH=/home/${USER} \
    PATH=$PATH:${HOMEPATH}/.local/bin \
    PIP_INDEX_URL=https://repo.huaweicloud.com/repository/pypi/simple \
    PIP_TRUSTED_HOST=repo.huaweicloud.com

#------------------- 3. 安装 PTA(torch_npu + apex) -------------------
RUN wget -q "http://172.17.0.1:${PORT}/Install_script/set_user.sh" -O set_user.sh && bash set_user.sh && \
    wget -q "http://172.17.0.1:${PORT}/package/${TORCH_NPU}" -O ${TORCH_NPU} && \
    wget -q "http://172.17.0.1:${PORT}/package/${APEX}" -O ${APEX} && \
    wget -q "http://172.17.0.1:${PORT}/Install_script/install_pta.sh" -O install_pta.sh && \
    bash install_pta.sh "${TORCH_NPU}" "${APEX}" && \
    pip cache purge && \
    rm -f ~/*.whl ~/*.sh

#------------------- 4. 安装 CANN -------------------
RUN wget -q "http://172.17.0.1:${PORT}/Install_script/install_toolkit.sh" -O install_toolkit.sh && \
    wget -q "http://172.17.0.1:${PORT}/package/${CANN_TOOLKIT}" -O ${CANN_TOOLKIT} && \
    bash install_toolkit.sh "${CANN_TOOLKIT}" && \
    rm -f ~/*.run ~/*.sh

RUN wget -q "http://172.17.0.1:${PORT}/Install_script/install_kernel.sh" -O install_kernel.sh && \
    wget -q "http://172.17.0.1:${PORT}/package/${CANN_KERNELS}" -O ${CANN_KERNELS} && \
    bash install_kernel.sh "${CANN_KERNELS}" && \
    rm -f ~/*.run ~/*.sh

RUN wget -q "http://172.17.0.1:${PORT}/Install_script/install_nnal.sh" -O install_nnal.sh && \
    wget -q "http://172.17.0.1:${PORT}/package/${CANN_NNAL}" -O ${CANN_NNAL} && \
    bash install_nnal.sh "${CANN_NNAL}" && \
    rm -f ~/*.run ~/*.sh

#------------------- 5. 克隆 & 安装 MindSpeed + Megatron + MindSpeed-LLM -------------------
RUN git clone https://gitcode.com/ascend/MindSpeed.git && \
    cd MindSpeed && \
    git checkout 2.2.0_core_r0.12.1 && \
    pip install -r requirements.txt && \
    pip install -e . && \
    cd ..

RUN git clone https://gitcode.com/ascend/MindSpeed-LLM.git && \
    git clone https://github.com/NVIDIA/Megatron-LM.git && \
    cd Megatron-LM && \
    git checkout core_v0.12.1 && \
    cp -r megatron ../MindSpeed-LLM/ && \
    cd ../MindSpeed-LLM && \
    git checkout 2.2.0 && \
    pip install -r requirements.txt

#------------------- 6. 其他依赖 -------------------
RUN wget -q "http://172.17.0.1:${PORT}/Install_script/moxing_framework-2.2.7+d78e9bef-py2.py3-none-any.whl" -O moxing.whl && \
    pip install moxing.whl && rm -f moxing.whl && \
    pip install transformers==4.51.0

#------------------- 7. 环境变量 -------------------
ENV LD_LIBRARY_PATH=/home/${USER}/Ascend/nnal/atb/latest/atb/cxx_abi_0/lib:\
/home/${USER}/Ascend/ascend-toolkit/latest/lib64:\
/home/${USER}/Ascend/ascend-toolkit/latest/tools/aml/lib64:\
/usr/local/Ascend/driver/lib64/driver:\
/usr/local/Ascend/driver/lib64/common:$LD_LIBRARY_PATH \
    ATB_HOME_PATH=/home/${USER}/Ascend/nnal/atb/latest/atb/cxx_abi_0 \
    TOOLCHAIN_HOME=/home/${USER}/Ascend/ascend-toolkit/latest/toolkit \
    ASCEND_TOOLKIT_HOME=/home/${USER}/Ascend/ascend-toolkit/latest \
    PYTHONPATH=/home/${USER}/Ascend/ascend-toolkit/latest/python/site-packages:$PYTHONPATH \
    ASCEND_OPP_PATH=/home/${USER}/Ascend/ascend-toolkit/latest/opp \
    ASCEND_AICPU_PATH=/home/${USER}/Ascend/ascend-toolkit/latest \
    ATB_OPSRUNNER_KERNEL_CACHE_TYPE=3 \
    ATB_RUNNER_POOL_SIZE=64 \
    ATB_STREAM_SYNC_EVERY_OPERATION_ENABLE=0 \
    ATB_MATMUL_SHUFFLE_K_ENABLE=1 \
    ATB_LAUNCH_KERNEL_WITH_TILING=1 \
    ATB_WORKSPACE_MEM_ALLOC_ALG_TYPE=1 \
    ATB_HOST_TILING_BUFFER_BLOCK_NUM=128 \
    ASDOPS_LOG_LEVEL=ERROR \
    LCCL_DETERMINISTIC=0 \
    ASDOPS_MATMUL_PP_FLAG=1 \
    ASDOPS_LOG_TO_BOOST_TYPE=atb \
    ASDOPS_LOG_TO_FILE_FLUSH=0 \
    ATB_COMPARE_TILING_EVERY_KERNEL=0 \
    ASCEND_HOME_PATH=/home/${USER}/Ascend/ascend-toolkit/latest \
    ASDOPS_LOG_TO_STDOUT=0

#------------------- 8. 自启动脚本 -------------------
RUN echo "export GLOG_v=2" >> ~/.bashrc && \
    echo "source /usr/local/Ascend/driver/bin/setenv.bash" >> ~/.bashrc && \
    echo "source ~/Ascend/ascend-toolkit/set_env.sh" >> ~/.bashrc && \
    echo "source ~/Ascend/nnal/atb/set_env.sh" >> ~/.bashrc

#------------------- 9. 清理 & 确认 -------------------
RUN cd ~ && rm -rf *.whl *.run *.tar.gz install_*.sh && ls -l

3. 运行指导

3.1 启动镜像

docker run \
--privileged \
--cap-add=SYS_PTRACE \
--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/davinci8 \
--device=/dev/davinci9 \
--device=/dev/davinci10 \
--device=/dev/davinci11 \
--device=/dev/davinci12 \
--device=/dev/davinci13 \
--device=/dev/davinci14 \
--device=/dev/davinci15 \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
--net=host \
--shm-size=500g \
--name 容器名字 \
-v /挂载宿主机文件夹路径:/容器内路径 \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /var/log/npu/:/usr/slog \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-itd \
--entrypoint /bin/bash \
镜像名称

3.2 下载权重

社区用户将模型文件下载至指定路径,以下以魔搭社区为例进行说明。

pip install modelscope modelscope download --model Qwen/Qwen3-Next-80B-A3B-Instruct --local_dir /xxx/xxxx

3.3 hf权重预处理

训练前需将模型权重由hf格式转换为megatron的mcore格式。转换脚本可使用 MindSpeed-LLM/examples/mcore/qwen3_next/ckpt_convert_qwen3_next_80b_hf2mcore.sh

python convert_ckpt_v2.py \
    --load-model-type hf \
    --save-model-type mg \
    --target-tensor-parallel-size 1 \
    --target-pipeline-parallel-size 1 \
    --target-expert-parallel-size 64 \
    --load-dir /原始模型权重保存路径/ \
    --save-dir /转换后模型权重保存路径/ \
    --moe-grouped-gemm \
	--model-type-hf qwen3-next

注意:

  1. 该模型暂不支持开启TP
  2. mtp层请根据需要配置--mtp-num-layers 1 \

3.4 准备数据集

可自行准备Instruct数据集或使用开源数据。这里以Alpaca数据集为例。

 cd dataset/
wget https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet
cd ..

3.5 数据集预处理

数据预处理脚本可参考MindSpeed-LLM/examples/mcore/qwen3_next/data_convert_qwen3_next_instruction.sh

python ./preprocess_data.py \
--input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \ #原始数据保存位置
--tokenizer-name-or-path ./model_from_hf/qwen3_next_hf/ \ #模型tokenizer保存位置
--output-prefix ./finetune_dataset/alpaca \ #处理后数据保存位置
--handler-name AlpacaStyleInstructionHandler \
--tokenizer-type PretrainedFromHF \
--workers 4 \
--log-interval 1000 \
--prompt-type qwen3

注意:workers为处理时使用的cpu核数,可增加数量加速处理。处理后数据保存位置后需规定处理后数据的头名称,样例中为alpaca,处理后的文件形式如下所示:

finetune_dataset
├── alpaca_packed_attention_mask_document.bin
├── alpaca_packed_attention_mask_document.idx
├── alpaca_packed_input_ids_document.bin
├── alpaca_packed_input_ids_document.idx
├── alpaca_packed_labels_document.bin
├── alpaca_packed_labels_document.idx

3.6 训练启动

训练启动脚本可参考MindSpeed-LLM/examples/mcore/qwen3_next/tune_qwen3_next_80b_4K_full_ptd.sh

#!/bin/bash
export HCCL_CONNECT_TIMEOUT=1800
export CUDA_DEVICE_MAX_CONNECTIONS=1
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export NPU_ASD_ENABLE=0

NPUS_PER_NODE=16
MASTER_ADDR=localhost
MASTER_PORT=6000
NNODES=4
NODE_RANK=0
WORLD_SIZE=$(($NPUS_PER_NODE*$NNODES))

# please fill these path configurations
CKPT_SAVE_DIR="your model save ckpt path"
DATA_PATH="your data path"
TOKENIZER_PATH="your tokenizer path"
CKPT_LOAD_DIR="your model ckpt path"

TP=1
PP=1
EP=64
CP=1

MBS=1
GBS=128
SEQ_LENGTH=4096
TRAIN_ITERS=2000
CP_TYPE='ulysses_cp_algo'
ROUTER_BALANCING_TYPE='aux_loss'

DISTRIBUTED_ARGS="
    --nproc_per_node $NPUS_PER_NODE \
    --nnodes $NNODES \
    --node_rank $NODE_RANK \
    --master_addr $MASTER_ADDR \
    --master_port $MASTER_PORT
"

MOE_ARGS="
    --num-experts 512 \
    --moe-router-topk 10 \
    --moe-router-load-balancing-type ${ROUTER_BALANCING_TYPE} \
    --n-shared-experts 1 \
    --shared-expert-gate \
    --moe-ffn-hidden-size 512 \
    --moe-grouped-gemm \
    --moe-permutation-async-comm \
    --moe-token-dispatcher-type alltoall_seq \
    --moe-layer-freq 1 \
    --norm-topk-prob \
    --moe-aux-loss-coeff 0.001 \
    --topk-softmax-in-fp32 \
    --moe-router-pre-softmax \
"

OPTIMIZE_ARGS="
    --use-flash-attn \
    --use-fused-rotary-pos-emb \
    --use-rotary-position-embeddings \
    --use-fused-swiglu \
    --no-masked-softmax-fusion \
    --use-distributed-optimizer \
    --gemm-gradient-accumulation-fusion \
    --swap-optimizer \
    --recompute-activation-function \
"

TRAIN_ARGS="
    --micro-batch-size ${MBS} \
    --global-batch-size ${GBS} \
    --lr 1.25e-6 \
    --lr-decay-style cosine \
    --min-lr 1.25e-7 \
    --weight-decay 1e-1 \
    --lr-warmup-fraction 0.01 \
    --attention-dropout 0.0 \
    --init-method-std 0.01 \
    --hidden-dropout 0.0 \
    --clip-grad 1.0 \
    --adam-beta1 0.9 \
    --adam-beta2 0.95 \
    --initial-loss-scale 4096 \
    --seed 42 \
    --bf16 \
    --train-iters ${TRAIN_ITERS} \
    --seq-length ${SEQ_LENGTH} \
    --no-shared-storage
"

MODEL_PARALLEL_ARGS="
    --tensor-model-parallel-size ${TP} \
    --pipeline-model-parallel-size ${PP} \
    --expert-model-parallel-size ${EP} \
    --context-parallel-size ${CP} \
    --context-parallel-algo ${CP_TYPE} \
"

GPT_ARGS="
    --use-mcore-models \
    --spec mindspeed_llm.tasks.models.spec.qwen3_next_spec layer_spec \
    --qk-layernorm \
    --full-attention-interval 4 \
    --mamba-d-conv 4 \
    --mamba-expand 1 \
    --kv-channels 256 \
    --linear-key-head-dim 128 \
    --linear-num-key-heads 16 \
    --linear-num-value-heads 32 \
    --linear-value-head-dim 128 \
    --partial-rotary-factor 0.25 \
    --tokenizer-name-or-path ${TOKENIZER_PATH} \
    --max-position-embeddings ${SEQ_LENGTH} \
    --num-layers 48 \
    --hidden-size 2048 \
    --ffn-hidden-size 5120 \
    --num-attention-heads 16 \
    --tokenizer-type PretrainedFromHF \
    --make-vocab-size-divisible-by 1 \
    --padded-vocab-size 151936 \
    --rotary-base 10000000 \
    --untie-embeddings-and-output-weights \
    --disable-bias-linear \
    --position-embedding-type rope \
    --normalization RMSNorm \
    --no-enable-linear-qkv \
    --swiglu \
    --rmsnorm-weight-in-fp32 \
    --add-rmsnorm-offset \
    --attention-softmax-in-fp32 \
    --no-gradient-accumulation-fusion \
    --group-query-attention \
    --num-query-groups 2 \
    --norm-epsilon 1e-06 \
"

DATA_ARGS="
    --data-path $DATA_PATH \
    --split 100,0,0
"

OUTPUT_ARGS="
    --log-interval 1 \
    --save-interval ${TRAIN_ITERS} \
    --eval-interval ${TRAIN_ITERS} \
    --eval-iters 0 \
    --no-load-optim \
    --no-load-rng \
"

TUNE_ARGS="
    --finetune \
    --stage sft \
    --is-instruction-dataset \
    --tokenizer-not-use-fast \
    --prompt-type qwen \
    --no-pad-to-seq-lengths
"

torchrun $DISTRIBUTED_ARGS posttrain_gpt.py \
    $GPT_ARGS \
    $DATA_ARGS \
    $MOE_ARGS \
    $OUTPUT_ARGS \
    $TUNE_ARGS \
    $OPTIMIZE_ARGS \
    $TRAIN_ARGS \
    $MODEL_PARALLEL_ARGS \
    --load ${CKPT_LOAD_DIR} \
    --save ${CKPT_SAVE_DIR} \
    --distributed-backend nccl \
| tee logs/tune_mcore_qwen3_next_80b.log

注意:

  1. 启动训练时,每个节点都需运行此脚本,且需将一个节点的IP address设为MASTER_ADDR,master节点的NODE_RANK为0,其他节点按顺序配置。
  2. 数据集读取路径需包含文件头名称,例如3.5例中的./finetune_dataset/alpaca。
  3. 训练步数与ckpt保存间隔需自行设定。其中训练步数可根据训练数据总条数N、global batch size (GBS)和训练epoch数(M)计算得出:N×M/GBS。

3.7 ckpt权重转换回hf格式

训练结束后,需将ckpt转换回hf格式以进行后续推理或评测。转换脚本可参考MindSpeed-LLM/examples/mcore/qwen3_next/ckpt_convert_qwen3_next_80b_mcore2hf.sh

python convert_ckpt_v2.py \
    --load-model-type mg \
    --save-model-type hf \
    --load-dir ./model_weights/qwen3_next_mcore/ \ #ckpt权重保存位置
    --save-dir ./model_from_hf/qwen3_next_hf/ \ #转换后权重保存位置
    --moe-grouped-gemm \
	--model-type-hf qwen3-next

注意:

  1. 存在多个ckpt时,可通过ckpt路径下的latest_checkpointed_iteration.txt中数字进行指定。
  2. 转换后的文件夹中只有.safetensors文件和model.safetensors.index.json文件,需从原始权重文件夹中将configs.json等其他文件复制过来。

4. 常见问题

  1. 模型初始权重读取路径写错时MindSpeed-LLM框架不会自动报错,会自动随机生成模型权重。需注意打印日志中是否有successfully loading checkpoint,如出现will not load any checkpoints and will start from random则需检查路径是否填写错误。
  2. 如果在数据读取时报错找不到input_ids,大概率为数据读取路径写错。