Docker中用Gunicorn运行KMeans遇Worker异常及OpenBLAS警告求助
解决Docker+Gunicorn运行KMeans时的OpenBLAS警告与Worker崩溃问题
场景说明
在Docker容器中使用Gunicorn运行KMeans聚类任务,Gunicorn用于实现主文件其他功能与KMeans的并行运行。运行过程中出现OpenBLAS警告,随后Gunicorn Worker进程崩溃(退出码139)。
硬件规格
Architecture: X86_64 CPU: Intel Xeon Gold
运行日志
2023-07-27 04:36:32,772 INFO 聚类已正常启动! 2023-07-27 04:36:32,772 INFO 我们处理的数据预览: 2023-07-27 04:36:32,782 INFO pressure distance cloudcover humidity windspeedKmph percpmm tempC 0 900.00 22.429714 40.5 30.93 3.57 19.24 33.50 1 866.67 24.261809 0.0 16.98 3.57 12.41 32.62 2 983.33 22.970385 0.0 23.26 2.71 4.30 33.06 3 916.67 23.144274 4.5 35.12 3.57 13.67 36.12 4 883.33 21.591553 0.0 27.44 3.57 34.58 31.31 OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata. OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata. OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata. OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata. OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata. [2023-07-27 04:36:34 +0000] [1] [ERROR] Worker (pid:8) was sent code 139! [2023-07-27 04:36:34 +0000] [2551] [INFO] Booting worker with pid: 2551 [2023-07-27 04:36:37 +0000] [2551] [INFO] Started server process [2551] [2023-07-27 04:36:37 +0000] [2551] [INFO] Waiting for application startup. [2023-07-27 04:36:37 +0000] [2551] [INFO] Application startup complete.
已尝试无效方案
- 从conda-forge安装numpy和scipy(无Dockerfile修改权限,无法操作)
- 设置环境变量
OPENBLAS_NUM_THREADS=1 - 使用MiniBatchKMeans替代KMeans
可行解决方案
1. 调整OpenBLAS线程数到预编译支持范围
预编译的OpenBLAS通常对超过64核的CPU存在兼容问题,尝试设置线程数为32或更低(而非1),可通过以下方式设置:
- 启动容器时传递环境变量:
docker run -e OPENBLAS_NUM_THREADS=32 ... - 在Gunicorn启动脚本中添加:
export OPENBLAS_NUM_THREADS=32 gunicorn ...
2. 限制Gunicorn Worker进程数
多Worker进程同时调用OpenBLAS会加剧线程冲突,启动Gunicorn时限制Worker数量:
gunicorn --workers=2 ...
Worker数建议设置为CPU核心数的1/4或更低,避免资源竞争。
3. 显式设置KMeans的n_jobs参数
在代码中设置KMeans的n_jobs为小于等于64的值,同时与OpenBLAS线程数匹配:
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=5, n_jobs=32)
4. 禁用OpenMP线程
scikit-learn部分算法会使用OpenMP,与OpenBLAS线程冲突,添加环境变量:
export OMP_NUM_THREADS=1
5. 排查线程实际使用情况
设置OPENBLAS_VERBOSE=2环境变量,查看OpenBLAS实际线程分配情况,进一步调整参数:
export OPENBLAS_VERBOSE=2
内容的提问来源于stack exchange,提问作者ARIJIT SINGH
相关产品推荐
相关产品推荐

