华为昇腾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

AI魔术师:基于视觉的增强现实特效

AI魔术师:基于视觉的增强现实特效

AI魔术师:基于视觉的增强现实特效 * 一、前言 * 二、AR 与视觉 AI 的技术基石 * 2.1 增强现实的核心概念 * 2.2 计算机视觉与 AI 的技术融合 * 2.3 技术栈选型与环境搭建 * 三、视觉 AR 的核心技术解析 * 3.1 相机标定与坐标系统 * 3.1.1 相机标定原理 * 3.1.2 标定代码实现 * 3.2 实时特征跟踪技术 * 3.2.1 ORB 特征跟踪原理 * 3.2.2 单目视觉里程计实现 * 3.3 语义分割与虚实融合

Cameralink 图像输出和采集时序,针对FPGA开发

Cameralink 图像输出和采集时序,针对FPGA开发

Cameralink使用接口芯片进行开发的时候,例如国产芯片GM8283、GM8284,GM8284等等。都可以支持宽温85Mhz以上。老外的芯片:例如DS90CR285. DS90CR2856 ,DS90CR287.DS90CR288.   精典的Cameralink接口芯片。              那么FPGA接这些芯片的时候,给的时序可以参考Cameralink标准定义进行。下面进行一些举例说明。 (1)mono8, 8Tap 黑白图像              该模式下,一个时钟输出8个x方向的相邻像素,占用A、B、C、D、E、F、G、H共8个通道,A通道输出tap1,B通道输出tap2,C通道输出tap3,D通道输出tap4,E通道输出tap5,F通道输出tap6,G通道输出tap7,H通道输出tap8,如下图所示。 具体时序图,如下所示。              图像分辨率为m行和n列,那么一个FVAL信号包括m个LVAL信号,一个LVAL信号包括n/8个CLOCK时钟。 数据输出的有效期或者无效期,时钟信号CLOCK一直有效,时钟

Flutter 三方库 wallet_connect 的鸿蒙化适配指南 - 实现 Web3 钱包协议连接、支持 DApp 授权登录与跨链交易签名实战

Flutter 三方库 wallet_connect 的鸿蒙化适配指南 - 实现 Web3 钱包协议连接、支持 DApp 授权登录与跨链交易签名实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wallet_connect 的鸿蒙化适配指南 - 实现 Web3 钱包协议连接、支持 DApp 授权登录与跨链交易签名实战 前言 在进行 Flutter for OpenHarmony 的去中心化应用(DApp)或加密货币钱包开发时,支持标准的 WalletConnect 协议是链接用户钱包的关键。wallet_connect 是该协议的 Dart 实现,它能让你的鸿蒙 App 安全地与 MetaMask、Trust Wallet 等钱包建立双向加密连接。本文将探讨如何在鸿蒙系统下构建安全、稳定的 Web3 授权流程。 一、原理解析 / 概念介绍 1.1 基础原理

Android Studio WebView实战:从零封装H5网站为原生APP

1. 为什么选择WebView封装H5应用 作为一个有多年移动开发经验的开发者,我见过太多团队在面临"将网站快速转为APP"需求时的纠结。原生开发虽然体验好,但成本高、周期长;跨平台框架学习曲线陡峭,配置复杂。而Android WebView提供了一种轻量级解决方案,特别适合内容展示型应用。 我记得第一次用WebView封装H5网站时,只用了不到30分钟就让一个新闻网站变成了可安装的APP。那种快速验证想法的感觉真是太棒了!不过也要说实话,WebView不是万能药,它最适合展示型应用,如果要复杂交互或高性能游戏,还是得考虑其他方案。 现在很多知名应用都在部分模块中使用WebView技术,特别是电商的商品详情页、新闻的文章页面等更新频繁的内容。这种混合开发模式既能快速迭代,又能保持核心体验的原生性能。 2. 环境准备与项目创建 2.1 安装Android Studio 首先需要安装Android Studio,这是Google官方推荐的开发工具。我建议直接到官网下载最新版本,目前稳定版是Android Studio Giraffe。安装过程很简单,基本上就是一路点击"Nex