Tensorflow(libtensorflow)报指令集与处理器不兼容

这篇具有很好参考价值的文章主要介绍了Tensorflow(libtensorflow)报指令集与处理器不兼容。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近连续在多个项目上接收到Tensorflow与环境不兼容问题的报告。

主要现象

  1. 在一个新部署或者升级的环境上,服务尝试启动;

  1. 正常执行过程中,服务加载模型,标准错误中输出一行错误信息后服务停止。

错误信息:

tensorflow/core/platform/cpu_feature_guard.cc:36] The TensorFlow library was compiled to use SSE4.1 instructions, but these aren't available on your machine

目前至少有三个出现错误的机器,CPU分别为:

  • Intel Xeon E5 4640

  • AMD Opteron 6376

  • Intel Xeon Gold 6130

可是,根据Intel和AMD的硬件信息,以上CPU都已经支持 SSE4.1,但TensorFlow都提示不支持,因此不是硬件不符合要求造成的。那问题出在哪里呢?

问题排查

首先,肯定是确认Tensorflow的检测本身是否有问题。

首先根据代码提示查看了Tensorflow源代码。检查CPU指令集支持的代码位于tensorflow / core / platform /cpu_info.cc 中Initialize()方法。

    // To getgeneral information and extended features we send eax = 1 and
    // ecx = 0 tocpuid. The response is returned in eax,ebx, ecx and edx.
    // (See Intel 64and IA-32 Architectures Software Developer's Manual
    // Volume 2A:Instruction Set Reference, A-M CPUID).
    GETCPUID(eax, ebx, ecx, edx, 1, 0);
  
    cpuid->model_num_ = static_cast<int>((eax >> 4) & 0xf);
    cpuid->family_ = static_cast<int>((eax >> 8) & 0xf);

…….

    cpuid->have_sse2_ = (edx >> 26) & 0x1;
    cpuid->have_sse3_ = ecx & 0x1;
    cpuid->have_sse4_1_ = (ecx >> 19) & 0x1;
    cpuid->have_sse4_2_ = (ecx >> 20) & 0x1;
    cpuid->have_sse_ = (edx >> 25) & 0x1;
    cpuid->have_ssse3_ = (ecx >> 9) & 0x1;
    cpuid->have_hypervisor_ = (ecx >> 31) & 1;

其中,GETCPUID(a, b, c,d, eax, ecx)是用gcc汇编实现的:

#define GETCPUID(a, b, c, d, a_inp, c_inp) \
  asm("mov %%rbx, %%rdi\n"                 \
      "cpuid\n"                            \
      "xchg %%rdi, %%rbx\n"                \
      : "=a"(a), "=D"(b), "=c"(c), "=d"(d) \
      : "a"(a_inp), "2"(c_inp))
#endif

从Tensorflow的代码上看是使用CPUID指令获取CPU信息的,如果是在真实设备上执行的话,这样没有问题。

然后,我检查了cpuinfo。

根据检查,这些环境cpuinfo的flags都没有SSE4.1,因此有必要研究cpuinfo的信息生成方式。

Stack Overflow上面的这个问题介绍了Linux内核获取CPU信息的方法。Linux内核也使用CPUID指令获取CPU信息,

通过查看Linux x86源码,在arch/x86/kernel/cpu/proc.c 中,flags 是按如下方式生成的。

    seq_printf(m,"flags\t\t:");
    for (i = 0; i < 32*NCAPINTS;i++)
       if (cpu_has(c, i) && x86_cap_flags[i] !=NULL)
           seq_printf(m, " %s", x86_cap_flags[i]);

以上代码表明,Linux内核也使用CPUID指令获取CPU信息,但是对自己不理解的CPUID信息不会显示在 flags中,即CPUID不显示不表示该指令集不可用,可能只是内核没有支持

问题排查的前景突然暗淡了下来。

这时候,我又再次检查了cpuinfo。突然有个发现,目前所有出现问题的机器均运行于虚拟机上(cpuinfo flags上 有 hypervisor 标识),根据上述排查可以推断,虚拟机虚拟的CPU存在问题

在查找资料,我看到了以下两条信息:

首先是linux下面最广泛使用的qemu-kvm,大名鼎鼎的OpenStack底层也是它。在Linux-KVM 以及实现层qemu-kvm中,CPU模型(models)定义了哪些主机的CPU功能(features)会被暴露给客户机操作系统。为了在具有不同 CPU 功能的主机之间做安全的迁移,qemu-kvm往往不会将主机CPU的所有功能都暴露给客户机。可以使用-cpu (model),(feature) 指定模拟的CPU特性,也可以直接使用 -cpu host,这样的话会客户机使用和主机相同的 CPU model。

详细的配置可以参考:https://qemu.weilnetz.de/doc/4.2/qemu-doc.html#cpu_005fmodels

其次是VMWare家。在VMWare vCenter中,EVC允许在不同代的CPU之间迁移虚拟机,位于EVC集群中的CPU功能是受到限制的,其中Intel “Merom” Generation (Intel Xeon Core 2) / AMD Opteron Generation 3(以及更早版本)不支持SSE4.1。

详细的信息可以参考:https://kb.vmware.com/s/article/1005764

于是我尝试联系了其中一个客户。

客户生产环境使用H3C CAS虚拟化平台。H3C CAS平台创建虚拟机时可以选择CPU模拟方式,其中Custom模式不支持AES指令集,理论上也不支持邻近的SSE4.1指令集。但是通过修改配置,将CPU改为pass-through可以支持。

