项目概述

本文档记录了在 RTX 5090 GPU 环境下搭建 MedicalGPT 预训练环境并成功完成训练的完整过程。项目基于 Qwen2.5-0.5B 模型,使用 LoRA (PEFT) 方法进行预训练。

环境信息

  • 操作系统: Linux 5.15.0-94-generic
  • GPU: NVIDIA GeForce RTX 5090
  • Python: 3.11.5 (从 3.8.10 升级)
  • PyTorch: 2.9.0.dev20250805+cu128 (nightly 版本)
  • CUDA: 12.8

初始环境检查

首先检查了当前环境的基本信息:

python --version
# Python 3.8.10

nvidia-smi
# NVIDIA GeForce RTX 5090

发现 Python 版本较旧,且需要配置网络代理来访问 Hugging Face 等资源。

网络代理配置

由于网络环境限制,需要配置 Clash 代理来访问外部资源。

代理文件准备

  • clash-linux-amd64-n2023-09-05-gdcc8d87.gz - Clash 可执行文件
  • 性价比机场.yaml - 代理配置文件
  • Country.mmdb - GeoIP 数据库

代理服务启动

# 解压并设置权限
gunzip clash-linux-amd64-n2023-09-05-gdcc8d87.gz
chmod +x clash-linux-amd64-n2023-09-05-gdcc8d87

# 创建配置目录
mkdir -p ~/.config/clash

# 复制配置文件
cp "性价比机场.yaml" ~/.config/clash/config.yaml
cp Country.mmdb ~/.config/clash/
cp clash-linux-amd64-n2023-09-05-gdcc8d87 ~/.config/clash/clash

# 启动代理服务
cd ~/.config/clash && ./clash -d . &

代理测试

# 测试代理连接
curl -x http://127.0.0.1:7890 http://httpbin.org/ip
curl -x http://127.0.0.1:7890 https://huggingface.co

代理配置成功,可以正常访问外部资源。

依赖环境升级

Python 版本升级

由于 PyTorch nightly 版本需要更新的 Python 版本,将 Python 从 3.8.10 升级到 3.11.5:

conda install python=3.11 -y

PyTorch 安装

根据 NVIDIA 官方建议,安装支持 RTX 5090 的 PyTorch nightly 版本:

pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128

核心依赖安装

安装项目所需的核心依赖:

pip install transformers accelerate peft datasets loguru scikit-learn tensorboard

遇到的问题与解决方案

问题 1: CUDA 兼容性错误

错误信息

RuntimeError: CUDA error: no kernel image is available for execution on the device

原因分析
PyTorch 2.4.1 虽然支持 CUDA 12.1,但不完全兼容 RTX 5090 的 sm_120 架构。

解决方案

  1. 升级 Python 到 3.11 版本
  2. 安装 PyTorch nightly 版本 (2.9.0.dev20250805+cu128)
  3. 使用 CUDA 12.8 支持

验证结果

import torch
print(f'PyTorch version: {torch.__version__}')  # 2.9.0.dev20250805+cu128
print(f'CUDA available: {torch.cuda.is_available()}')  # True
print(f'Device name: {torch.cuda.get_device_name()}')  # NVIDIA GeForce RTX 5090

问题 2: PEFT 导入错误

错误信息

ImportError: cannot import name 'prepare_model_for_kbit_training' from 'peft'

原因分析
peft 0.3.0 版本中没有 prepare_model_for_kbit_training 函数,该函数在较新版本中才有。

解决方案
升级 peft 库到最新版本:

pip install --upgrade peft

验证结果

from peft import prepare_model_for_kbit_training
print('PEFT import successful')

问题 3: Transformers 兼容性问题

错误信息

ImportError: cannot import name 'is_torch_tpu_available' from 'transformers'

原因分析
transformers 4.55.0 版本中移除了 is_torch_tpu_available 函数。

解决方案
修改 pretraining.py 文件,移除对 is_torch_tpu_available 的依赖:

