1.报错场景

在利用多GPU训练yolov5,yolov8,yolov11时均遇到如下错误,而利用单卡时不会报错

Error: mkl-service + Intel(R) MKL: MKL_THREADING_LAYER=INTEL is incompatible with libgomp-a34b3233.so.1 library.
        Try to import numpy first or set the threading layer accordingly. Set MKL_SERVICE_FORCE_INTEL to force it.

完整报错提示如下:

Transferred 643/649 items from pretrained weights
DDP: debug command /home/ssk/anaconda3/envs/train/bin/python -m torch.distributed.run --nproc_per_node 2 --master_port 35383 /home/ssk/.config/Ultralytics/DDP/_temp_4z6zn3tf139922484374176.py
Error: mkl-service + Intel(R) MKL: MKL_THREADING_LAYER=INTEL is incompatible with libgomp-a34b3233.so.1 library.
        Try to import numpy first or set the threading layer accordingly. Set MKL_SERVICE_FORCE_INTEL to force it.
Traceback (most recent call last):
  File "/home/ssk/anaconda3/envs/train/bin/yolo", line 8, in <module>
    sys.exit(entrypoint())
  File "/home/ssk/anaconda3/envs/train/lib/python3.10/site-packages/ultralytics/cfg/__init__.py", line 969, in entrypoint
    getattr(model, mode)(**overrides)  # default args from model
  File "/home/ssk/anaconda3/envs/train/lib/python3.10/site-packages/ultralytics/engine/model.py", line 802, in train
    self.trainer.train()
  File "/home/ssk/anaconda3/envs/train/lib/python3.10/site-packages/ultralytics/engine/trainer.py", line 202, in train
    raise e
  File "/home/ssk/anaconda3/envs/train/lib/python3.10/site-packages/ultralytics/engine/trainer.py", line 200, in train
    subprocess.run(cmd, check=True)
  File "/home/ssk/anaconda3/envs/train/lib/python3.10/subprocess.py", line 526, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/home/ssk/anaconda3/envs/train/bin/python', '-m', 'torch.distributed.run', '--nproc_per_node', '2', '--master_port', '35383', '/home/ssk/.config/Ultralytics/DDP/_temp_4z6zn3tf139922484374176.py']' returned non-zero exit status 1.

2.报错原因

这是在使用pytorch做分布式训练时经常会遇到的错误,这个错误是由于在你的系统中,Intel Math Kernel Library (MKL) 的线程层被设置为了 Intel,但是与此同时,系统正在使用的 OpenMP 库版本(libgomp)与 Intel MKL 不兼容。

libgomp 是 GCC 自带的 OpenMP 实现库,当你尝试运行一个同时依赖于 MKL 和 OpenMP 的程序,并且 MKL 的线程层被设置为 Intel 时,MKL 尝试使用自己的线程调度器,而这可能与系统已加载的 libgomp 版本冲突。

3.解决方案

解决这个问题的方法有以下几种:

  1. 更改 MKL 线程层设置:根据错误提示,你可以通过设置 MKL_THREADING_LAYER=GNU来使 MKL 使用与 libgomp 兼容的线程库。

    export MKL_THREADING_LAYER=GNU
    
  2. 确保正确导入 numpy:如果你是在 Python 中使用 numpy 与 MKL,确保 numpy 在导入时能正确设置线程层。可以尝试先不设置 MKL_THREADING_LAYER 环境变量,让 numpy 根据默认规则自动配置。

  3. 强制使用 Intel 线程层:如果确实需要使用 Intel 线程层,你可以尝试设置另一个环境变量 MKL_SERVICE_FORCE_INTEL 来强制 MKL 使用 Intel 线程库,但这样可能会导致上述的兼容性问题。

4.方案说明

export MKL_THREADING_LAYER=GNU 是一个环境变量设置的命令,主要用于指定 Intel Math Kernel Library (MKL) 的线程层选择为 GNU 层。

Intel MKL 是一个高性能的数学和科学计算库,其中涉及到多线程处理时,可以使用不同的线程管理系统,如 INTEL、GNU、OPENMP 等。MKL_THREADING_LAYER 环境变量就是用来设定这个线程管理策略的。

将 MKL_THREADING_LAYER 设置为 GNU 意味着,在运行使用 MKL 的程序时,其内部并行计算部分将会使用 GNU 编译器套件(GCC)自带的线程库来管理线程。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