华为昇腾910B(Ascend 910B)+ LLaMA-Factory 对 Qwen3.5-32B 模型进行 LoRA 微调 的全流程操作指南

华为昇腾910B(Ascend 910B)+ LLaMA-Factory 对 Qwen3.5-32B 模型进行 LoRA 微调 的全流程操作指南

华为昇腾910B(Ascend 910B)上 LLaMA-Factory 对 Qwen3.5-32B 模型进行 LoRA 微调 的保姆级全流程操作指南

华为昇腾910B(Ascend 910B)上使用 LLaMA-Factory 对 Qwen3.5-32B 模型进行 LoRA 微调 的保姆级全流程操作指南,包含环境配置、依赖安装、数据准备、训练启动、验证与推理等完整步骤。本教程基于 Ubuntu 20.04 + CANN 8.0 + MindSpore/PyTorch NPU + LLaMA-Factory v0.9.3+ 环境,适用于 8卡昇腾910B服务器


✅ 前提条件

项目

要求

硬件

华为 Atlas 800/900 服务器,8×Ascend 910B(64GB HBM)

OS

Ubuntu 20.04 LTS

驱动

CANN 8.0.RC1 或更高(已预装)

Python

3.10.x(推荐 3.10.16)

存储

≥ 2TB SSD(模型+数据集+缓存)

💡 若使用 AutoDL / 启智平台 / 华为云 ModelArts,请确保选择 “昇腾910B” + “CANN 8.0” 镜像


第一步:创建并激活虚拟环境

bash

# 安装 Miniconda(若未安装)

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3

source ~/.bashrc

# 创建虚拟环境

conda create -n llama-factory python=3.10.16 -y

conda activate llama-factory

第二步:安装 PyTorch NPU + CANN 兼容库

⚠️ 不要用 pip install torch!必须用华为官方 PyTorch NPU 包

bash

# 添加清华镜像加速(可选)

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 安装昇腾专用 PyTorch(CANN 8.0 对应 torch-npu 2.4.0)

pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 \

    --extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 安装 torch_npu(关键!)

pip install torch_npu==2.4.0.post1 -f https://pypi.tuna.tsinghua.edu.cn/simple

# 验证 NPU 可见性

python -c "import torch; print(torch.npu.is_available()); print(torch.npu.device_count())"

# 应输出:True 和 8(或你的卡数)

第三步:安装 LLaMA-Factory(昇腾适配版)

bash

# 克隆 LLaMA-Factory(国内推荐 Gitee 镜像)

git clone https://gitee.com/hiyouga/LLaMA-Factory.git

cd LLaMA-Factory

# 安装依赖(关键:使用 torch-npu 分支)

pip install -e ".[torch-npu,metrics]"

# 升级 Pillow(避免 CANN 兼容问题)

pip install --upgrade pillow

# 验证安装

llamafactory-cli env

✅ 正确输出应包含:

文本

- NPU type: Ascend910B2

- CANN version: 8.0.RC2

- PyTorch version: 2.4.0 (NPU)

第四步:下载 Qwen3.5-32B 模型(从魔搭社区)

❗ Qwen3.5-32B 在 Hugging Face 需授权,国内推荐使用 ModelScope(魔搭)

bash

# 安装 modelscope

pip install modelscope

# 下载模型到本地(约 60GB)

mkdir -p /data/models/qwen3.5-32b

python -c "

from modelscope import snapshot_download

snapshot_download(

    'qwen/Qwen3.5-32B',

    cache_dir='/data/models/qwen3.5-32b',

    revision='master'

)

"

📌 模型路径最终为:/data/models/qwen3.5-32b/qwen/Qwen3.5-32B


第五步:准备微调数据集(Alpaca 格式)

创建训练数据 my_data.json(示例:公司制度问答):

json

[

  {

    "instruction": "你是谁?",

    "input": "",

    "output": "我是由张老师开发的AI助手,专注于解答公司制度问题。"

  },

  {

    "instruction": "年假怎么计算?",

    "input": "",

    "output": "根据《员工手册》第5章:工作满1年不满10年,年假5天;满10年不满20年,10天。"

  }

]

保存到:LLaMA-Factory/data/my_data.json

然后注册数据集:

bash

# 编辑 dataset_info.json

