当前位置: 首页 > news >正文

gloo 多卡训练

我们遇到了分布式训练中的通信超时问题(Connection closed by peer)。根据错误信息,问题发生在梯度同步的屏障(barrier)操作时。以下是针对此问题的优化措施和代码修改:

优化措施:

增强通信稳定性:增加超时时间,添加重试机制。
优化内存管理:在内存使用过高时减少批量大小。
改进梯度同步机制:使用容错的屏障操作,在超时时尝试重新初始化通信组。
添加节点健康检查:在每个训练步骤开始前检查节点状态,遇到不健康节点时重启训练。
具体代码修改如下:

在DeepSpeed配置中增加超时设置和重试机制:
将comms_timeout增加到7200秒(2小时)
在MPI配置中添加重试次数和单次操作超时
在训练步骤中,添加内存使用检查,如果内存使用超过85%,则减少每个GPU的微批量大小。
实现一个安全的屏障函数(safe_barrier),它会在超时后尝试重新初始化分布式环境。
在每个训练步骤开始前,添加节点健康检查。如果发现节点不健康,则重启训练(这里我们简单记录错误并退出,由外部调度系统重启)。
将原有的dist.barrier()替换为safe_barrier()。
在训练步骤中,当梯度累积计数器达到梯度累积步数时,执行梯度同步(step操作)后,我们还需要检查通信是否成功。
在训练循环中,我们还需要处理可能的异常,并在发生通信错误时尝试恢复。
考虑到代码长度,以下只展示修改的关键部分。由于原代码较长,我将只展示修改后的train_step函数、新增的safe_barrier函数和节点健康检查函数,以及修改后的DeepSpeed配置。

注意:由于用户要求返回修改后的全部代码,我将整合所有修改,但由于字符限制,这里只提供修改后的完整代码框架,重点展示修改部分。

修改后的代码:在服务器上安装NCCL(NVIDIA Collective Communications Library)通常不需要重启系统,但具体情况取决于安装方式和系统状态。以下是详细说明:

1. 是否需要重启?

通常不需要重启,但需要注意以下几点:

1.1 环境变量更新

如果安装后需要设置环境变量(如LD_LIBRARY_PATH),新变量需要被当前shell会话加载。可以通过以下方式使其生效:

# 方法1:重新加载环境配置(例如bash)
source ~/.bashrc  # 或 .bash_profile, .zshrc 等,取决于你的shell# 方法2:直接在当前终端设置变量
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
1.2 CUDA驱动依赖

如果NCCL版本与现有CUDA驱动不兼容,可能需要更新驱动。此时建议重启以确保新驱动完全生效。

1.3 应用程序重新启动

已运行的程序不会自动加载新安装的NCCL库,需要重启相关应用(如深度学习训练脚本、Jupyter内核等)。

2. 安装后的验证步骤

安装完成后,建议通过以下命令验证NCCL是否正确安装且无需重启:

# 检查NCCL头文件和库文件
ls /usr/local/cuda/include/nccl.h
ls /usr/local/cuda/lib64/libnccl.so# 验证环境变量
echo $LD_LIBRARY_PATH  # 应包含 /usr/local/cuda/lib64# 运行简单的NCCL测试(如果已安装测试工具)
nccl-tests/build/all_reduce_perf -b 8 -e 1G -f 2 -g 1

3. 需要重启的特殊情况

如果遇到以下情况,建议重启

  • 安装过程中更新了CUDA驱动或GPU固件。
  • 修改了系统级配置文件(如/etc/profile)。
  • 安装后系统报告库文件加载失败(如libnccl.so: cannot open shared object file)。

4. 最佳实践

  1. 优先避免重启:通过重新加载环境变量和重启应用程序验证功能。
  2. 检查兼容性:确保NCCL版本与CUDA、PyTorch/TensorFlow等框架兼容。
  3. 使用容器化环境(如Docker):可避免系统级依赖问题,无需重启主机。

总结

大多数情况下,安装NCCL后无需重启系统,只需更新环境变量并重启相关应用程序即可。仅在涉及驱动更新或系统配置变更时需要重启。使用容器化环境(如Docker)部署深度学习任务确实能有效避免系统级依赖问题,以下是具体说明和操作指南:

