Numpy在云虚拟机上crash问题

96
biggeng
2017.11.06 15:26* 字数 338

在python中使用Pandas和Numpy库创建一个Pandas DataFrame是一个常见的操作,但就是这一个常见的操作也会在特定的场景下遇到问题。

笔者在使用Pandas DataFrame时,遇到了core dump的问题。去掉不相关的代码后,基本断定是如下代码引起core dump。

import numpy as np
np.random.seed(7)
import pandas as pd
df = pd.DataFrame(np.random.randn(1, 32))

经过验证后,发现只有在column大于31时,会crash。

经过搜索资料,发现原来是Numpy在某些虚拟机环境下的bug。具体原因在Numpy的git issue中描述。https://github.com/numpy/numpy/issues/9532

本文作一简单归纳:

root cause
  1. 宿主机CPU并不支持AVX或者AVX2标签,但是在创建虚拟机时,给系统打上了AVX/AVX2的tag。
  2. 当Pandas创建的DataFrame列大于31时,会走到AVX/AVX2的路径,因为虚拟机有AVX/AVX2的标签,但是执行到AVX/AVX2的逻辑时,因为宿主机并不支持,所以core dump Illegal instruction。
  3. core栈如下:
Program received signal SIGILL, Illegal instruction.
0xb61338a8 in LONG_greater_avx2 (args=args@entry=0xbfffe52c,
    dimensions=dimensions@entry=0xbfffe538, steps=steps@entry=0xbfffe544,
    __NPY_UNUSED_TAGGEDfunc=__NPY_UNUSED_TAGGEDfunc@entry=0x0)
    at numpy/core/src/umath/loops.c.src:936
936    numpy/core/src/umath/loops.c.src: No such file or directory.
(gdb) bt
#0  0xb61338a8 in LONG_greater_avx2 (args=args@entry=0xbfffe52c,
    dimensions=dimensions@entry=0xbfffe538, steps=steps@entry=0xbfffe544,
    __NPY_UNUSED_TAGGEDfunc=__NPY_UNUSED_TAGGEDfunc@entry=0x0)
    at numpy/core/src/umath/loops.c.src:936
解决方法
  1. 删除系统已有的numpy库
pip uninstall numpy
  1. 下载numpy源代码
git clone https://github.com/numpy/numpy.git numpy
  1. 修改Numpy库文件 numpy/core/include/numpy/npy_common.h, 将AVX/AVX2 设为0.
    code diff
  2. 编译并安装numpy

python setup.py build
python setup.py install

安装后在新的shell下重新执行python脚本,问题解决。

Web note ad 1