阿丹:
今天在配置跑rasa训练的时候出现问题,找了国内论坛有解决的人,但是说的不明白。查阅了很多论坛之后发现了解决的方案。
https://github.com/keras-team/keras-tuner/issues/317
问题描述以及错误:
关键错误 :cannot allocate memory in static TLS block
当你遇到“cannot allocate memory in static TLS block”这个错误时,通常意味着程序在尝试初始化线程局部存储(TLS, Thread Local Storage)时遇到了内存分配问题。TLS允许每个线程拥有自己的变量副本,这对于多线程程序是非常有用的。
如何解决:
我们可以使用export指令来优先加载这个无法分配内存的库
观察报错信息:
ImportError: /home/lianlu/.local/lib/python3.8/site-packages/sklearn/__check_build/../../scikit_learn.libs/libgomp-d22c30c5.so.1.0.0: cannot allocate memory in static TLS block
发现报错中给了出现错误的包的路径:
/home/lianlu/.local/lib/python3.8/site-packages/sklearn/__check_build/../../scikit_learn.libs/libgomp-d22c30c5.so.1.0.0
解决方案:
使用这个命令:
export LD_PRELOAD=
后面加上刚才报错信息中的库路径,执行就可以了。
export LD_PRELOAD=/home/lianlu/.local/lib/python3.8/site-packages/sklearn/__check_build/../../scikit_learn.libs/libgomp-d22c30c5.so.1.0.0
这里就可以了。
命令解决了这个问题,这是因为这个命令通过环境变量LD_PRELOAD
指定了在程序加载时优先加载libgomp.so.1
库。libgomp.so.1
是GNU OpenMP (Open Multi-Processing)库的一部分,它支持在C、C++等语言中编写并行代码,利用多核处理器的优势。
具体到你的问题,可能的原因有:
-
TLS段过大:某些情况下,编译器生成的TLS段超过了操作系统为单个进程分配给TLS的默认大小。预加载
libgomp
可能调整了TLS的使用方式或分配策略,从而避免了这个问题。 -
动态链接问题:可能是由于程序在链接OpenMP库或其他相关库时出现了问题,直接指定
LD_PRELOAD
确保了正确的库被使用,特别是那些关于并发和线程管理的部分。 -
资源限制或冲突:在某些环境中,可能存在与TLS相关的资源限制或与其他库的冲突,预加载特定版本的
libgomp
可能绕过了这些限制或解决了冲突。
总之,通过LD_PRELOAD
指令强制程序在启动时加载特定版本的OpenMP库,可能帮助解决了内存分配、链接或库兼容性方面的问题,从而消除了“cannot allocate memory in static TLS block”的错误。不过,这只是临时解决方法,长期来看,理解并根本解决导致TLS分配失败的根本原因更为重要,比如调整程序设计减少TLS的使用量,或者检查编译器和链接器设置等。