于是我们让客户停机,做了修改。问题解决。

结论

最后,我们在部署环境要求上增加了如下的CPU要求:

如果该服务器运行于虚拟机上,则要求QEMU体系的虚拟机下(如OpenStack、H3C CAS及其他基于KMV的定制化云平台等环境),必须确认虚拟机CPU工作模式配置为“定制化模式”或“穿透模式”。

同时我们也编译了仅支持sse3的libtensorflow。文章来源地址https://www.toymoban.com/news/detail-763529.html

到了这里,关于Tensorflow(libtensorflow)报指令集与处理器不兼容的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • RISC-V处理器的设计与实现(一)—— 基本指令集

    RISC-V处理器的设计与实现(一)—— 基本指令集

    RISC-V处理器的设计与实现(一)—— 基本指令集_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现(二)—— CPU框架设计_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现(三)—— 上板验证_Patarw_Li的博客-CSDN博客 RISC-V处理器设计(四)—— Verilog 代码设计-CSDN博客  RISC-V处

    2024年02月05日
    浏览(11)
  • 『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT]

    『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT]

    『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT] 辅助文档-本教程配套代码,以及更多范例和文档 :https://github.com/NVIDIA/trt-samples-for-hackathon-cn/tree/master/cookbook Polygraphy:深度学习推理原型设计和调试工具包 介绍个工具Torch.Profiler,使用它来确定你的性能瓶颈

    2024年02月11日
    浏览(32)
  • 【架构】探索计算机处理器的世界:ARM和x86架构解析及指令集

    计算机处理器是数字化时代的核心引擎,而在众多处理器架构中,ARM和x86是备受关注的三个。本文将带您深入探索这三个架构,介绍它们的特点、公司背景以及应用领域。让我们一起揭开计算机处理器的神秘面纱吧! ARM(Advanced RISC Machines)是一种计算机指令集架构(ISA),

    2024年02月11日
    浏览(11)
  • Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    目录 一、单个控制器异常处理 1.1 控制器方法 1.2 编写出错页面 1.3 测试结果 二、全局异常处理 2.1 一个有异常的控制器类 2.2 全局异常处理器类 2.3 测试结果  三、自定义异常处理器 3.1 自定义异常处理器 3.2 测试结果 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列

    2024年02月16日
    浏览(13)
  • Jmeter前置处理器和后置处理器

    Jmeter前置处理器和后置处理器

    1. 后置处理器(Post Processor) 本质上是⼀种对sampler发出请求后接受到的响应数据进⾏处理 (后处理)的⽅法  正则表达式后置处理器 (1)引⽤名称:下⼀个请求要引⽤的参数名称,如填写title,则可⽤${title}引⽤它 (2)正则表达式: ():括起来的部分就是要提取的。 .:匹配

    2023年04月21日
    浏览(10)
  • DP读书:鲲鹏处理器 架构与编程(八)3.1鲲鹏处理器片上系统与Taishan处理器内核架构

    DP读书:鲲鹏处理器 架构与编程(八)3.1鲲鹏处理器片上系统与Taishan处理器内核架构

    处理器体系结构,是一个偏底层的内容,但这是任一计算机系统的底层。 系统的性能、生态和功能很大程度上都依赖于计算机系统底层——处理器体系结构。任何一个系统程序员、固件设计者、应用程序员 甚至 服务器管理员,如果想要充分利用现代高性能处理器的硬件性能

    2024年02月12日
    浏览(13)
  • SkyEye处理器仿真系列:龙芯2K1000处理器

    SkyEye处理器仿真系列:龙芯2K1000处理器

    天目全数字实时仿真软件SkyEye作为基于可视化建模的硬件行为级仿真平台,能够为嵌入式软件提供虚拟化运行环境,开发、测试人员可在该虚拟运行环境上进行软件开发、软件测试和软件验证活动。小到芯片,大到系统,SkyEye均可进行模拟。 1936年,被誉为“计算机科学与人

    2024年02月12日
    浏览(10)
  • DP读书:鲲鹏处理器 架构与编程(九)鲲鹏920处理器片上系统

    停更了两天,我做了一个本专业相关的孤岛问题的论文复现,可并没有什么太大进展,就像当初最开始跑Aspen一样,我要面对的是一个相当复杂的多参系统,这种情况下只能啃着技术文档一步一步的去调。 再次返回我的鲲鹏920处理器,无疑是舒服的所以我只能尽我所能的在做

    2024年02月12日
    浏览(20)
  • 第三十二章 开发Productions - ObjectScript Productions - 定义警报处理器 - 使用路由警报处理器

    如果需要通过多种输出机制联系用户,警报处理器应该是一个业务流程,用于确定如何在消息中路由 Ens.AlertReques 。在这种情况下, Productions 必须为每个输出机制包含一个额外的业务操作,并且警报处理器将消息转发到这些业务操作。 要将警报处理器定义为路由流程,请创建

    2024年02月08日
    浏览(11)
  • 【并行计算】多核处理器

    【并行计算】多核处理器

    这张图连接了几个并行计算的思想。 从上往下。 1.两个fetch/decode部件,是 superscalar 技术,每个cycle可以发射多个指令。 2.多个执行单元,支持乱序执行,是ILP, 指令级并行 。 3.每个执行单元里还支持 SIMD 操作。 4.有多个execution context,就相当于是有多套线程的状态,类似寄

    2024年02月05日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包