ChatGLM3单机多卡LoRA微调报错问题分析与解决
问题背景
在使用ChatGLM3进行LoRA微调时,用户遇到了单机多卡运行时的CUDA设备序号无效错误。具体表现为当尝试使用torchrun启动多进程训练时,系统抛出"RuntimeError: CUDA error: invalid device ordinal"错误。
环境配置分析
从问题描述中可以看到用户的环境配置如下:
- CUDA 12.1
- Transformers 4.38.1
- Python 3.11.8
- Linux CentOS 7.9操作系统
- 两张NVIDIA RTX 3090显卡(24GB显存)
问题原因
经过分析,该问题主要由以下几个因素导致:
-
设备数量不匹配:用户在torchrun命令中设置了
--nproc_per_node=8,但实际只有2张显卡。这个参数应该与实际GPU数量一致。 -
DeepSpeed配置问题:DeepSpeed的安装或配置可能存在问题,特别是Zero阶段2的配置可能不正确。
-
环境依赖不完整:虽然用户已经安装了主要依赖,但某些关键依赖如typer、nltk等需要额外安装。
解决方案
1. 正确设置GPU数量参数
将torchrun命令中的--nproc_per_node参数设置为实际GPU数量:
OMP_NUM_THREADS=1 torchrun --standalone --nnodes=1 --nproc_per_node=2 finetune_hf.py data/AdvertiseGen/ THUDM/chatglm3-6b configs/lora.yaml --deepspeed ds_zero_2.json
2. 确保DeepSpeed正确安装
按照官方推荐方式安装DeepSpeed:
pip install deepspeed
并验证安装是否成功:
ds_report
3. 检查并完善环境依赖
确保所有必要的Python包都已安装:
pip install typer nltk sentencepiece transformers
4. 代码修改建议
对于finetune_hf.py中154行的修改是合理的,可以避免某些环境下的参数初始化问题:
default_factory = lambda: Seq2SeqTrainingArguments(output_dir='./output')
深入技术解析
CUDA设备序号无效的本质
"invalid device ordinal"错误通常发生在以下几种情况:
- 尝试访问不存在的GPU设备
- GPU设备索引超出范围
- CUDA驱动与运行时版本不匹配
- GPU设备未被正确初始化
在多卡训练场景下,torchrun会为每个进程分配一个GPU设备。当请求的设备数量超过实际可用数量时,就会出现此错误。
DeepSpeed Zero阶段2配置要点
使用DeepSpeed的Zero阶段2优化时,需要注意:
- 确保batch size适合多卡训练
- 检查梯度累积步数设置
- 验证优化器状态和梯度分片配置
- 监控显存使用情况,避免OOM
最佳实践建议
- 环境检查脚本:在运行训练前,建议先运行简单的CUDA设备检查脚本:
import torch
print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"GPU数量: {torch.cuda.device_count()}")
for i in range(torch.cuda.device_count()):
print(f"GPU {i}: {torch.cuda.get_device_name(i)}")
-
逐步验证:建议先使用单卡验证训练流程,再扩展到多卡。
-
日志监控:增加训练日志输出,特别是设备分配和显存使用情况。
-
版本兼容性:确保PyTorch、CUDA、DeepSpeed等关键组件的版本兼容性。
总结
ChatGLM3的LoRA微调在多卡环境下运行时,需要特别注意设备数量的正确配置和DeepSpeed环境的完整性。通过合理设置torchrun参数、完善环境依赖以及正确配置DeepSpeed,可以有效解决"invalid device ordinal"错误,实现高效的多卡训练。对于大规模模型微调,建议进一步研究梯度累积、混合精度训练等优化技术,以充分利用多GPU的计算能力。
AutoGLM-Phone-9BAutoGLM-Phone-9B是基于AutoGLM构建的移动智能助手框架,依托多模态感知理解手机屏幕并执行自动化操作。Jinja00
Kimi-K2-ThinkingKimi K2 Thinking 是最新、性能最强的开源思维模型。从 Kimi K2 开始,我们将其打造为能够逐步推理并动态调用工具的思维智能体。通过显著提升多步推理深度,并在 200–300 次连续调用中保持稳定的工具使用能力,它在 Humanity's Last Exam (HLE)、BrowseComp 等基准测试中树立了新的技术标杆。同时,K2 Thinking 是原生 INT4 量化模型,具备 256k 上下文窗口,实现了推理延迟和 GPU 内存占用的无损降低。Python00
GLM-4.6V-FP8GLM-4.6V-FP8是GLM-V系列开源模型,支持128K上下文窗口,融合原生多模态函数调用能力,实现从视觉感知到执行的闭环。具备文档理解、图文生成、前端重构等功能,适用于云集群与本地部署,在同类参数规模中视觉理解性能领先。Jinja00
HunyuanOCRHunyuanOCR 是基于混元原生多模态架构打造的领先端到端 OCR 专家级视觉语言模型。它采用仅 10 亿参数的轻量化设计,在业界多项基准测试中取得了当前最佳性能。该模型不仅精通复杂多语言文档解析,还在文本检测与识别、开放域信息抽取、视频字幕提取及图片翻译等实际应用场景中表现卓越。00
GLM-ASR-Nano-2512GLM-ASR-Nano-2512 是一款稳健的开源语音识别模型,参数规模为 15 亿。该模型专为应对真实场景的复杂性而设计,在保持紧凑体量的同时,多项基准测试表现优于 OpenAI Whisper V3。Python00
GLM-TTSGLM-TTS 是一款基于大语言模型的高质量文本转语音(TTS)合成系统,支持零样本语音克隆和流式推理。该系统采用两阶段架构,结合了用于语音 token 生成的大语言模型(LLM)和用于波形合成的流匹配(Flow Matching)模型。 通过引入多奖励强化学习框架,GLM-TTS 显著提升了合成语音的表现力,相比传统 TTS 系统实现了更自然的情感控制。Python00
Spark-Formalizer-X1-7BSpark-Formalizer 是由科大讯飞团队开发的专用大型语言模型,专注于数学自动形式化任务。该模型擅长将自然语言数学问题转化为精确的 Lean4 形式化语句,在形式化语句生成方面达到了业界领先水平。Python00