华为昇腾300T A2训练、微调Qwen过程,带保姆式命令,麒麟操作系统+鲲鹏CPU
{"instruction": "用Python写一个快速排序", "input": "", "output": "def quicksort(arr): ..."}模型路径示例:/home/HwHiAiUser/qwen-workspace/models/qwen/Qwen-1_8B-Chat。{"instruction": "解释量子纠缠", "input": "", "output": "量
华为昇腾300T A2训练、微调Qwen过程,带保姆式命令,麒麟操作系统+鲲鹏CPU
在 华为昇腾 Atlas 300T A2 训练卡 + 鲲鹏 CPU + 麒麟 V10 SP1 操作系统 环境下,从零开始训练/微调 Qwen-1.8B 小模型 的完整保姆级操作指南。所有命令均基于官方 CANN 8.0+ 和 PyTorch Ascend 生态,适配国产信创栈。
✅ 环境前提确认
|
项目 |
要求 |
|
服务器 |
华为 TaiShan 2280(鲲鹏 920)或 Atlas 800T A2 |
|
NPU |
Atlas 300T A2(Ascend 910B) ×1 或多卡 |
|
OS |
麒麟 V10 SP1(内核 ≥ 4.19.90-17.ky10.aarch64) |
|
用户 |
已创建 HwHiAiUser(参考 [2]) |
Bash
# 检查内核版本(必须匹配)
uname -r
# 示例输出:4.19.90-17.ky10.aarch64
# 检查NPU状态
npu-smi info
# 应显示 Ascend 910B 卡状态为 "OK"
若未安装驱动,请先按 [2] 安装 CANN 8.0+(含驱动、固件、Toolkit)。
第一步:创建专用用户并配置环境
bash
# 创建运行用户(若未创建)
sudo groupadd HwHiAiUser
sudo useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash
# 切换到该用户
su – HwHiAiUser
第二步:安装 Python 与依赖(麒麟 ARM 版)
bash
# 安装系统依赖(麒麟使用 yum)
sudo yum install -y gcc gcc-c++ make cmake zlib-devel openssl-devel sqlite-devel \
libffi-devel unzip pciutils net-tools blas-devel openblas-devel gfortran
# 安装 Python 3.9(麒麟源自带)
sudo yum install -y python39 python39-pip
# 设置软链接
sudo ln -sf /usr/bin/python3.9 /usr/bin/python3
sudo ln -sf /usr/bin/pip3.9 /usr/bin/pip3
# 升级 pip 并安装基础包
pip3 install --upgrade pip
pip3 install attrs cython numpy decorator sympy cffi pyyaml pathlib2 psutil \
protobuf scipy requests absl-py
第三步:安装 CANN 8.0+(已预装可跳过)
假设 CANN 已安装在 /usr/local/Ascend,版本 ≥ 8.0.RC1。
bash
# 配置环境变量(建议写入 ~/.bashrc)
echo 'export ASCEND_HOME=/usr/local/Ascend' >> ~/.bashrc
echo 'export PATH=$ASCEND_HOME/ascend-toolkit/latest/bin:$PATH' >> ~/.bashrc
echo 'export PYTHONPATH=$ASCEND_HOME/ascend-toolkit/latest/python/site-packages:$PYTHONPATH' >> ~/.bashrc
source ~/.bashrc
# 验证 CANN
python3 -c "import acl; print('CANN OK')"
第四步:安装 PyTorch Ascend(关键!)
bash
# 安装 torch_npu(适配 CANN 8.0 + 麒麟 ARM)
pip3 install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install torch_npu==2.1.0.post1 --extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 验证 NPU 可见性
python3 -c "
import torch
import torch_npu
print('NPU count:', torch.npu.device_count())
print('Current device:', torch.npu.current_device())
"
# 应输出:NPU count: 1(或多卡数量)
⚠️ 注意:必须使用 torch_npu 2.1.0+,旧版不支持 Qwen 的 RoPE 算子。
第五步:下载 Qwen-1.8B 模型(使用 ModelScope)
bash
# 安装 modelscope
pip3 install modelscope
# 创建目录
mkdir -p ~/qwen-workspace/{models,data,output}
# 下载模型(国内高速)
python3 -c "
from modelscope import snapshot_download
model_dir = snapshot_download('qwen/Qwen-1_8B-Chat', cache_dir='./qwen-workspace/models')
print(f'Model saved to: {model_dir}')
"
模型路径示例:/home/HwHiAiUser/qwen-workspace/models/qwen/Qwen-1_8B-Chat
第六步:准备微调数据集(以 Alpaca 格式为例)
bash
# 创建训练数据(JSONL 格式)
cat > ~/qwen-workspace/data/train.jsonl <<EOF
{"instruction": "用Python写一个快速排序", "input": "", "output": "def quicksort(arr): ..."}
{"instruction": "解释量子纠缠", "input": "", "output": "量子纠缠是..."}
EOF
实际使用时替换为你的业务数据,格式需与 transformers 兼容。
第七步:编写微调脚本(LoRA 微调,节省显存)
python
# 文件:~/qwen-workspace/finetune_qwen.py
import os
import torch
import torch_npu # 必须导入以激活NPU后端
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
from datasets import Dataset
# === 关键:限制线程避免OpenBLAS冲突(麒麟ARM常见问题)===
os.environ["OPENBLAS_NUM_THREADS"] = "1"
os.environ["OMP_NUM_THREADS"] = "1"
MODEL_PATH = "./qwen-workspace/models/qwen/Qwen-1_8B-Chat"
DEVICE = "npu:0"
# 加载 tokenizer 和 model
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_PATH,
torch_dtype=torch.float16, # 昇腾不支持 bfloat16
trust_remote_code=True,
device_map=DEVICE
)
# 添加 LoRA
peft_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters() # 应显示 ~1% 参数可训练
# 准备数据集
def tokenize_function(examples):
texts = [f"{inst}\n{inp}\n{out}" for inst, inp, out in zip(
examples['instruction'], examples['input'], examples['output'])]
return tokenizer(texts, truncation=True, padding="max_length", max_length=512)
# 从 JSONL 加载
from datasets import load_dataset
dataset = load_dataset('json', data_files='./qwen-workspace/data/train.jsonl')['train']
tokenized_dataset = dataset.map(tokenize_function, batched=True, remove_columns=dataset.column_names)
# 训练参数
training_args = TrainingArguments(
output_dir="./qwen-workspace/output",
per_device_train_batch_size=2, # 根据显存调整(300T A2 32GB HBM)
gradient_accumulation_steps=4,
learning_rate=2e-4,
num_train_epochs=3,
logging_steps=10,
save_strategy="epoch",
fp16=True, # 必须开启 FP16
ddp_find_unused_parameters=False,
report_to="none"
)
# 启动训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
)
trainer.train()
# 保存适配器
model.save_pretrained("./qwen-workspace/output/final_lora")
第八步:执行微调(带关键参数)
bash
cd ~/qwen-workspace
# 启动训练(注意:必须指定 npu 设备)
python3 finetune_qwen.py
# 若遇显存不足,降低 batch_size 或启用梯度检查点
# 在 model 初始化后添加:
# model.gradient_checkpointing_enable()
显存参考(Qwen-1.8B + LoRA):
- batch_size=2 → 显存占用 ≈ 24GB(300T A2 32GB 可行)
- 若仍 OOM,设 per_device_train_batch_size=1 + gradient_accumulation_steps=8
第九步:推理验证微调结果
python
# 文件:~/qwen-workspace/infer.py
import torch
import torch_npu
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
tokenizer = AutoTokenizer.from_pretrained("./qwen-workspace/models/qwen/Qwen-1_8B-Chat", trust_remote_code=True)
base_model = AutoModelForCausalLM.from_pretrained(
"./qwen-workspace/models/qwen/Qwen-1_8B-Chat",
torch_dtype=torch.float16,
trust_remote_code=True,
device_map="npu:0"
)
model = PeftModel.from_pretrained(base_model, "./qwen-workspace/output/final_lora")
prompt = "用Python写一个快速排序"
inputs = tokenizer(prompt, return_tensors="pt").to("npu:0")
outputs = model.generate(**inputs, max_new_tokens=200)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
运行:
bash
python3 infer.py
🔧 常见问题解决(麒麟 + 鲲鹏专属)
1. “libgomp.so.1: cannot allocate memory”
bash
# 原因:OpenMP 内存池过大
export OMP_NUM_THREADS=1
export KMP_AFFINITY=disabled
2. npu-smi 显示卡但 torch.npu 不识别
bash
# 检查驱动版本
cat /usr/local/Ascend/driver/version.info
# 必须 ≥ CANN 8.0.RC1(对应驱动 24.1.rc1+)
3. ModelScope 下载慢
bash
# 使用国内镜像
export HF_ENDPOINT=https://hf-mirror.com
# 或直接从魔搭社区网页下载 ZIP 解压
✅ 总结:关键命令清单
|
步骤 |
命令 |
|
环境检查 |
npu-smi info、uname -r |
|
安装 torch_npu |
pip3 install torch==2.1.0 torch_npu==2.1.0.post1 |
|
下载模型 |
snapshot_download('qwen/Qwen-1_8B-Chat', ...) |
|
启动训练 |
python3 finetune_qwen.py(确保 fp16=True + device_map="npu:0") |
|
推理验证 |
PeftModel.from_pretrained(...) + model.generate() |
💡 提示:完整项目模板可参考 LLaMA-Factory 升腾版(适配 CANN 8.0+)。
通过以上步骤,你可在 纯国产信创环境(麒麟+鲲鹏+昇腾) 中成功微调 Qwen 小模型,满足合规与业务需求。
更多推荐



所有评论(0)