一、问题总结
离线环境的单机多卡,在分布式推理和微调的时候出现了三个现象:
序号 | 问题描述 | 具体情况 |
---|---|---|
1 | 回答速度非常慢 | 在离线环境下,尽管服务器配置了三张高性能卡(每张显存80G,算力大于9),推理速度依旧非常慢。同时,显存利用率高达80%。 |
2 | 输出乱七八糟 | 输出结果不可理解,包含多个国家语言的混合以及奇怪符号,与预期输出严重不符,但此现象不同于编码解码错误。 |
3 | 多轮对话报错 | 前几轮对话不仅响应速度慢且输出无意义内容。大约在第三轮对话时出现技术错误提示:“torch.distributed.distbackenderror:NCLL error unhandled system error”,疑似分布式引擎出现问题。 |
二、可能的原因分析
首先使用transformers库写一个脚本,测试一下模型本身有没有问题,能正常推理,没有问题。然后把llamafactory里面所有可能影响显存的超参数都设置到很小的值,无法正常训练和推理。说明有可能是llamafactory的框架问题。但之前又在报分布式的错误!
于是分析可得,是llamafactory在执行分布式推理和训练的时候配置有问题!查询官方文档,可知单机多卡命令如下:
# 使用CUDA_VISIBLE_DEVICES来制定哪几块GPU参与分布式
CUDA_VISIBLE_DEVICES=0,1 llamafactory-cli train config/config1.yaml
【注】如果你配置CUDA_VISIBLE_DEVICES环境变量为多张显卡,那么llamafactory将会使用分布式引擎。如果你没有设置CUDA_VISIBLE_DEVICES,默认使用开启分布式且使用所有GPU
于是,我测试了只用一张卡,看看能否正常工作。也就是CUDA_VISIBLE_DEVICES只设置一张卡,命令如下:
# 指定只用cuda:0这张卡
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train config/config1.yaml
结果问题消失了,模型可以正常输出且使用huggingface推理的速度也很快。这就让我费解,为什么单机多卡无法成功?经过思考得出——离线单机多卡可能,也许,无法工作。
我猜测是因为以下这几点可能的原因:
- 多机多卡训练:LLaMA-Factory支持使用DeepSpeed、DDP和FSDP等分布式引擎进行多机多卡训练。这些引擎依赖于网络通信来同步模型参数和梯度。没有网络连接,分布式训练将无法进行,限制了利用多台服务器资源加速训练的能力。
- 单机多卡训练:虽然单机多卡训练在同一台机器上进行,但某些分布式设置和协调仍可能依赖于网络接口。部分情况下,网络中断可能导致通信问题,影响训练效率或稳定性。