torch.distributed.elastic.multiprocessing.api: [WARNING] Sending process 141——YOLOv8双卡训练报错的解决方法

文章讨论了在训练YOLOv8模型时,双GPU部署遇到的torch.distributed异常,涉及进程管理、环境配置和重启策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ultralytics开源的YOLOv8训练模型的时候——使用如下命令,双GPU部署训练

yolo train data=D:/YOLO_V8/ultralytics-main/ultralytics-main/ultralytics/cfg/datasets/mydata.yaml model=yolov8n.pt epochs=650 imgsz=640 batch=256 workers=0 patience=200 device=0,1

抛出异常

torch.distributed.elastic.multiprocessing.api: [WARNING] Sending process 141
ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: -7) local_rank: 0 (pid: 340) of binary: /root/miniconda3/envs/llama/bin/python
torch.distributed.elastic.multiprocessing.errors.ChildFailedError
subprocess.CalledProcessError: Command '['D:\\Anaconda\\envs\\YOLO8\\python.exe', '-m', 'torch.distributed.run', '--nproc_per_node', '2', '--master_port', '58127', 'C:\\Users\\amax\\AppData\\Roaming\\Ultralytics\\DDP\\_temp_8gd8 22v32514268826352.py']' returned non-zero exit status 1.

而使用SingleGPU则不会抛出异常

 yolo train data=D:/YOLO_V8/ultralytics-main/ultralytics-main/ultralytics/cfg/datasets/mydata.yaml model=yolov8n.pt epochs=650 imgsz=640 batch=256 workers=0 patience=200 device=0

这是由于上一次双卡训练直接在pycharm的terminal里面直接Ctrl+C按下去,然后终止了训练,这样可能导致了进程没有完全杀死,没有释放该进程。需要重启电脑。

还有一种解决方法就是,去跑另外的一份python训练AI模型的程序,同样使用同一款pycharm或者vscode训练,然后关闭terminal杀死另一个不相干的训练进程。然后再次打开本训练,有概率就可以继续双卡Multi GPU Training了 

如若重启电脑也不行的话,就考虑环境的问题(需要匹配cuda与torch的版本一一对应上才可以)这个目前没有更好的解决方案,后续再发生这样的报错,找到了更好的解决方案,会再试一下

