ChatGLM3多卡微调问题分析与解决方案
问题背景
在使用ChatGLM3进行模型微调时,许多开发者遇到了多卡训练模式下不输出结果的问题。具体表现为:当使用torchrun启动多卡训练时,程序很快显示"训练成功",但实际上没有生成预期的checkpoint输出文件,同时在日志中会出现关于deepspeed配置文件未保存的警告信息。
问题原因分析
经过技术分析,这个问题主要由以下几个因素导致:
-
参数解析错误:最新版本的finetune_hf.py脚本已经不再直接接受deepspeed配置文件作为命令行参数。当用户仍然在命令中传入ds_zero_2.json路径时,该参数会被错误地解析为checkpoint路径,导致程序跳过训练阶段。
-
配置文件路径问题:在多卡环境下,相对路径的解析可能出现问题,导致程序无法正确找到deepspeed配置文件。
-
训练流程异常:由于上述原因,程序实际上执行的是评估(evaluate)流程而非训练(training)流程,因此不会生成预期的模型输出。
解决方案
正确配置方法
-
修改lora.yaml配置文件: 打开configs/lora.yaml文件,找到关于deepspeed的配置部分(通常在38行附近),取消注释并修改为绝对路径:
deepspeed: /your/absolute/path/to/ds_zero_2.json -
使用简化命令: 执行训练时,只需传入三个必要参数:
OMP_NUM_THREADS=1 torchrun --standalone --nnodes=1 --nproc_per_node=2 finetune_hf.py \ /path/to/your/data/ \ /path/to/chatglm3-6b/ \ /path/to/configs/lora.yaml
注意事项
-
路径规范:建议所有路径都使用绝对路径,避免在多卡环境下出现路径解析问题。
-
输出检查:训练完成后,应在output目录下检查是否生成了预期的checkpoint文件。正常情况应该会生成类似checkpoint-3000这样的目录。
-
推理使用:微调完成后进行推理时,应指定正确的checkpoint路径:
CUDA_VISIBLE_DEVICES=1 python inference_hf.py output/checkpoint-3000/ --prompt
技术原理
这个问题涉及到PyTorch分布式训练的几个关键点:
-
Deepspeed集成:ChatGLM3使用Deepspeed来优化多卡训练,但配置方式已经从命令行参数改为通过yaml文件配置。
-
分布式训练初始化:torchrun会自动处理多进程的启动和通信,但各进程需要能够访问相同的配置文件。
-
模型保存机制:在多卡环境下,模型保存通常由主进程负责,其他进程会跳过保存步骤以避免冲突。
最佳实践建议
-
环境检查:在开始训练前,先使用单卡模式验证数据和配置是否正确。
-
日志监控:训练过程中应监控日志输出,确认实际执行的是训练流程而非评估流程。
-
资源分配:根据显存大小合理设置batch size,多卡训练时可以适当增大总batch size。
-
版本兼容性:注意检查ChatGLM3的版本更新,及时调整训练脚本以适应API变化。
通过以上方法和注意事项,开发者可以顺利地在多卡环境下完成ChatGLM3的微调任务,并获得预期的模型输出结果。
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
LongCat-AudioDiT-1BLongCat-AudioDiT 是一款基于扩散模型的文本转语音(TTS)模型,代表了当前该领域的最高水平(SOTA),它直接在波形潜空间中进行操作。00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
HY-Embodied-0.5这是一套专为现实世界具身智能打造的基础模型。该系列模型采用创新的混合Transformer(Mixture-of-Transformers, MoT) 架构,通过潜在令牌实现模态特异性计算,显著提升了细粒度感知能力。Jinja00
FreeSql功能强大的对象关系映射(O/RM)组件,支持 .NET Core 2.1+、.NET Framework 4.0+、Xamarin 以及 AOT。C#00