CodeArts代码智能体公测尝鲜
本文介绍了如何在V100 GPU上适配ERNIE-4.5-0.3B模型的微调任务。主要内容包括:1) 下载安装华为云CodeArts开发工具;2) 分析H100/A100与V100的硬件差异(FlashAttention、BF16精度、GQA支持等);3) 提供三种适配方案(全量微调、LoRA微调、单卡微调)及详细配置参数;4) 常见问题排查方法;5) 性能预期与训练监控建议。项目包含完整的微调脚
下载安装CodeArts
先去下载:CodeArts代码智能体_懂你的编码专家-华为云
下载后安装:

启动CodeArts
安装后启动

启动后,需要登录华为云账户,且需要订购CodeArts,当然当前是测试,所以免费。可以勾选自动续费,官方说自动续费也是免费。

启动后界面如下:

修改中文界面
老规矩,先修改成中文界面
没有找到修改的地方
后来修改完成,修改步骤:
查找chinese插件并安装,按Ctrl+alt+p调出命令框,输入:Configure Display Language
然后选择中文,然后安装提示,重启即可看到中文界面。
测试
老规矩,先写一个雷电小游戏

游戏的代码一次过,这是值得肯定的。
但是效果要比kiro差一些。
让它写个大点的项目
帮我写一个ernie的0.3b模型的微调代码,当前百度飞桨提供的ernie4.5 0.3b模型的官方微调代码需要h100或a100显卡,但是我只有v100显卡,请帮我重写一个,或者把官方的移植一下以便支持v100显卡。项目放置到ernie目录。
发现它从我的硬盘寻找ernie4.5的官方微调代码。这一点,可以说方便了用户,但是它为什么不到网上去找呢?还是有利有弊的。
停止后,重新发任务:
问题可以变成这样:如何在 V100 上关闭 FlashAttention 并适配 GQA
任务:把生成这两个文件放置到ernie目录里,并写上中文readme
搞定!
下面就是CodeArts生成的项目说明书:
ERNIE 模型 V100 GPU 适配指南
本项目提供了将 ERNIE 模型从 H100/A100 GPU 适配到 V100 GPU 的完整指南和配置。
📁 文件说明
run_finetune.py- PaddleNLP 官方 ERNIE 模型微调脚本V100_Adaptation_Guide.md- 详细的 V100 适配指南(英文版)README.md- 本文件,项目说明(中文版)
🎯 核心问题
官方 ERNIE 微调代码是为 H100/A100 GPU 设计的,主要依赖以下特性:
| 特性 | H100/A100 | V100 | 解决方案 |
|---|---|---|---|
| FlashAttention | ✅ 支持 | ❌ 不支持 | 禁用 FlashAttention |
| BF16 精度 | ✅ 支持 | ❌ 不支持 | 使用 FP16 替代 |
| GQA(分组查询注意力) | ✅ 原生支持 | ⚠️ 需适配 | 确保 FP16 兼容性 |
| 显存 | 40GB/80GB | 32GB | 减小批次大小,使用 LoRA |
🚀 快速开始
1. V100 微调命令
python -m paddle.distributed.launch \
--gpus "0,1,2,3" \
run_finetune.py \
--model_name_or_path "ERNIE-4.5-0.3B" \
--dataset_name_or_path "/path/to/dataset" \
--fp16 true \
--fp16_opt_level "O1" \
--bf16 false \
--flash_mask false \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 16 \
--recompute true \
--sharding "stage2" \
--zero_padding true \
--greedy_zero_padding true \
--do_train true \
--output_dir "./output/ernie_03b_v100"
2. 关键参数说明
| 参数 | 值 | 说明 |
|---|---|---|
--fp16 true |
true |
启用 FP16 混合精度训练 |
--fp16_opt_level "O1" |
"O1" |
FP16 优化级别(O1 更稳定) |
--bf16 false |
false |
禁用 BF16(V100 不支持) |
--flash_mask false |
false |
禁用 FlashAttention(V100 不支持) |
--per_device_train_batch_size 1 |
1 |
每设备批次大小(适应 32GB 显存) |
--gradient_accumulation_steps 16 |
16 |
梯度累积步数(保持有效批次大小) |
--recompute true |
true |
启用重计算(节省显存) |
--sharding "stage2" |
"stage2" |
参数切片并行(进一步节省显存) |
--zero_padding true |
true |
零填充数据流(减少冗余计算) |
--greedy_zero_padding true |
true |
贪心零填充(进一步优化) |
📊 性能优化建议
方案一:全量微调(Full Fine-tuning)
适用于有足够显存的情况(4×V100 = 128GB 总显存)
python -m paddle.distributed.launch \
--gpus "0,1,2,3" \
run_finetune.py \
--model_name_or_path "ERNIE-4.5-0.3B" \
--dataset_name_or_path "/path/to/dataset" \
--fp16 true \
--fp16_opt_level "O1" \
--flash_mask false \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 16 \
--recompute true \
--sharding "stage2" \
--zero_padding true \
--greedy_zero_padding true \
--do_train true \
--output_dir "./output/ernie_03b_v100_full"
预计显存使用: 每卡 ~24-28GB
方案二:LoRA 微调(推荐)
适用于显存受限或需要快速实验的情况
python -m paddle.distributed.launch \
--gpus "0,1,2,3" \
run_finetune.py \
--model_name_or_path "ERNIE-4.5-0.3B" \
--dataset_name_or_path "/path/to/dataset" \
--fp16 true \
--fp16_opt_level "O1" \
--flash_mask false \
--lora true \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 8 \
--zero_padding true \
--greedy_zero_padding true \
--do_train true \
--output_dir "./output/ernie_03b_v100_lora"
预计显存使用: 每卡 ~14-18GB
方案三:单卡微调(最小资源)
适用于只有单张 V100 的情况
python run_finetune.py \
--model_name_or_path "ERNIE-4.5-0.3B" \
--dataset_name_or_path "/path/to/dataset" \
--fp16 true \
--fp16_opt_level "O1" \
--flash_mask false \
--lora true \
--lora_rank 4 \
--lora_alpha 8 \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 32 \
--recompute true \
--sharding "stage3" \
--zero_padding true \
--greedy_zero_padding true \
--do_train true \
--output_dir "./output/ernie_03b_v100_single"
预计显存使用: 单卡 ~16-20GB
🔧 常见问题排查
问题 1:显存不足(OOM)
错误信息: CUDA out of memory
解决方案:
# 减小批次大小
--per_device_train_batch_size 1
# 增加梯度累积
--gradient_accumulation_steps 32
# 启用更激进的参数切片
--sharding "stage3"
# 使用更小的 LoRA rank
--lora_rank 4
问题 2:训练损失变为 NaN
错误信息: Loss becomes NaN during training
解决方案:
# 使用 O1 而不是 O2
--fp16_opt_level "O1"
# 增加损失缩放
--scale_loss 2048.0
# 启用梯度裁剪
--max_grad_norm 1.0
问题 3:训练速度慢
错误信息: Training is very slow
解决方案:
# 启用零填充
--zero_padding true
--greedy_zero_padding true
# 增加批次大小(如果显存允许)
--per_device_train_batch_size 2
# 减少梯度累积
--gradient_accumulation_steps 8
问题 4:GQA 不工作
错误信息: Errors related to grouped query attention
解决方案:
# 在代码中验证 GQA 支持
print(f"Model supports GQA: {hasattr(model.config, 'num_key_value_heads')}")
# 如果不支持,回退到标准注意力
if not hasattr(model.config, 'num_key_value_heads'):
model.config.num_key_value_heads = model.config.num_attention_heads
📈 性能预期
训练速度估算
| 配置 | 批次大小 | GPU 数量 | 速度(tokens/秒) |
|---|---|---|---|
| 全量微调 | 1×16 | 4 | ~8,000 |
| 全量微调 | 1×32 | 4 | ~6,500 |
| LoRA 微调 | 2×8 | 4 | ~12,000 |
显存使用估算
| 配置 | 每卡显存 | 总显存(4 卡) |
|---|---|---|
| 全量微调 + FP16 | ~28GB | ~112GB |
| 全量微调 + FP16 + 重计算 | ~24GB | ~96GB |
| LoRA + FP16 | ~18GB | ~72GB |
| LoRA + FP16 + 重计算 | ~14GB | ~56GB |
✅ 训练前检查清单
环境检查
- 验证 V100 GPU 可用性和驱动版本
- 安装 PaddlePaddle 和 PaddleNLP
- 下载 ERNIE-4.5-0.3B 模型权重
- 准备训练数据集
配置检查
- 禁用 FlashAttention (
--flash_mask false) - 使用 FP16 而非 BF16 (
--fp16 true,--bf16 false) - 为 32GB 显存设置合适的批次大小
- 启用梯度累积
- 考虑使用 LoRA 提高显存效率
- 启用零填充提高效率
- 测试模型加载和前向传播
- 验证 GQA 配置
训练监控
- 监控 GPU 显存使用
- 观察损失值是否出现 NaN
- 检查训练速度
- 验证检查点保存
- 监控评估指标
📚 相关资源
官方文档
- PaddleNLP: https://github.com/PaddlePaddle/PaddleNLP
- PaddleNLP 微调文档:
llm/docs/finetune.md - PaddlePaddle 文档: https://www.paddlepaddle.org.cn/
GPU 规格
- NVIDIA V100: https://www.nvidia.com/en-us/data-center/v100/
- NVIDIA A100: https://www.nvidia.com/en-us/data-center/a100/
- NVIDIA H100: https://www.nvidia.com/en-us/data-center/h100/
相关论文
- FlashAttention: https://arxiv.org/abs/2205.14135
- GQA (Grouped Query Attention): https://arxiv.org/abs/2305.13245
- LoRA: https://arxiv.org/abs/2106.09685
📝 详细文档
完整的英文适配指南请查看:V100_Adaptation_Guide.md
该文档包含:
- GPU 架构详细对比
- 代码修改示例
- 自定义注意力实现
- 性能优化技巧
- 验证和测试脚本
🎓 使用示例
示例 1:基础微调
# 最小化配置,适用于快速测试
python run_finetune.py \
--model_name_or_path "ERNIE-4.5-0.3B" \
--dataset_name_or_path "./data" \
--fp16 true \
--flash_mask false \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 16 \
--do_train true \
--output_dir "./output/test"
示例 2:生产环境配置
# 完整配置,适用于生产环境
python -m paddle.distributed.launch \
--gpus "0,1,2,3" \
run_finetune.py \
--model_name_or_path "ERNIE-4.5-0.3B" \
--tokenizer_name_or_path "ERNIE-4.5-0.3B" \
--dataset_name_or_path "./data" \
--dataset_split "train" \
--max_length 2048 \
--zero_padding true \
--greedy_zero_padding true \
--do_train true \
--do_eval true \
--output_dir "./output/ernie_03b_production" \
--logging_steps 10 \
--save_steps 500 \
--eval_steps 500 \
--fp16 true \
--fp16_opt_level "O1" \
--bf16 false \
--flash_mask false \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 16 \
--recompute true \
--sharding "stage2" \
--lora true \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.05 \
--num_train_epochs 3 \
--learning_rate 5e-5 \
--warmup_ratio 0.1 \
--weight_decay 0.01 \
--evaluation_strategy "steps" \
--save_strategy "steps" \
--save_total_limit 3
示例 3:自定义数据集
# 使用自定义 JSON 格式数据集
python run_finetune.py \
--model_name_or_path "ERNIE-4.5-0.3B" \
--dataset_name_or_path "./custom_data" \
--fp16 true \
--flash_mask false \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 16 \
--do_train true \
--output_dir "./output/custom"
数据集格式示例 (custom_data/train.json):
[
{
"src": "用户的问题或输入",
"tgt": "模型的期望回答"
},
{
"src": "另一个问题",
"tgt": "对应的回答"
}
]
🔍 验证脚本
测试 V100 兼容性
#!/usr/bin/env python
"""测试 V100 兼容性"""
import paddle
from paddlenlp.transformers import AutoModelForCausalLM
# 加载模型
model = AutoModelForCausalLM.from_pretrained("ERNIE-4.5-0.3B")
# 测试 FP16
model = model.to(dtype=paddle.float16)
print("✓ FP16 转换成功")
# 测试前向传播
dummy_input = paddle.randint(0, 1000, (1, 128))
output = model(dummy_input)
print("✓ 前向传播成功")
# 测试 FlashAttention 已禁用
assert model.config.use_flash_attention == False
print("✓ FlashAttention 已禁用")
print("\n✓ 所有 V100 兼容性测试通过!")
训练监控
#!/usr/bin/env python
"""训练监控"""
import paddle
def monitor_training(loss, step):
"""监控训练过程"""
if step % 100 == 0:
gpu_mem = paddle.device.cuda.max_memory_allocated() / 1024**3
print(f"Step {step}: Loss={loss:.4f}, GPU Memory={gpu_mem:.2f}GB")
📞 技术支持
如有问题,请参考:
- PaddleNLP GitHub Issues: https://github.com/PaddlePaddle/PaddleNLP/issues
- PaddlePaddle 论坛: https://www.paddlepaddle.org.cn/
- 详细英文指南:
V100_Adaptation_Guide.md
📄 许可证
本项目基于 PaddleNLP 的 Apache 2.0 许可证。
最后更新: 2026-01-31
测试环境: PaddleNLP 最新版本, ERNIE-4.5-0.3B, NVIDIA V100 32GB
更多推荐



所有评论(0)