# 移除导入
from transformers import (
    AutoConfig,
    AutoModelForCausalLM,
    AutoTokenizer,
    HfArgumentParser,
    Trainer,
    Seq2SeqTrainingArguments,
    # is_torch_tpu_available,  # 移除这行
    set_seed,
    BitsAndBytesConfig,
)

# 修改使用位置
compute_metrics=compute_metrics if training_args.do_eval else None,
preprocess_logits_for_metrics=preprocess_logits_for_metrics
if training_args.do_eval
else None,

问题 4: 缺失依赖

错误信息

ModuleNotFoundError: No module named 'loguru'
RuntimeError: TensorBoardCallback requires tensorboard to be installed

解决方案
安装缺失的依赖:

pip install loguru scikit-learn tensorboard

训练配置

模型配置

  • 基础模型: Qwen/Qwen2.5-0.5B
  • 训练方法: LoRA (PEFT)
  • LoRA 配置:

    • rank: 8
    • alpha: 16.0
    • dropout: 0.05
    • target_modules: ['down_proj', 'gate_proj', 'k_proj', 'o_proj', 'q_proj', 'up_proj', 'v_proj']

训练参数

  • 批次大小: 4 (per_device_train_batch_size)
  • 梯度累积: 8 (gradient_accumulation_steps)
  • 学习率: 2e-4
  • 训练轮数: 0.5 epochs
  • 最大样本数: 10000 (训练), 10 (评估)
  • 块大小: 512 tokens
  • 优化器: AdamW (fused)
  • 精度: bfloat16

数据配置

  • 训练数据: 3 个文本文件

    • en_article_tail500.txt
    • fever.txt
    • tianlongbabu.txt
  • 数据预处理: 10 个并行工作进程
  • 训练样本数: 621 个
  • 评估样本数: 10 个

训练执行

启动训练

cd MedicalGPT
bash run_pt.sh

训练过程监控

训练过程中观察到以下关键指标:

  1. 模型加载成功

    • 成功加载 Qwen2.5-0.5B 模型
    • LoRA 配置应用成功
    • 可训练参数:4,399,104 (0.88% 的总参数)
  2. 数据处理

    • 原始数据集:3,876 个样本
    • 分词处理:使用 10 个并行进程
    • 分块处理:512 tokens 块大小
  3. 训练进度

    • 训练步数:10 步
    • 训练时间:14.67 秒
    • 训练速度:21.152 samples/second

训练结果

性能指标

  • 训练损失: 3.4131
  • 评估损失: 3.0955
  • 评估准确率: 41.66%
  • 困惑度: 22.10
  • 训练效率: 0.681 steps/second

模型输出

训练完成后,模型保存在 outputs-pt-qwen-v1/ 目录中,包含:

  • 模型检查点文件
  • LoRA 权重文件
  • 训练配置文件
  • TensorBoard 日志文件

验证结果

# 检查输出目录
ls -la outputs-pt-qwen-v1/
# 包含 adapter_config.json, adapter_model.safetensors 等文件

经验总结

关键技术点

  1. GPU 兼容性:新架构 GPU 需要使用对应的 PyTorch nightly 版本
  2. 依赖管理:及时升级关键依赖库,注意版本兼容性
  3. 网络配置:在受限网络环境下,合理配置代理服务
  4. 错误调试:逐步排查依赖和兼容性问题

最佳实践

  1. 环境隔离:使用 conda 管理 Python 环境
  2. 版本控制:记录所有依赖的版本信息
  3. 渐进式调试:从基础功能开始,逐步添加复杂功能
  4. 日志记录:详细记录每个步骤和遇到的问题

性能优化

  1. 数据预处理:使用多进程并行处理
  2. 内存管理:合理设置批次大小和梯度累积
  3. 精度选择:使用 bfloat16 平衡精度和性能
  4. 模型优化:使用 LoRA 减少可训练参数

后续工作

  1. 模型评估:在更多数据集上评估模型性能
  2. 超参数调优:优化学习率、批次大小等参数
  3. 模型部署:将训练好的模型部署到生产环境
  4. 持续训练:使用更多数据进行增量训练

参考资料


本文档记录了从环境搭建到模型训练完成的完整过程,可作为类似项目的参考指南。

标签: none

添加新评论