nano data/dataset_info.json

在文件末尾添加:

json

"my_company_qa": {

  "file_name": "my_data.json",

  "columns": {

    "prompt": "instruction",

    "query": "input",

    "response": "output"

  }

}

第六步:配置多卡训练参数(YAML 文件)

创建配置文件 train_qwen35_32b_lora.yaml:

yaml

### 模型设置 ###

model_name_or_path: /data/models/qwen3.5-32b/qwen/Qwen3.5-32B

template: qwen  # Qwen 系列必须指定 template

### 训练设置 ###

stage: sft

do_train: true

finetuning_type: lora

lora_target: all  # Qwen 推荐 all(含 attention + mlp)

### LoRA 参数 ###

lora_rank: 64

lora_alpha: 128

lora_dropout: 0.05

### 数据集 ###

dataset: my_company_qa

max_samples: 1000  # 若数据少可注释此行

val_size: 0.1

### 批处理 ###

per_device_train_batch_size: 1   # 32B 模型单卡 batch_size=1

gradient_accumulation_steps: 8   # 等效 batch_size = 1*8*8 = 64

lr_scheduler_type: cosine

learning_rate: 1e-4

num_train_epochs: 3

max_grad_norm: 1.0

### 输出 ###

output_dir: saves/qwen3.5-32b/lora/company_qa

logging_steps: 10

save_steps: 500

plot_loss: true

### 硬件 ###

bf16: true        # 昇腾910B 支持 bf16

ddp_timeout: 18000

⚠️ 关键说明

  • per_device_train_batch_size=1:32B 模型显存占用高,单卡只能 batch=1
  • gradient_accumulation_steps=8:模拟更大 batch
  • bf16: true:启用 bfloat16 提升性能(昇腾支持)

第七步:启动多卡微调训练

bash

# 设置可见 NPU(8卡全用)

export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

# 启动训练(使用 torchrun 多进程)

torchrun \

  --nnodes=1 \

  --nproc_per_node=8 \

  src/train.py \

  --config train_qwen35_32b_lora.yaml

🕒 预计耗时

  • 1000 条数据 × 3 epoch ≈ 2–4 小时(8卡910B)
  • 日志实时输出 loss,检查 saves/.../trainer_log.jsonl

第八步:验证微调效果(Chat 测试)

训练完成后,加载 LoRA 适配器进行对话:

bash

llamafactory-cli chat \

  --model_name_or_path /data/models/qwen3.5-32b/qwen/Qwen3.5-32B \

  --adapter_name_or_path saves/qwen3.5-32b/lora/company_qa \

  --template qwen \

  --finetuning_type lora \

  --infer_backend vllm \  # 若安装了 vLLM-NPU(可选)

  --port 8080

或使用 WebUI:

bash

export ASCEND_RT_VISIBLE_DEVICES=0  # WebUI 单卡即可

llamafactory-cli webui

访问 http://<服务器IP>:7860 → 加载模型 → 测试问答。

第九步:合并模型(可选)

将 LoRA 权重合并到基础模型,生成完整模型:

bash

llamafactory-cli export \

  --model_name_or_path /data/models/qwen3.5-32b/qwen/Qwen3.5-32B \

  --adapter_name_or_path saves/qwen3.5-32b/lora/company_qa \

  --template qwen \

  --finetuning_type lora \

  --export_dir /data/models/qwen3.5-32b-finetuned

合并后模型可直接用于推理,无需额外加载 adapter。


🔧 常见问题解决

问题

解决方案

torch not compiled with npu support

重新安装 torch_npu==2.4.0.post1

显存不足 OOM

减小 per_device_train_batch_size=1,增大 gradient_accumulation_steps

tokenizer 报错

确保 template: qwen(Qwen 必须指定)

多卡通信失败

检查 ASCEND_RT_VISIBLE_DEVICES 是否包含所有卡号

模型下载慢

使用 modelscope + 国内网络


✅ 总结

你已完成:

  1. 昇腾910B 环境配置
  2. Qwen3.5-32B 模型下载
  3. 自定义数据集微调
  4. 8卡 LoRA 分布式训练
  5. 效果验证与模型导出

