华为昇腾 910B 使用 LLaMA-Factory 微调 Qwen3.5-32B 模型指南
在华为昇腾 910B 服务器上,使用 LLaMA-Factory 框架对 Qwen3.5-32B 大语言模型进行 LoRA 微调的完整流程。内容涵盖环境配置、依赖安装、数据集准备、多卡训练启动及效果验证。通过提供详细的 Bash 脚本和 YAML 配置文件,帮助用户实现高效的大模型本地化微调与推理部署。

在华为昇腾 910B 服务器上,使用 LLaMA-Factory 框架对 Qwen3.5-32B 大语言模型进行 LoRA 微调的完整流程。内容涵盖环境配置、依赖安装、数据集准备、多卡训练启动及效果验证。通过提供详细的 Bash 脚本和 YAML 配置文件,帮助用户实现高效的大模型本地化微调与推理部署。

华为昇腾 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(模型 + 数据集 + 缓存) |
bash
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
⚠️ 不要用 pip install torch!必须用华为官方 PyTorch NPU 包
bash
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
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
python -c "import torch; print(torch.npu.is_available()); print(torch.npu.device_count())"
bash
git clone https://gitee.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory
pip install -e ".[torch-npu,metrics]"
pip install --upgrade pillow
llamafactory-cli env
✅ 正确输出应包含: 文本
❗ Qwen3.5-32B 在 Hugging Face 需授权,国内推荐使用 ModelScope(魔搭)
bash
pip install modelscope
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
创建训练数据 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
nano data/dataset_info.json
在文件末尾添加:
json "my_company_qa": { "file_name": "my_data.json", "columns": { "prompt": "instruction", "query": "input", "response": "output" } }
创建配置文件 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_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 = 188 = 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
⚠️ 关键说明:
bash
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
torchrun \ --nnodes=1 \ --nproc_per_node=8 \ src/train.py \ --config train_qwen35_32b_lora.yaml
🕒 预计耗时:
训练完成后,加载 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 + 国内网络 |
你已完成:
💡 提示: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 # 使用说明
bash #!/bin/bash
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"
bash #!/bin/bash
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
python
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)
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")
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
bash #!/bin/bash
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/"
bash #!/bin/bash
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
bash #!/bin/bash
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"
markdown
chmod +x *.sh
./setup_env.sh # 配置环境(需手动激活 conda)
conda activate llama-factory
./download_model.sh # 下载模型(约 60GB)
python prepare_data.py # 生成示例数据
./run_train.sh # 启动 8 卡训练
./test_chat.sh # 测试微调效果
注意:首次运行需确保 CANN 8.0 已安装,且 NPU 驱动正常。
# 1. 赋权
chmod +x *.sh
# 2. 逐个执行(按 README 顺序)
./setup_env.sh
conda activate llama-factory
./download_model.sh
python prepare_data.py
./run_train.sh
./test_chat.sh

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online