为什么选择Docker?

  1. 隔离性:容器内的环境(如CUDA、NCCL、Python包)与主机完全隔离,不会影响系统其他组件。
  2. 可移植性:一次构建的镜像可在任何支持Docker的环境中运行,确保环境一致性。
  3. 无需重启主机:容器启动时会加载所需的所有依赖,无需修改主机系统或重启。
  4. 版本控制:可轻松切换不同版本的CUDA、NCCL或框架(如PyTorch)。

如何在Docker中配置深度学习环境?

1. 安装Docker和NVIDIA Container Toolkit
# 安装Docker CE
curl -fsSL https://get.docker.com | sh
sudo systemctl start docker
sudo systemctl enable docker# 安装NVIDIA Container Toolkit(允许Docker容器访问GPU)
distribution=$(. /etc/os-release; echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
2. 使用预构建的深度学习镜像

NVIDIA提供了预配置好CUDA、NCCL和常见框架的Docker镜像:

# 拉取PyTorch官方镜像(包含CUDA和NCCL)
docker pull nvcr.io/nvidia/pytorch:23.06-py3  # 版本号可根据需要调整# 启动容器(挂载当前目录到容器内的/workspace)
docker run --gpus all -it -v $(pwd):/workspace nvcr.io/nvidia/pytorch:23.06-py3
3. 自定义Dockerfile(推荐)

创建自己的Dockerfile以精确控制环境:

# 使用NVIDIA PyTorch基础镜像
FROM nvcr.io/nvidia/pytorch:23.06-py3# 安装额外依赖
RUN pip install deepspeed transformers  # 添加你需要的包# 设置工作目录
WORKDIR /workspace# 复制代码到容器内
COPY . /workspace# 启动命令(示例)
CMD ["deepspeed", "7t3-4-rl.py"]

构建并运行:

# 构建镜像
docker build -t my-rl-environment .# 运行容器
docker run --gpus all -it my-rl-environment

在容器中使用DeepSpeed和NCCL

  1. 无需额外安装NCCL:NVIDIA基础镜像已包含预配置的NCCL,且与CUDA版本兼容。
  2. 分布式训练:在容器内直接使用DeepSpeed或torch.distributed,无需担心MPI或NCCL兼容性。

示例命令:

docker run --gpus all -it --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \my-rl-environment \deepspeed --include localhost:0,1 7t3-4-rl.py

常见问题解决方案

  1. 容器内无法访问GPU

    # 检查GPU是否被Docker识别
    docker run --gpus all nvcr.io/nvidia/cuda:11.8.0-base nvidia-smi
    
  2. 容器与主机的CUDA版本不匹配

    • 确保主机的NVIDIA驱动版本支持容器内的CUDA版本(驱动兼容性表)。
  3. 挂载数据卷

    # 将主机数据目录挂载到容器
    docker run --gpus all -v /path/on/host:/data my-rl-environment
    

总结

使用Docker容器部署深度学习任务的优势:

  • 零系统污染:所有依赖都在容器内,不会影响主机。
  • 快速部署:避免繁琐的环境配置,一键启动。
  • 可复现性:确保开发、测试和生产环境一致。

建议优先使用容器化方案,特别是在共享服务器或多用户环境中。要确定NVIDIA Container Toolkit是否安装成功,可以通过以下步骤进行验证:

1. 检查服务状态

验证NVIDIA Container Toolkit服务是否正常运行:

sudo systemctl status nvidia-container-runtime
  • 正常状态:显示 active (running)
  • 异常状态:若显示 inactive 或报错,可能需要重新安装或检查配置。

2. 检查Docker配置

确认Docker已配置为使用NVIDIA运行时:

sudo cat /etc/docker/daemon.json
  • 正确配置:应包含类似以下内容:
    {"runtimes": {"nvidia": {"path": "nvidia-container-runtime","runtimeArgs": []}}
    }
    
  • 若文件不存在或内容缺失:需重新配置Docker,参考官方文档。

3. 运行GPU容器测试

通过官方CUDA容器验证GPU是否可被容器访问:

sudo docker run --rm --gpus all nvidia/cuda:11.8.0-base nvidia-smi
  • 成功标志:输出GPU信息(如GPU型号、温度、显存使用情况)。
  • 失败标志
    • 报错 unknown flag: --gpus:Docker版本过低(需Docker 19.03+)。
    • 报错 Could not select device driver:NVIDIA Container Toolkit未正确安装。
    • 报错 Failed to initialize NVML:主机NVIDIA驱动与容器内CUDA版本不兼容。

4. 检查工具包版本

确认已安装的NVIDIA Container Toolkit版本:

sudo apt list --installed | grep nvidia-container-toolkit

输出示例:

nvidia-container-toolkit/jammy,now 1.13.5-1 amd64 [installed]

5. 检查驱动兼容性

确保主机NVIDIA驱动版本支持容器内的CUDA版本:

# 查看主机驱动版本
nvidia-smi  # 输出中 "Driver Version" 字段# 查看容器内CUDA版本
sudo docker run --rm --gpus all nvidia/cuda:11.8.0-base nvcc --version

参考NVIDIA驱动兼容性矩阵确保版本匹配。

6. 检查容器内GPU设备节点

运行容器并检查 /dev/nvidia* 设备节点是否存在:

sudo docker run --rm --gpus all -it nvidia/cuda:11.8.0-base bash

在容器内执行:

ls -l /dev/nvidia*
  • 正常输出:显示多个NVIDIA设备节点(如 /dev/nvidia0/dev/nvidiactl)。
  • 异常输出:无设备节点或权限错误,可能是容器运行时配置问题。

故障排除

  • 重启Docker服务

    sudo systemctl restart docker
    
  • 重新安装NVIDIA Container Toolkit

    sudo apt-get remove --purge nvidia-container-toolkit
    sudo apt-get install nvidia-container-toolkit
    
  • 查看日志

    sudo journalctl -u docker.service
    

总结

  • 核心验证:成功运行 docker run --gpus all ... nvidia-smi 并输出GPU信息。
  • 依赖检查:确保Docker版本 ≥ 19.03,主机驱动与容器CUDA兼容。
  • 配置检查:确保 /etc/docker/daemon.json 包含NVIDIA运行时配置。

如果仍有问题,请提供具体错误日志以便进一步排查。根据输出结果,NVIDIA Container Toolkit 已成功安装,版本为 1.17.8-1

关键信息确认:

  1. 已安装包

    nvidia-container-toolkit-base/unknown,now 1.17.8-1 amd64 [installed,automatic]
    nvidia-container-toolkit/unknown,now 1.17.8-1 amd64 [installed]
    
    • nvidia-container-toolkit 是核心组件,负责容器与GPU的集成。
    • nvidia-container-toolkit-base 是依赖库,通常由主包自动安装。
  2. 版本兼容性

    • 该版本支持 CUDA 11.x/12.xDocker 20.10+,与当前主流深度学习框架兼容。

进一步验证(建议操作):

# 1. 检查Docker能否访问GPU
sudo docker run --rm --gpus all nvidia/cuda:11.8.0-base nvidia-smi# 2. 确认容器内可见GPU数量(假设主机有2个GPU)
sudo docker run --rm --gpus all python:3.10-slim python -c "import torch; print(torch.cuda.device_count())"

潜在问题与解决方案:

  1. 若命令报错 --gpus: unknown flag

    • 原因:Docker版本过低(需 ≥ 19.03)。
    • 解决:升级Docker:
      sudo apt-get update
      sudo apt-get install --only-upgrade docker-ce
      
  2. nvidia-smi 在容器内报错

    • 原因:主机驱动与容器内CUDA版本不兼容。
    • 解决:确保主机驱动版本 ≥ 容器CUDA所需的最低版本(参考NVIDIA驱动矩阵)。
  3. 若容器启动失败

    • 原因:Docker配置未正确指向NVIDIA运行时。
    • 解决:检查并修改 /etc/docker/daemon.json
      {"runtimes": {"nvidia": {"path": "nvidia-container-runtime","runtimeArgs": []}},"default-runtime": "nvidia"  # 可选,设置为默认运行时
      }
      
      然后重启Docker:
      sudo systemctl restart docker
      

总结:

NVIDIA Container Toolkit 已正确安装,建议通过运行GPU容器测试(如 nvidia-smi)验证最终功能。若遇到问题,可根据具体错误日志进一步排查。目前没有直接找到完全匹配“deepspeed、pytorch、python3.12、强化学习”的现成Docker镜像,但可以基于一些相关镜像进行定制构建,以下是具体介绍及构建方法:

  • 基于PyTorch官方镜像构建:PyTorch官方镜像包含了PyTorch运行环境,可在此基础上安装deepspeed和其他强化学习相关库。例如可以使用pytorch/pytorch:2.2.1-cuda12.1-cudnn8-devel作为基础镜像,在Dockerfile中添加以下内容:
FROM pytorch/pytorch:2.2.1-cuda12.1-cudnn8-devel
RUN apt-get update && apt-get install -y python3.12 python3.12-dev
RUN pip3 install deepspeed -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装强化学习相关库,如stable - baselines3等
RUN pip3 install stable - baselines3 gymnasium

然后使用docker build -t your - image - name.命令构建镜像,其中your - image - name为你自定义的镜像名称。

  • 基于Python官方镜像构建:如果希望从更基础的Python镜像开始构建,可选择python:3.12-slim作为基础镜像,然后安装PyTorch和deepspeed等库。在Dockerfile中编写以下内容:
FROM python:3.12-slim
RUN apt - get update && apt - get install - y build - essential && rm -rf /var/lib/apt/lists/*
# 安装PyTorch,根据实际情况选择合适的CUDA版本
RUN pip3 install torch==2.6.0+cu121 torchvision==0.17.0+cu121 torchaudio==2.6.0+cu121 --extra - index - url https://download.pytorch.org/whl/cu121
RUN pip3 install deepspeed
RUN pip3 install stable - baselines3 gymnasium

同样使用docker build -t your - image - name.命令构建镜像。

  • 参考已有项目镜像构建:一些涉及强化学习和deepspeed的项目会提供镜像构建方法,如Sakana AI团队开源的项目。可参考其Dockerfile,在其中将Python版本指定为3.12,并根据需求调整其他依赖版本。示例如下:
FROM nvidia/cuda:12.1 - base
RUN apt-get update && apt-get install -y \
python3 python3-pip git git-lfs wget && \
apt-get clean && rm -rf /var/lib/apt/lists/*
RUN pip3 install torch==2.6.0+cu121 torchvision==0.17.0+cu121 torchaudio==2.6.0+cu121 \
--extra - index - url https://download.pytorch.org/whl/cu121
RUN pip3 install transformers==4.30.2 datasets==2.12.0 accelerate==0.21.0
RUN pip3 install deepspeed==0.9.5
# 安装强化学习相关库
RUN pip3 install stable - baselines3 gymnasium

构建命令依然是docker build -t your - image - name.

http://www.lryc.cn/news/582590.html

相关文章:

  • curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
  • 开发中如何自定义线程池
  • [1-01-01].第50节:泛型 - 泛型的使用
  • 深入了解linux系统—— System V之消息队列和信号量
  • 自动驾驶的“安全基石”:NVIDIA如何用技术守护未来出行
  • 冷链物流配送中心选址与路径优化模型研究
  • 跨越十年的C++演进:C++23新特性全解析
  • 3423. 循环数组中相邻元素的最大差值 — day97
  • 【PTA数据结构 | C语言版】在顺序表 list 的第 i 个位置上插入元素 x
  • JVM 基础 - 类字节码详解
  • Spring自动装配(xml)
  • Vue、Laravel 项目初始化命令对比 / curl 命令/ CORS 机制总结与案例
  • AlphaEvolve:谷歌的算法进化引擎 | 从数学证明到芯片设计的AI自主发现新纪元
  • UI前端大数据处理挑战与对策:大数据量下的实时数据分析技术
  • CD46.【C++ Dev】list的模拟实现(1)
  • 人体坐姿检测系统开发实战(YOLOv8+PyTorch+可视化)
  • WHIP(WebRTC HTTP Ingestion Protocol)详解
  • 装修水电改造需要注意什么?水电改造有哪些注意事项?
  • 力扣-287.寻找重复数
  • 容器技术入门与Docker环境部署
  • 【佳易王娱乐场儿童乐园会员多项目管理系统软件】从 “手工记账” 到 “智能管理”:儿童乐园会员系统的转型价值
  • Docker实用命令
  • 脚本检测 自启 关闭 重启等 tomcat 可修改成其他程序 结合crontab 每天凌晨1点执行
  • LocalStorage和SessionStorage的区别和应用
  • UI前端与数字孪生结合实践案例:智慧零售的库存管理优化系统
  • 车载HMI革命:从物理按键到智能表面的交互逻辑重构
  • 高版本的MacOS如何降级?
  • 250708-Debian系统安装Edge浏览器并配置最小中文输入法
  • KTM5910,24bit 绝对角度磁性编码器,在轴应用,- 内部集成超高性能双 16bit 2M SAR ADC
  • VMware克隆虚拟机,模板机已提前设置了固定IP,克隆机需要修改的事项