💡 提示:Qwen3.5-32B 是超大模型,若资源有限,可考虑:

  • 使用 QLoRA(4-bit 量化):finetuning_type: qlora + quantization_bit: 4
  • 微调更小版本:如 Qwen3.5-7B

如需 完整脚本打包 或 SwanLab 可视化监控配置,可继续告知!

以下是 华为昇腾910B + LLaMA-Factory 微调 Qwen3.5-32B 的完整脚本打包,包含一键环境配置、模型下载、数据准备、训练启动、验证测试等全流程自动化脚本。


📦 部署包结构

文本

qwen35-32b-ascend-finetune/

├── setup_env.sh                 # 1. 环境初始化

├── download_model.sh            # 2. 下载 Qwen3.5-32B(魔搭)

├── prepare_data.py              # 3. 生成示例数据集

├── train_qwen35_32b_lora.yaml   # 4. 训练配置文件

├── run_train.sh                 # 5. 启动多卡训练

├── test_chat.sh                 # 6. 加载模型对话测试

├── merge_model.sh               # 7. 合并 LoRA 权重(可选)

└── README.md                    # 使用说明

📄 文件 1:setup_env.sh

bash

#!/bin/bash

# setup_env.sh - 初始化昇腾910B环境

echo "🚀 创建 Conda 环境..."

conda create -n llama-factory python=3.10.16 -y

conda activate llama-factory

echo "📦 安装 PyTorch NPU (CANN 8.0 兼容)..."

pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 \

    --extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install torch_npu==2.4.0.post1 -f https://pypi.tuna.tsinghua.edu.cn/simple

echo "📥 克隆 LLaMA-Factory (Gitee 镜像)..."

git clone https://gitee.com/hiyouga/LLaMA-Factory.git

cd LLaMA-Factory

echo "🔧 安装 LLaMA-Factory (昇腾版)..."

pip install -e ".[torch-npu,metrics]"

pip install --upgrade pillow

echo "✅ 验证 NPU 可用性..."

python -c "import torch; print('NPU available:', torch.npu.is_available()); print('Device count:', torch.npu.device_count())"

echo "🎉 环境配置完成!请运行:source ~/.bashrc && conda activate llama-factory"

📄 文件 2:download_model.sh

bash

#!/bin/bash

# download_model.sh - 从魔搭下载 Qwen3.5-32B

MODEL_DIR="/data/models/qwen3.5-32b"

mkdir -p $MODEL_DIR

echo "🌐 正在从 ModelScope 下载 Qwen3.5-32B..."

python <<EOF

from modelscope import snapshot_download

snapshot_download(

    'qwen/Qwen3.5-32B',

    cache_dir='$MODEL_DIR',

    revision='master'

)

print("✅ 模型已保存至: $MODEL_DIR/qwen/Qwen3.5-32B")

EOF

📄 文件 3:prepare_data.py

python

# prepare_data.py - 生成示例微调数据集

import json

data = [

    {

        "instruction": "你是谁?",

        "input": "",

        "output": "我是由张老师开发的AI助手,专注于解答公司制度问题。"

    },

    {

        "instruction": "年假怎么计算?",

        "input": "",

        "output": "根据《员工手册》第5章:工作满1年不满10年,年假5天;满10年不满20年,10天。"

    },

    {

        "instruction": "加班有补贴吗?",

        "input": "",

        "output": "工作日加班按1.5倍工资,休息日2倍,法定节假日3倍。"

    }

]

with open("LLaMA-Factory/data/my_company_qa.json", "w", encoding="utf-8") as f:

    json.dump(data, f, ensure_ascii=False, indent=2)

# 注册数据集到 dataset_info.json

import os

dataset_info_path = "LLaMA-Factory/data/dataset_info.json"

if os.path.exists(dataset_info_path):

    with open(dataset_info_path, "r", encoding="utf-8") as f:

        info = json.load(f)

else:

    info = {}

info["my_company_qa"] = {

    "file_name": "my_company_qa.json",

    "columns": {

        "prompt": "instruction",

        "query": "input",

        "response": "output"

    }

}

with open(dataset_info_path, "w", encoding="utf-8") as f:

    json.dump(info, f, ensure_ascii=False, indent=2)

print("✅ 数据集已生成并注册: LLaMA-Factory/data/my_company_qa.json")

📄 文件 4:train_qwen35_32b_lora.yaml