WARNING:torch.distributed.elastic.multiprocessing.api:Sending process 97 closing signal SIGTERM ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: -11) local_rank: 1 (pid: 98) of binary: /opt/conda/bin/python Traceback (most recent call last): File "/opt/conda/bin/torchrun", line 33, in <module> sys.exit(load_entry_point('torch==1.13.1+cu116', 'console_scripts', 'torchrun')()) File "/opt/conda/lib/python3.9/site-packages/torch/distributed/elastic/multiprocessing/errors/__init__.py", line 346, in wrapper return f(*args, **kwargs) File "/opt/conda/lib/python3.9/site-packages/torch/distributed/run.py", line 762, in main run(args) File "/opt/conda/lib/python3.9/site-packages/torch/distributed/run.py", line 753, in run elastic_launch( File "/opt/conda/lib/python3.9/site-packages/torch/distributed/launcher/api.py", line 132, in __call__ return launch_agent(self._config, self._entrypoint, list(args)) File "/opt/conda/lib/python3.9/site-packages/torch/distributed/launcher/api.py", line 246, in launch_agent raise ChildFailedError( torch.distributed.elastic.multiprocessing.errors.ChildFailedError: ==================================================== tools/train.py FAILED ---------------------------------------------------- Failures: <NO_OTHER_FAILURES> ---------------------------------------------------- Root Cause (first observed failure): [0]: time : 2025-03-09_20:49:13 host : yons-MS-7E06 rank : 1 (local_rank: 1) exitcode : -11 (pid: 98) error_file: <N/A> traceback : Signal 11 (SIGSEGV) received by PID 98 ====================================================这是什么问题,怎么解决
03-11
<think>嗯,用户遇到了一个PyTorch分布式训练的错误,错误信息是关于SIGTERM和SIGSEGV的。首先,我需要理解这些信号的含义。SIGTERM通常是终止进程的信号,可能由系统或其他进程发送。而SIGSEGV是段错误,意味着程序访问了未分配的内存地址,这通常由代码中的bug引起,比如空指针或内存越界。 用户提供的日志显示,在本地排名1的进程(pid 98)中发生了退出码-11,也就是SIGSEGV。可能的原因有几个方面: 1. **GPU相关的问题**:因为错误发生在分布式训练中,尤其是涉及GPU时,显存问题或者GPU驱动不兼容可能导致段错误。需要检查CUDA版本和PyTorch是否匹配,还有NVIDIA驱动是否更新。 2. **代码中的内存错误**:用户自定义的代码可能存在bug,比如在张量操作时越界访问,或者在进程处理中没有正确同步数据。需要检查数据加载、模型前向/反向传播中的内存使用。 3. **分布式训练配置错误**:比如进程间通信设置不当,端口冲突,或者`torchrun`参数不正确,如`--nproc_per_node`是否与实际GPU数量匹配。 4. **共享内存问题**:如果使用共享内存进行进程通信,可能由于资源不足或权限问题导致崩溃。检查`/dev/shm`的大小是否足够,必要时调整。 5. **硬件故障**:虽然不常见,但内存或GPU硬件问题也可能引发段错误。可以运行硬件测试工具排除这种情况。 接下来,解决方案需要逐步排查: - 首先,简化问题,尝试在单GPU环境下运行代码,看是否仍然崩溃。如果单GPU正常,可能是分布式配置的问题。 - 检查CUDA和PyTorch版本是否兼容,确保安装了对应CUDA版本的PyTorch。 - 使用`cuda-memcheck`工具来检测内存错误,帮助定位代码中的具体问题。 - 检查数据加载部分,尤其是自定义数据集或数据增强部分,是否存在进程处理的问题。 - 确保`torchrun`或`distributed.launch`的参数正确,比如`--nproc_per_node`设置正确。 - 调整共享内存大小,例如在Docker中增加`--shm-size`参数。 - 更新NVIDIA驱动和CUDA工具包到最新稳定版本。 - 如果怀疑硬件问题,运行内存测试或更换硬件测试。 另外,用户可能需要查看更详细的日志,或者使用调试工具如gdb来跟踪段错误的发生位置。如果问题无法解决,建议提供最小复现代码向PyTorch社区寻求帮助。</think>这个错误是PyTorch分布式训练中常见的进程崩溃问题,主要涉及信号`SIGTERM`和`SIGSEGV`。以下是逐步分析和解决方案: --- ### 一、错误原因解析 1. **关键信号解读**: - `SIGTERM` (Signal 15): 进程被强制终止的信号,可能是系统资源不足或外部干预(如OOM Killer)。 - `SIGSEGV` (Signal 11): 段错误(Segmentation Fault),表示程序试图访问未分配给它的内存地址,通常由以下原因引起: - 空指针解引用 - 内存越界访问(如数组越界) - CUDA显存错误(GPU内存溢出或非法访问) 2. **上下文定位**: - 错误发生在分布式训练的`local_rank: 1`(即第二个GPU进程),说明问题可能出在通信或GPU相关操作。 - 退出码`-11`直接对应`SIGSEGV`,说明是代码或环境层面的严重错误。 --- ### 二、常见解决方案 #### 步骤1:检查CUDA和GPU驱动 - **CUDA与PyTorch版本匹配**: 运行以下命令验证版本: ```bash python -c "import torch; print(torch.__version__); print(torch.version.cuda)" nvcc --version # 检查CUDA Toolkit版本 ``` - 确保PyTorch的CUDA版本与系统安装的CUDA Toolkit一致。 - 若不一致,重新安装对应版本:https://pytorch.org/get-started/previous-versions/ - **更新NVIDIA驱动**: ```bash nvidia-smi # 查看驱动版本 sudo apt-get update && sudo apt-get install nvidia-driver-535 # 以535版本为例 ``` #### 步骤2:排查内存越界问题 - **使用`cuda-memcheck`检测显存错误**: ```bash cuda-memcheck python tools/train.py # 在单模式下运行 ``` 若输出`CUDA Illegal Memory Access`,说明代码中存在显存非法访问(如张量形状不匹配)。 - **检查数据加载部分**: - 确保数据集的`__getitem__`方法没有返回`None`或无效数据。 - 进程数据加载时,关闭`num_workers`测试: ```python DataLoader(dataset, num_workers=0) # 临时禁用线程 ``` #### 步骤3:调整分布式训练配置 - **验证`torchrun`参数**: 检查是否正确设置`--nproc_per_node`(通常等于GPU数量): ```bash torchrun --nproc_per_node=2 tools/train.py # 假设使用2 ``` - **限制共享内存大小**: 在Docker中运行时,增加`--shm-size`参数: ```bash docker run --shm-size=8g ... # 至少设置8GB共享内存 ``` #### 步骤4:简化代码定位问题 - **单调试**: 暂时禁用分布式训练,单运行以缩小问题范围: ```python if __name__ == "__main__": # 原分布式代码 # torch.distributed.init_process_group(...) # 改为单测试 device = torch.device("cuda:0") model.to(device) ``` - **逐步注释代码**: 按模块注释模型、数据加载等部分,逐步定位崩溃位置。 --- ### 三、高级调试手段 1. **使用GDB捕捉堆栈**: ```bash gdb -ex run --args python tools/train.py ``` 崩溃时输入`bt`查看调用栈。 2. **检查PyTorch已知问题**: - 在GitHub Issues中搜索`SIGSEGV`+PyTorch版本号:https://github.com/pytorch/pytorch/issues --- ### 四、总结建议 1. **临时缓解方案**: - 降低`batch_size`或模型尺寸。 - 使用`torch.cuda.empty_cache()`手动释放显存。 2. **长期根治方案**: - 更新PyTorch到最新稳定版。 - 使用`torch.utils.checkpoint`减少显存占用。 若上述步骤无效,建议提供**最小可复现代码**提交到PyTorch社区。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光芒再现dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值