同CPU型号不同规格EC2实例编译的PyTorch Wheel跨实例运行触发非法指令(SIGILL)的问题排查与解决请求
同CPU型号不同规格EC2实例编译的PyTorch Wheel跨实例运行触发非法指令(SIGILL)的问题排查与解决请求
问题背景
我最近在基于PyTorch v2.6.0版本的官方CI脚本.ci/manywheel/build_common.sh从源码编译PyTorch Wheel包,本来想靠更高规格的EC2实例加速编译,结果碰到了离谱的跨实例兼容性问题:
- 先在g5.xlarge实例上编译,用pip安装后本地测试一切正常;
- 换到g5.12xlarge实例上用完全相同的脚本编译,在该实例本地跑测试也没毛病;
- 但把g5.12xlarge编译出的Wheel装回g5.xlarge实例时,执行
import torch直接触发崩溃:Illegal instruction (core dumped)。
错误现象
在g5.xlarge上安装g5.12xlarge编译的Wheel后,Python交互环境的报错如下:
Python 3.11.11 (main, Nov 13 2025, 17:12:08) [GCC 11.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import torch Illegal instruction (core dumped)
用gdb附加调试后,得到的错误栈信息:
Program received signal SIGILL, Illegal instruction. 0x00007fffe7b74d69 in ska::detailv3::sherwood_v3_table<std::pair<c10::OperatorName, c10::OperatorHandle>, c10::OperatorName, std::hash<c10::OperatorName>, ska::detailv3::KeyOrValueHasher<c10::OperatorName, std::pair<c10::OperatorName, c10::OperatorHandle>, std::hash<c10::OperatorName> >, std::equal_to<c10::OperatorName>, ska::detailv3::KeyOrValueEquality<c10::OperatorName, std::pair<c10::OperatorName, c10::OperatorHandle>, std::equal_to<c10::OperatorName> >, std::allocator<std::pair<c10::OperatorName, c10::OperatorHandle> >, std::allocator<ska::detailv3::sherwood_v3_entry<std::pair<c10::OperatorName, c10::OperatorHandle> > > >::rehash(unsigned long) () from /home/prod/.local/lib/python3.11/site-packages/torch/lib/libtorch_cpu.so
已完成的排查工作
1. 确认CPU型号一致性
我特意核对了两个实例的CPU硬件信息,确认它们是完全同型号的AMD处理器:
vendor_id : AuthenticAMD cpu family : 23 model : 49 model name : AMD EPYC 7R32 stepping : 0 microcode : 0x830107f cpu MHz : 3299.275 cache size : 512 KB
2. 定位崩溃的具体指令
通过gdb查看崩溃瞬间的机器指令,发现是vcvtusi2sdq这条指令触发了非法指令错误:
(gdb) x/i $pc => 0x7fffe7b74d69 <_ZN3ska8detail...EEE6rehashEm+25>: vcvtusi2sdq 0x18(%rdi),%xmm1,%xmm0 (gdb) disas/r $pc, $pc+1 Dump of assembler code from 0x7fffe7b74d69 to 0x7fffe7b74d6a: => 0x00007fffe7b74d69 <_ZN3ska8detailv317sherwood_v3_tableISt4pairIN3c1012OperatorNameENS3_14OperatorHandleEES4_St4hashIS4_ENS0_16KeyOrValueHasherIS4_S6_S8_EESt8equal_toIS4_ENS0_18KeyOrValueEqualityIS4_S6_SC_EESaIS6_ESaINS0_17sherwood_v3_entryIS6_EEEE6rehashEm+25>: 62 f1 f7 08 7b 47 03 vcvtusi2sdq 0x18(%rdi),%xmm1,%xmm0 End of assembler dump.
求助需求
现在我彻底懵了——明明是同型号的CPU,为什么不同规格的实例上编译出的Wheel会出现指令集不兼容的情况?有没有大佬能帮我分析下背后的原因,以及告诉我该怎么调整g5.12xlarge上的编译配置,让产出的Wheel能在g5.xlarge实例上正常运行?