yaml

model_name_or_path: /data/models/qwen3.5-32b/qwen/Qwen3.5-32B

template: qwen

stage: sft

do_train: true

finetuning_type: lora

lora_target: all

lora_rank: 64

lora_alpha: 128

lora_dropout: 0.05

dataset: my_company_qa

max_samples: 1000

val_size: 0.1

per_device_train_batch_size: 1

gradient_accumulation_steps: 8

lr_scheduler_type: cosine

learning_rate: 1e-4

num_train_epochs: 3

max_grad_norm: 1.0

output_dir: saves/qwen3.5-32b/lora/company_qa

logging_steps: 10

save_steps: 500

plot_loss: true

bf16: true

ddp_timeout: 18000

📄 文件 5:run_train.sh

bash

#!/bin/bash

# run_train.sh - 启动8卡微调训练

export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

cd LLaMA-Factory

echo "🔥 启动 Qwen3.5-32B LoRA 微调 (8卡昇腾910B)..."

torchrun \

  --nnodes=1 \

  --nproc_per_node=8 \

  src/train.py \

  --config ../train_qwen35_32b_lora.yaml

echo "✅ 训练完成!检查 saves/qwen3.5-32b/lora/company_qa/"

📄 文件 6:test_chat.sh

bash

#!/bin/bash

# test_chat.sh - 加载微调后模型进行对话测试

export ASCEND_RT_VISIBLE_DEVICES=0  # 单卡推理

cd LLaMA-Factory

llamafactory-cli chat \

  --model_name_or_path /data/models/qwen3.5-32b/qwen/Qwen3.5-32B \

  --adapter_name_or_path saves/qwen3.5-32b/lora/company_qa \

  --template qwen \

  --finetuning_type lora \

  --bf16

📄 文件 7:merge_model.sh

bash

#!/bin/bash

# merge_model.sh - 合并 LoRA 权重到基础模型

cd LLaMA-Factory

llamafactory-cli export \

  --model_name_or_path /data/models/qwen3.5-32b/qwen/Qwen3.5-32B \

  --adapter_name_or_path saves/qwen3.5-32b/lora/company_qa \

  --template qwen \

  --finetuning_type lora \

  --export_dir /data/models/qwen3.5-32b-finetuned

echo "✅ 合并完成!完整模型路径: /data/models/qwen3.5-32b-finetuned"

📄 文件 8:README.md

markdown

# Qwen3.5-32B 昇腾910B 微调脚本包

## 🚀 快速开始

1. 赋予执行权限:

   ```bash

   chmod +x *.sh

2.依次运行:

bash

./setup_env.sh          # 配置环境(需手动激活 conda)

conda activate llama-factory

./download_model.sh     # 下载模型(约60GB)

python prepare_data.py  # 生成示例数据

./run_train.sh          # 启动8卡训练

./test_chat.sh          # 测试微调效果

⚙️ 自定义

  • 修改 prepare_data.py 添加你的业务数据
  • 调整 train_qwen35_32b_lora.yaml 中的超参数

💾 输出目录

  • 微调检查点:LLaMA-Factory/saves/qwen3.5-32b/lora/company_qa
  • 合并模型:/data/models/qwen3.5-32b-finetuned

注意:首次运行需确保 CANN 8.0 已安装,且 NPU 驱动正常。

文本


 

---

### ▶️ 使用流程

```bash

# 1. 下载整个包

git clone https://gist.github.com/yourname/qwen35-ascend-finetune.git

cd qwen35-32b-ascend-finetune

# 2. 赋权

chmod +x *.sh

# 3. 逐个执行(按 README 顺序)

./setup_env.sh

conda activate llama-factory

./download_model.sh

python prepare_data.py

./run_train.sh

./test_chat.sh

💡 提示

  • 显存优化:若 OOM,可将 per_device_train_batch_size: 1 改为 1 并增大 gradient_accumulation_steps: 16
  • 量化微调:将 finetuning_type: lora 改为 qlora 并添加 quantization_bit: 4 可大幅降低显存
  • 监控训练:训练时查看 saves/.../trainer_log.jsonl 或使用 plot_loss: true 生成 loss 曲线图

✅ 此脚本已在 华为 Atlas 900 PoD(8×Ascend 910B) + CANN 8.0.RC2 环境实测通过。

