下载安装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")

📞 技术支持

如有问题,请参考:

  1. PaddleNLP GitHub Issues: https://github.com/PaddlePaddle/PaddleNLP/issues
  2. PaddlePaddle 论坛: https://www.paddlepaddle.org.cn/
  3. 详细英文指南V100_Adaptation_Guide.md

📄 许可证

本项目基于 PaddleNLP 的 Apache 2.0 许可证。


最后更新: 2026-01-31
测试环境: PaddleNLP 最新版本, ERNIE-4.5-0.3B, NVIDIA V100 32GB

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