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

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

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

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

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

    2024年02月11日
    浏览(44)
  • 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日
    浏览(45)
  • Jmeter前置处理器和后置处理器

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

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

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

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

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

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

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

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

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

    2024年02月08日
    浏览(50)
  • ARM处理器概述

    RISC处理器和CISC处理器 首先了解一下两种处理器名字: RISC(Reduced Instruction Set Computer): 精简指令集 处理器 与之相对应的是: CISC(Complex Instruction Set Computer): 复杂指令集 处理器 顾名思义,RISC比CISC更加简单,那么对于处理器来说什么能称为简单呢?可以联想为生活中可

    2024年02月13日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包