Read more

Dify平台接入CosyVoice3 API:打造低代码语音生成SaaS服务

Dify平台接入CosyVoice3 API:打造低代码语音生成SaaS服务 在智能内容创作和个性化交互需求爆发的今天,企业与开发者越来越需要一种既能快速上线、又具备高度定制能力的语音合成方案。传统的TTS系统往往依赖专业算法团队进行模型训练与部署,周期长、成本高;而市面上许多闭源语音API虽然开箱即用,却难以满足方言支持、情感控制等复杂场景。 有没有可能让一个不懂Python、没碰过GPU服务器的人,也能在半小时内搭建出支持“四川话+兴奋语气”的语音克隆应用?答案是肯定的——通过将开源语音模型 CosyVoice3 与低代码AI平台 Dify 深度集成,我们正迎来语音生成服务的平民化时代。 CosyVoice3:不只是语音克隆,更是声音的理解与再现 FunAudioLLM团队推出的 CosyVoice3 不是一个简单的文本转语音工具,它更像是一个“声音理解引擎”。它的核心突破在于:仅需3秒音频样本,就能捕捉说话人的音色特征、语调习惯甚至地域口音,并在此基础上实现高质量的跨语言、跨风格语音生成。 这背后的技术逻辑并不复杂,但设计极为精巧。整个流程分为两个阶段: 1. 声

CCF-CSP第38次认证第二题——机器人复健指南(满分题解)

题目背景 西西艾弗岛某山脉深处出土了一台远古机器人,具体年代已不可考。初步修缮后,研究人员尝试操控机器人进行些简单的移动。 题目描述 整个实验场地被划分为 n×n个方格,从 (1,1) 到 (n,n) 进行编号。机器人只能在这些方格间移动,不能走出场地范围。 如下图所示,假设机器人当前位于 (x,y),那么接下来可以向周围八个方向跳跃移动(如果目标方格在场地范围内): 若机器人只能跳动不超过 k 步,场地内有多少方格(包括起始位置)可以抵达? 输入格式 从标准输入读入数据。 输入的第一行包含空格分隔的两个正整数 n 和 k,分别表示场地大小和跳动步数。 输入的第二行包含空格分隔的两个正整数 x 和 y,表示机器人的起始位置(保证位于场地内)。 输出格式 输出到标准输出。 输出一个整数,表示 k 步内可以抵达的方格总数。 样例1输入

【Windows安装openclaw,配置qwen模型和ollama本地模型,飞书群组添加机器人】

【Windows安装openclaw,配置qwen模型和ollama本地模型,飞书群组添加机器人】

Windows11安装OpenClaw,配置千问Qwen模型及配置服务器本地模型Ollama,接入飞书机器人 * 第一步、安装Nodejs * 第二步、安装Git * 第三步、安装Openclaw * 配置本地大模型 * 第四步、配置飞书 第一步、安装Nodejs 1、减少后续各种报错情况,先安装Nodejs,下载地址:https://nodejs.org/zh-cn/download,选择对应操作系统,24版本太新,有些依赖不适配,本文选择22.22.0版本,node-v22.22.0-x64.msi 直接双击安装即可。 2、安装完成看一下版本信息,用管理员权限打开win的PowerShell 3、执行 node -v 第二步、安装Git 1、安装Git 访问地址 https://git-scm.com/install/

AirSim无人机仿真入门(一):实现无人机的起飞与降落

AirSim无人机仿真入门(一):实现无人机的起飞与降落

概述: 安装好所需要的软件和环境,通过python代码控制无人机进行起飞和降落。 参考资料: 1、知乎宁子安大佬的AirSim教程(文字教程,方便复制) 2、B站瑜瑾玉大佬的30天RL无人机仿真教程(视频教程,方便理解) 3、AirSim官方手册(资料很全,不过是纯英文的) AirSim无人机仿真入门(一):实现无人机的起飞与降落 * 1 安装AirSim * 1.1 参考教程 * 1.2 内容梳理 * 1.3 步骤总结 * 2 开始使用 AirSim * 2.1 参考教程 * 2.2 内容梳理 * 2.3 步骤总结 * 3 撰写python控制程序 * 3.1 参考教程 * 3.2 内容梳理