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 |
功能定位
<think>痕迹。本案例在Atlas 800T A3 32卡上,基于MindSpeed-LLM框架,完成Qwen3-Next-80B-A3B-Instruct的SFT微调训练实践。
| 组件 | 版本 |
|---|---|
| CANN | 8.3.RC1.alpha003 |
| Python | 3.10 |
| torch | 2.7.1 |
| torch_npu | 2.7.1rc1 |
| MindSpeed | 2.2.0_core_r0.12.1 |
| Megatron-LM | core_v0.12.1 |
| MindSpeed-LLM | 2.2.0 |
# 基础参数
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 -ldocker 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 \
镜像名称社区用户将模型文件下载至指定路径,以下以魔搭社区为例进行说明。
pip install modelscope modelscope download --model Qwen/Qwen3-Next-80B-A3B-Instruct --local_dir /xxx/xxxx训练前需将模型权重由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注意:
可自行准备Instruct数据集或使用开源数据。这里以Alpaca数据集为例。
cd dataset/
wget https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet
cd ..数据预处理脚本可参考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训练启动脚本可参考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注意:
训练结束后,需将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注意: