Quantcast
Channel: 英特尔开发人员专区文章
Viewing all 583 articles
Browse latest View live

英特尔® 深度学习 SDK 教程:安装指南

$
0
0

下载 PDF [792 KB]

训练工具安装指南

目录

1.简介

2.前提条件

3.在 Microsoft Windows* 或 Apple macOS* 设备上安装英特尔® 深度学习 SDK 训练工具

4.在 Linux* 设备上安装英特尔® 深度学习 SDK 训练工具

1.简介

英特尔® 深度学习 SDK 训练工具可以在 Linux* Ubuntu 14.04 或更高版本以及 Cent OS 7 操作系统上安装和运行。

该训练工具是一款 web 应用,支持本地和远程安装选项。您可以在 Microsoft Windows* 或 Apple macOS* 设备上,分别使用 .exe 和 .app 安装文件将其远程安装在 Linux 服务器上。也可以运行安装脚本,将其本地安装于 Linux 设备上。

由于安装包包含一个 Docker* 容器,该容器提供所有必要组件,如英特尔® Caffe* 框架分发包,为运行训练工具提供了前提条件和环境,因此您无需手动安装其它软件。

2.前提条件

在安装英特尔® 深度学习 SDK 训练工具前,请确保您满足以下系统要求。

  • 一台 Linux Ubuntu* 14.04(或更高版本)或 Cent OS* 7 设备,并能够通过 SSH 连接对其进行访问。
  • 能够在 Linux 设备上运行安装脚本的根权限。
  • 电脑上安装了 Google Chrome* 浏览器 50 或更高版本,稍后会使用该电脑访问训练工具 web 用户界面。

可以在线阅读版本说明文档,或从安装包中获取系统要求。

3.在 Microsoft Windows* 或 Apple macOS* 设备上安装英特尔® 深度学习 SDK 训练工具

如欲在 Microsoft Windows* 或 Apple macOS* 设备上安装英特尔® 深度学习 SDK 训练工具,请访问 https://software.intel.com/deep-learning-sdk下载安装包,解压并启动 TrainingToolInstaller 可执行文件,以打开向导。

macOS 和 Windows 安装向导外观相似,安装步骤完全相同。

向导提供安装步骤,您只需单击 Next按钮,按照向导的步骤完成安装流程即可。安装过程包含以下步骤:

定义全部设置后,按下 Test connection按钮,检查服务器连接。如果可以访问服务器,测试结果将显示 Connection successful状态:

  1. 欢迎许可协议。仔细阅读并接受许可协议的内容,以继续安装。
  2. 定义设置。该面板配置安装参数,包括网络和安全设置。指定所有必需的字段值,并修改默认字段值(如需要):
    • 训练工具密码– 用于访问训练工具 web 界面的密码
    • 服务器名称或 IP– 用于安装训练工具的 Linux 设备地址
    • 用户名(具备 root 访问)– Linux 服务器中具备根权限的用户名
    • 用户密码–上述用户账户的密码。在安装过程中,需要通过这些证书进行用户身份验证。
    • 用于用户身份验证的私人密钥文件– 如果 Linux 服务器不允许以密码形式验证身份,需要利用私人密钥进行用户身份验证
    • 面向 http 的代理服务器– 如果 Windows/Mac 设备通过代理与 Linux 服务器相连,为 HTTP 设置代理服务器 IP。
    • 面向 https 的代理服务器– 如果 Windows/Mac 设备通过代理与 Linux 相连,为 HTTPS 设置代理服务器 IP。
    • 安装文件系统路径– 在 Docker 容器内作为卷安装的 Linux 文件系统路径。
    • Web 应用端口 - 用于访问训练工具 web 界面的网络端口。

    定义全部设置后,您可以按下 Test connection 按钮,检查服务器连接。如果可以访问服务器,测试结果将显示为 Connection successful 状态:

  3. 安装。单击 Install按钮,开始安装。出现 Installing面板,面板中的进程条描述当前步骤的状态和总体完成情况,显示安装的进度。

    当指示数字变为 100% 时,单击已激活的 Next按钮,完成安装。

  4. 完成安装。恭喜!您已在 Linux 服务器上安装了英特尔® 深度学习 SDK 训练工具。

    单击 Open now按钮,在浏览器中打开训练工具 web 界面,或单击 Download链接,下载最新版 Google* Chrome 浏览器,也可以单击 Close按钮关闭该窗口。

4.在 Linux* 设备上安装英特尔® 深度学习 SDK 训练工具

您可以利用安装脚本在 Linux* 操作系统中安装英特尔® 深度学习 SDK 训练工具。请访问 https://software.intel.com/deep-learning-sdk下载该脚本,并通过以下可用选项运行:

1. volume <路径>

在 Docker* 容器内作为卷安装的 Linux 文件系统路径。

2. toolpassword <密码>

用于访问训练工具 web 界面的管理员密码

3. toolport <端口>

用于访问训练工具 web 界面的网络端口

4. httpproxy <代理>

面向 HTTP 的代理服务器

5. httpsproxy <代理>

面向 HTTPS 的代理服务器

6.帮助

打印帮助信息

注:该参数具有强制性,必须对其进行设置,才能继续安装;其它参数均为辅助参数,可以忽略。


英特尔® Edison 开发人员挑战赛冠军

$
0
0

今年初夏,英特尔携手 Hardware Academy在英国推出了英特尔® Edison 开发人员挑战赛一场在线竞赛)。这次挑战赛汇聚了来自世界各地的参赛选手,这些开发人员雄心勃勃,希望创建下一代创新型英特尔® Edison 物联网解决方案。他们的参赛项目将英特尔® Edison 开发板和传感器、云技术等其它创新技术结合在一起,创建了可行的全新物联网原型。在线申请于 9 月底关闭,2016 年 12 月 6 日 公布了获奖项目。

Developer Challenge

来自英国的开发人员 Numaan Chaudhry 凭借物联网原型获奖,该原型是一个强大的远程太阳能监控解决方案。

Numaan 的获奖项目结合了英特尔® Edison 开发板、传感器、IBM Bluemix* 云平台以及开发人员专业知识,创建了太阳能监控解决方案,旨在追踪部署于世界最偏远地区的太阳能系统的健康和使用状况。

太阳能是一种无需通过电网将电力输送到农村社区的经济方法。然而,农村地区太阳能部署站点的维护和修复带来了巨大的挑战。通常情况下,太阳能站点和中央站点(例如,负责维护和服务这些站点的组织总部)之间缺少可靠的通信(一种传输和接收数据的可靠方式)。

拥有了这个强大的解决方案后,可以将数据从太阳能部署站点传输到中央站点,发生故障时,总部能迅速收到通知,并能准确诊断故障根源(在本原型中,传感器数据被发送到一个云平台,进行转换、分析和模式识别)。

如欲了解更多信息以及创建该项目的完整步骤,请点击此处查看强大的远程太阳能监控 Instructables* 页面。

物联网参考实施:如何创建盒内交通解决方案

$
0
0

盒内交通解决方案基于前代物联网产品路径互联交通解决方案,后者包含完整的开发流程 - 从构思与原型制作到产品化。2016 年英特尔®信息技术峰会上发布的前代产品为盒内交通解决方案奠定了基础,后者展示了如何以产品路径解决方案为出发点,简化物联网解决方案的开发流程。如欲阅读物联网产品路径交通案例研究的全文,请查阅如何创建互联交通解决方案

一支欧洲的英特尔团队在现有的产品路径互联交通解决方案(更适合用于研讨会、会议等其他行业活动)的基础上进行改变时,发现了其价值,便开始研究盒内交通解决方案。该团队的目标是创建一个和扩展货车模型功能相似的模型,该货车模型用于之前的解决方案,但是能装进紧凑型保护套。图 1 并列展示了这两个解决方案。

Transportation in a Box
图 1.互联交通模型和盒内交通解决方案对比

本文中的练习展示了如何重建盒内交通解决方案。该解决方案不需要特殊设备或深入的专业知识,主要为了展示如何调整物联网产品路径解决方案,以满足特定项目小组的需求。

如欲获取此项目的最新代码示例和文档,请访问 GitHub*。

简介

借助一台英特尔® 物联网网关、Grove* 商用物联网开发人员套件和英特尔® System Studio IoT Edition,便可以开发盒内交通解决方案。它可以监控卡车冷藏货物区域的温度,也能够监控货厢门的开关状态。网关基于状态变化生成事件,以支持在平板电脑应用上实现终端用户功能。

开发人员将通过本练习掌握以下操作:

  • 设置 Dell iSeries* Wyse 3290 物联网网关,包括安装操作系统、更新 MRAA* 和 UPM* 库以及连接用于连接传感器的 Arduino 101*(美国境外的品牌名称为 Genuino 101*)开发板。
  • 安装解决方案的其他部分,包括连接传感器等其它组件和复制项目软件存储库。
  • 将程序添加至英特尔® System Studio IoT Edition,包括创建一个项目,利用创建解决方案所需的文件安装项目。
  • 利用 Eclipse* IDE 运行解决方案或直接在目标平台上运行

该解决方案的用途

盒内交通解决方案模拟交通监控解决方案的以下部分:

 

  • 车门:通知司机车门的位置变化(打开或关闭)。
  • 温度计: 监控卡车货厢区域的内部温度,并记录温度数据。
  • 警报:用户界面会在温度超出设定的阈值时发出声音警报。按下 push 按钮或温度恢复正常(温度在设定的阙值以下)后,警报取消。
  • 冷却风扇:风扇为卡车货物散热。冷却风扇连接至车门,当门打开时,风扇关闭(允许温度上升)。同样地,当门关闭时,风扇开启(为了保持货厢区域的温度低于特定的温度阙值)。
  • 显示: 显示系统状态、温度和车门状态。

工作原理

解决方案基于传感器数据运行,包括车门开/关状态、卡车内部温度和一系列事件,如车门的开关、温度变化、温度阙值设置的变化以及警报的触发/停止事件。将全部数据发送到 web 接口,用于监控卡车状态。

设置 Dell iSeries* Wyse 3290 物联网网关

这个部分提供了在 Dell iSeries Wyse 3290 网关上安装英特尔® 物联网网关软件套件的指令。

注:如果您在英特尔网络上,需要设置一台代理服务器。

  1. 如果没有帐户,需要在英特尔® 物联网平台市场创建一个。
  2. 定购英特尔® 物联网网关软件套件,然后按照电子邮件接收的说明下载图像文件。
  3. 解压该存档文件,然后将该.img 文件写入一个 4 GB U 盘:
  4. 将 U 盘拔出您的系统,然后插入 Dell iSeries* Wyse 3290 网关,该网关连接一台显示器、一个键盘和电源线。
  5. 打开 Dell iSeries Wyse 3290 网关,在启动时按 F2键进入 BIOS。
  6. 通过 U 盘启动:
    1. Advanced选项卡上,确保已经开启通过 U 盘启动
    2. Boot选项卡上,将 U 盘设置为首个启动设备。
    3. 保存更改并重启系统。
  7. 通过 root:root登录系统。
  8. 在本地存储中安装 Wind River Linux*:

    ~# deploytool -d /dev/mmcblk0 --lvm 0 --reset-media -F

  9. 利用 poweroff命令关闭网关,拔出 U 盘,然后通过本地存储设备重新开启网关。
  10. 插入以太网线缆,然后通过 ifconfig eth0 命令来寻找分配给网关的 IP 地址(假设您已完成相应的网络设置)。
  11. 使用英特尔® 物联网网关开发中心将 MRAA*UPM*存储库更新至官方库的最新版(https://01.org)。输入以下命令,也可达到相同的效果:

    ~# smart update

    ~# smart upgrade

    ~# smart install upm

  12. 通过 USB 线缆连接 Arduino 101* 开发板。
  13. 将 Omega* RH-USB 温度传感器连接至 USB 端口。

安装解决方案的其它部分 

本部分为您提供安装解决方案所需的其它指令,包括连接传感器等其它组件和复制项目软件存储库。

  1. 根据表 1 物料清单所提供的连接方案将传感器等其它组件连接至 Dell iSeries Wyse 3290 物联网网关。

    表 1.用于盒内交通解决方案的物料清单和连接方案。

    底部系统

    组件详细信息连接
    Dell iSeries* Wyse 3290 网关  
    Arduino 101* 开发板传感器中枢USB
    USB Type A 转 Type B 线缆将 Arduino 101* 开发板连接至网关 

    传感器

    组件详细信息连接
    Omega* RH-USB温度传感器USB
    Grove* - Relay风扇控制D8
    Grove - LCD RGB 背光显示状态I2C
    磁性接触开关车门传感器D3
    Peltier 热电冷却器模块+散热器组件 - 12V 5A冷却风扇 
    带有白色 LED 环的耐久金属开/关 - 16 毫米白色开关确认警报D4

     

  2. 利用如下命令,借助 Git* 将产品路径存储库复制到电脑:

    $ git clone https://github.com/intel-iot-devkit/reference-implementations.git

  3. 如欲下载.zip 文件,打开您的网络浏览器,前往并点击右下部分的 Download ZIP按钮。.zip 文件下载完毕后,对其进行解压,本示例需使用目录中的文件。

将程序添加至英特尔® System Studio IoT Edition

注:本部分的截屏来自于闹钟示例,但是,添加程序的技术是相同的,只是利用不同的源文件和 jar。

  1. 打开英特尔® System Studio IoT Edition。首先需要选择一个工作空间目录,然后单击 OK
  2. 如图 2 所示,在英特尔® System Studio IoT Edition 中选择 File | New | Intel® IoT Java Project

    New Java Project
    图 2.新英特尔® 物联网 Java* 项目。

  3. 如图 3 所示,将项目命名为 “Transportation Demo”,然后单击 Next

    Naming Project
    图 3.命名英特尔® 物联网项目。

  4. 如图 4 所示,通过为连接选择一个名称、在 Target Name字段中输入 IP 地址,从电脑连接至网关,并向其发送代码。

    注:您也可以通过 "Search Target"按钮搜索网关。完成后单击 finish。

    Target Connection
    图 4.创建目标连接。

  5. 按照之前的步骤将创建一个空白项目。将源文件和 config 文件复制到项目:

    • 将全部文件从 git 存储库的 src 文件夹中拖放至英特尔® System Studio IoT Edition 新建项目的 src 文件夹。
    • 确保覆盖之前自动生成的主类。
  6. 该项目使用以下外部 jar:commons-cli-1.3.1.jartomcat-embed-core.jartomcat-embed-logging-juli。可以从 Maven 中央存储库中找到上述 jar。在项目根目录中创建一个 "jars"文件夹,将全部所需的 jar 复制到该文件夹。如图 5 所示,在英特尔® System Studio IoT Edition 中选择并右键单击 jars文件夹中的全部 jar 文件,选择 Build path | Add to build path

    Adding Jars
    图 5.将项目 jar 添加至 build path。

  7. 如图 6 所示,添加与本示例相关的 UPM* jar 文件:

    1. 右键单击项目的根目录,选择 Build path | Configure build path。
    2. 选择 Java Build Path。
    3. 选择 Libraries 选项卡。
    4. 单击 Add external JARs...按钮。
    5. 添加下列 jar,位于物联网开发套件安装根路径\iss-iot-win\devkit-x86\sysroots\i586-poky-linux\usr\lib\java:

      • upm_grove.jar

      • upm_i2clcd.jar

      • upm_rhusb.jar

      • mraa.jar

      External Jars
      图 6.将外部 jar 添加至 build path。

  8. 利用 scp 或 WinSCP* 将 www文件夹复制到目标平台的主目录中。在 Eclipse* 中为面向 Java* 应用的项目创建一个新的运行配置。在 Main选项卡中将主类设置为 com.intel.pathtoproduct.JavaONEDemoMulti。然后,将如下命令输入 arguments 选项卡中:

    -webapp <path/to/www/folder>

    注:如果无需运行 IDE,请直接将存储库下载至目标平台,然后运行 start.sh script。

结论

如本篇操作文档所示,物联网开发人员能够以较低的成本创建解决方案,且无需专业的技能。具体而言,借助一台英特尔® 物联网网关和一个 Arduino 101* 开发板,项目小组可以快速调整现有的英特尔® 物联网产品路径解决方案,以满足全新的业务需求。

如欲了解更多信息,请访问

什么是英特尔® Joule™ 模块?

$
0
0

英特尔面向硬件开发、设备制造和众多业余爱好者推出了最新产品:The 英特尔® Joule™ 模块。搭载了四核英特尔® 凌动™ 处理器(时钟速度高达 1.7 GHz)、4 GB PoP LPDDR4 RAM、英特尔® 高清显卡、5.0 GHz 和 2.4 GHz Wi-Fi 以及 蓝牙* 低能耗支持,英特尔® Joule™模块无疑是当今最强大的以创新者为中心的系统模块 (SoM) 之一。

配有扩展板的英特尔® Joule™ 模块能够利用 U 盘、microSD* 闪存卡和内部 eMMC 存储设备启动。在默认情况下,它运行面向物联网的参考 Linux* 操作系统,英特尔预装了许多常用开发工具和软件包,包括 Java* 和 Python* 以及 Libmraa* 和 UPM 库。还能够轻松运行其它桌面操作系统 (OS),支持将于今年晚些时候推出的 Windows® 10 IoT Core* 和 Ubuntu Core (Snappy)*。

在过去两个月间,我不仅个人在使用英特尔® Joule™ 模块,还和他人共同使用英特尔® Joule™ 模块开发了一系列 C++ 代码示例。在此期间,我对它的特性日益了解。英特尔® Joule™ 模块是一个极具创新性的平台,目前,它给我留下了非常深刻的印象。现在,它已经正式发布了,我非常期待看到它进一步扩展,影响整个行业。 

我希望英特尔® Joule™ 模块能够得到全方位的应用,从陆地机器人、水下传感器浮标到空中的远程控制无人机。它的应用范围是无限的。

在报告中查看一整套代码示例。

 访问 GitHub  英特尔® Joule™ 模块资源

 

英特尔® 深度学习 SDK 部署工具教程

$
0
0

下载 PDF [PDF 728 KB]

修订历史

修订编号描述修订日期

001

初始版本

2016 年 12 月

目录

1 简介
  1.1 相关信息
  1.2 安装英特尔® 深度学习 SDK 部署工具
  1.3 规则和符号
  1.4 英特尔® 深度学习 SDK 部署工具简介
2 使用英特尔® 深度学习 SDK 部署工具
  2.1 典型使用模式
  2.2 模型优化器概述
    2.2.1 前提条件
    2.2.2 运行模型优化器
    2.2.3 已知问题和限制
  2.3 界面引擎概述
    2.3.1 创建示例应用
    2.3.2 运行示例应用
3 端到端用户场景
  3.1 利用面向深度神经网络的英特尔® 数学核心函数库插件进行图像推断

1 简介

“英特尔® 深度学习 SDK 部署工具用户指南”指导用户使用部署工具优化经过训练的深度学习模型,以及利用统一 API 将推断集成至应用逻辑。查看“端到端用户场景”章节,以查找更多使用示例。

本指南不提供关于英特尔® 深度学习 SDK 训练工具的信息。如欲获取此类信息,请查看“英特尔® 深度学习 SDK 训练工具用户指南”

1.1 相关信息

如欲获取关于 SDK 的要求、新特性、已知问题和限制的更多信息,请参考版本说明文档。

1.2 安装英特尔® 深度学习 SDK 部署工具

如欲获取安装步骤,请参考“英特尔® 深度学习 SDK 部署工具安装指南”。

1.3 规则和符号

本文使用了如下规则。

SDK

软件开发套件

API

应用编程接口

IR

深度学习网络的内部表达

CNN

卷积神经网络

1.4 英特尔® 深度学习 SDK 部署工具简介

英特尔® 深度学习 SDK 部署工具是英特尔® 深度学习 SDK 的一种特性,英特尔® 深度学习 SDK 是一套免费工具,支持数据科学家、研究人员和软件开发人员开发、训练和部署深度学习解决方案。

借助英特尔® 深度学习 SDK 部署工具,您能够:

  • 通过压缩模型和量化权重,优化经过训练的深度学习网络,该网络基于端点设备特点而定制。
  • 提供统一 API,将推断集成至应用逻辑。

部署工具包括两个主要部件:

模型优化器

模型优化器是一款跨平台的命令行工具,支持:

  • 以经过训练的网络作为输入,该网络包括特定的网络拓扑、参数和调整后权重及偏差。输入网络通过 Caffe* 框架生成。
  • 执行网络层的水平和垂直融合。
  • 裁剪网络中未使用的分支。
  • 应用权重压缩方法。
  • 以网络内部表达 (IR) 作为输出,生成描述整个模型的两个文件:
    • 拓扑文件 – 一种描述网络拓扑的 .xml 文件。
    • 训练数据文件 – 一种包含权重和偏差二进制数据的 .bin 文件。
  • 以生成的 IR 作为推断引擎的输入。

界面引擎

界面引擎是一种运行时,能够:

  • 以模型优化器生成的 IR 作为输入
  • 优化目标硬件的推断执行
  • 交付推断解决方案,节省嵌入式推断平台的空间。
  • 支持与应用逻辑的无缝集成,通过在不同平台上使用相同的 API,简化了英特尔® 平台间的迁移。

2 使用英特尔® 深度学习 SDK 部署工具

2.1 典型使用模式

该方案展示了部署工具的典型使用模式,即对经过训练的深度神经网络模型执行推断。您可以通过英特尔® 深度学习 SDK 训练工具或 Caffe* 框架训练模型。

  • 为模型优化器提供 Caffe* 格式的模型,根据特定网络拓扑、权重和偏差值以及其它参数生成模型的 IR。
  • 利用目标环境中的界面引擎测试 IR 格式模型。部署工具包括界面引擎示例应用。如欲获取更多信息,请参阅“运行示例应用”部分。
  • 将界面引擎集成至应用,在目标环境中部署模型。

2.2 模型优化器概述

模型优化器是一款跨平台的命令行工具,有助于训练和部署环境间的迁移。

模型优化器:

  • 将经过训练的模型从特定于框架的格式转换为独立于框架的统一格式 (IR)。当前版本只支持转换 Caffe* 格式的模型。
  • 通过去除冗余层和融合层来优化经过训练的模型,如批归一化和卷积层。

模型优化器以经过训练的 Caffe* 格式模型(网络拓扑为 .prototxt 文件,网络权重为 .cafemodel 文件)为输入,输出 IR 格式的模型(网络拓扑为 .xml 文件,网络权重为二进制 .bin 文件):

英特尔® 深度学习 SDK 训练工具的分发版也包含模型优化器。

2.2.1 前提条件

  • 模型优化器以一系列二进制文件(一个可执行二进制文件和一系列共享对象)的形式分发,仅支持64 位 Ubuntu* 操作系统。通过写入许可设置,可以将这些文件置于任何目录。
  • 将安装 Caffe* 框架和全部先决组件。必须配备 libcaffe.so 共享对象。
  • 模型优化器兼容 Berkley* 社区版 Caffe* 和 Caffe 的英特尔® 分发版。可能不兼容其他版本的 Caffe*。

2.2.2 运行模型优化器

执行以下步骤,运行模型优化器。

  • 将 libCaffe.so 共享对象的路径,和模型优化器可执行二进制文件的路径添加至 LD_LIBRARY_PATH。
  • 将当前目录更改为模型优化器 bin 目录。例如:
  • cd /opt/intel/deep_learning_sdk_2016.1.0.<build_number>/deployment_tools/model_optimizer
  • 利用所需的命令行参数运行 ./ModelOptimizer命令:
  • "-w" - 包含模型权重的二进制文件路径(.caffemodel 文件)
  • "-i" - 生成 IR
  • "-p" - 所需的精度(截至目前,必须为 FP32,因为 MKLD-NN 插件目前只支持 FP32)
  • "-d"– 包含网络拓扑的文件路径(.prototxt 文件)
  • “-b” – 批处理尺寸,是一项可选参数,在默认情况下与 CPU 内核数量相同
  • "-ms" - 每个通道中的均值图像值
  • “-mf” – 包含 binaryproto 格式均值图像的文件
  • "-f" - 网络归一化因子(截至目前,必须设置为 1,对应 FP32 精度)。

某些模型需要在训练和部署时从每个图像中减去图像均值。存在两个减法选项:

  • -ms - 减去每个通道的均值
  • –mf - 减去整个均值图像。

均值图像文件应为 binaryproto 格式。对于 ilsvrc12 数据集,可以通过 get_ilsvrc_aux.sh脚本从 Caffe* 下载均值图像文件:

./data/ilsvrc12/get_ilsvrc_aux.sh

模型优化器创建了一个文本 .xml 文件和一个二进制 .bin 文件,在当前目录中的 Artifacts目录下生成一个 IR 格式模型。

2.2.3 已知问题和限制

最新版模型优化器存在以下局限性:

  • 只面向 64 位 Ubuntu* 操作系统分发。
  • 只能处理 Caffe* 格式的模型。
  • 可以处理常见的图像分类网络模型,包括 AlexNet、GoogleNet、VGG-16、LeNet 和 ResNet-152,还能处理完全卷积网络模型,如用于图像分割的 FCN8。不支持定制网络。

2.3 界面引擎概述

界面引擎通过统一 API 将推断集成至应用逻辑,有助于深度学习解决方案的部署。

最新版界面引擎支持对常见的图像分类网络(包括 LeNet、AlexNet、GoogleNet、VGG-16、VGG-19 和 ResNet-152)进行推断,也能推断完全卷积网络,如用于图像分割的 FCN8。

界面引擎安装包包括头文件、库和两个示例控制台应用:

  • 图像分类示例应用 - 该应用展示了如何使用界面引擎推断常见的图像分类网络,如 AlexNet 和 GoogleNet。
  • 图像分割示例应用 - 该应用展示了如何使用界面引擎推断常见的图像分割网络,如 FCN8。

2.3.1 创建示例应用

推荐以下构建环境:

  • Ubuntu* x86_64 14.04 或更高版本、GCC* 4.8 或更高版本
  • CMake* 2.8 或更高版本。

您可以利用 samples 目录中的 CMake文件构建示例应用。

  1. samples目录中创建一个用于构建示例应用的新目录:
    $ mkdir build
    $ cd build

  2. 运行 CMake,并生成 Make文件:
    $ cmake <path_to_samples_directory>

  3. 运行 Make,并创建应用:
    $ make

2.3.2 运行示例应用

运行图像分类示例应用

利用 -h 选项运行应用,将显示以下使用提示:

$ ./classification_sample --help
classification_sample [OPTION]
Options:
    -h, --help 		Print a usage message.
    -i "<path1>""<path2>" ..., --images "<path1>""<path2>" ...
   						Path to a folder with images or path to an image files: a .ubyte file for LeNet and a .bmp file for the other networks.
    -m "<path>", --model "<path>" 	Path to an .xml file with a trained model.
    -p "<name>", --plugin "<name>" 	Plugin name.For example MKLDNNPlugin.
    -pp "<path>", --plugin_path  	Path to a plugin folder.
    -ni N, --niter N 	The number of iterations to do inference; 1 by default.
    -l "<path>", --label "<path>" 	Path to a file with labels for a model.
    -nt N, --ntop N 	Number of top results to output; 10 by default.
    -pc, --performance_counts 		Enables printing of performance counts.

以下示例命令显示了如何通过图像分类示例应用,利用经过训练的 AlexNet 网络和面向深度神经网络的英特尔® 数学核心函数库 (Intel® MKLD-NN) 插件对图像进行推断:

$ ./classification_sample -i <path_to_image>/cat.bmp -m <path_to_model>/alexnet.xml -p MKLDNNPlugin -pp /path/to/plugins/directory

默认情况下,应用输出前 10 个推断结果。将  --ntop or -nt 选项添加至之前的命令,以修改输出的推断结果数量。例如,您可以通过以下命令输出前 5 个结果:

$ ./classification_sample -i <path_to_image>/cat.bmp -m <path_to_model>/alexnet.xml -p MKLDNNPlugin -nt 5 -pp /path/to/plugins/directory

运行图像分割示例应用

利用the -h 选项运行该应用,将显示以下使用信息:

$ ./segmentation_sample -h
segmentation_sample [OPTION]
Options:
	-h Print a usage message.
	-i "" Path to a .bmp image.
	-m "" Path to an .xml file with a trained model.
	-p "" Plugin name.For example MKLDNNPlugin.

您可以通过以下命令,利用经过训练的 FCN8 网络对图像进行推断:

$ ./segmentation_sample -i /inputImage.bmp -m /fcn8.xml -p MKLDNNPlugin -pp /path/to/plugins/directory

应用输出一张分割图像 (out.bmp)。

3 端到端用户场景

3.1 利用面向深度神经网络的英特尔® 数学核心函数库插件

对图像进行推断。
  1. 按照上文的描述配置模型优化器,并转至二进制文件夹:
    cd <path_to_DLSDK>/deployment_tools/model_optimizer

  2. 将 libCaffe.so 共享对象和模型优化器文件夹路径添加至 LD_LIBRARY_PATH 变量:
    export LD_LIBRARY_PATH=${CAFFE_ROOT}/build/lib:
    <path_to_DLSDK>/deployment_tools/model_optimizer

  3. 利用“运行模型优化器”部分列出的命令行参数,配置面向 MKL-DNN 插件的模型优化器。
  4. 运行以下命令:
    ./ModelOptimizer -w <path_to_network.caffemodel> -i -p FP32 -d
    <path_to_deploy.prototxt> -f 1 -b 1 -ms
    "104.00698793,116.66876762,122.67891434"

  5. 成功启动命令后,输出以 IR 形式显示的模型,位于:
    <path_to_DLSDK>/deployment_tools/model_optimizer/bin/Artifacts/<NetworkName>/

  6. 按照“创建示例应用”部分的描述,编译界面引擎分类示例应用。
  7. 转至编译的二进制文件:
    cd <path_to_DLSDK>/deployment_tools/inference_engine/bin/intel64/

  8. 利用经过训练和优化的模型推断图像:
    $ ./classification_sample -i <path_to_image>/cat.bmp -m
    <path_to_model>/alexnet.xml -p MKLDNNPlugin -pp /path/to/plugins/directory

为何机器学习如此热门?

如何安装 Python* 版英特尔® 数据分析加速库(英特尔® DAAL)

$
0
0

简介

英特尔® 数据分析加速库(英特尔® DAAL) 是一款软件解决方案,提供整个数据分析阶段所需的构建模块,从预处理到决策制定。beta 版英特尔 DAAL 2017 提供面向 Python* 语言的支持。

安装 

本文提供三种安装 Python* 版英特尔 DAAL(或 pyDAAL)的方法。

  • 面向 Linux* 的 Anaconda* 分发版

在 Linux* 上安装 pyDAAL 最简单的方法是通过 Anaconda* 分发版安装。如欲了解详细信息,请查看 “逐步说明”

  • 面向 Windows*、Linux* 和 OS X* 的英特尔® Python* 分发包

           pyDAAL与英特尔® Python* 分发包一同发运。如欲获取更多信息,请访问产品页面

  • 通过源代码创建 pyDAAL

如果上述选择不适合您,你可以自行创建 pyDAAL。英特尔 DAAL 2017 beta 软件包提供源代码。

  1. 运行 <DAAL install dir>/daal/bin/daalvars.sh 脚本,根据您的目标架构设置 DAAL 环境变量:
    • 32 位英特尔® 架构: daalvars.sh ia32
    • 64 位英特尔®架构: daalvars.sh intel64
  2. 转至 Python* 版英特尔 DAAL 源代码所在的目录,并运行安装脚本:

cd <DAAL install dir>/pydaal_sources

<python home>/python setup.py install

setup.py 脚本创建和安装 pyDAAL 软件包后,可以在 Python* 程序中运行英特尔 DAAL。 如欲获取详细信息,请查看英特尔 DAAL 入门指南,位于 <DAAL install dir>/documentation/en/ps2017 中。

结论

上述方法是在系统中安装 Python* 版英特尔 DAAL 最常见的三种方法。请让我们了解您最喜欢哪一种。如果您有本文未涉及的其它首选方法,希望您能告知我们。

面向视频游戏的流体模拟(第 21 部分)

$
0
0

下载文档

下载面向视频游戏的流体模拟(第 21 部分) [PDF 830KB]

摘要

我们希望打造出内容有趣、图象精美、情节合理的游戏。

流体模拟可以改善游戏机制,增强视频游戏的美感和真实感。视频游戏需要在低预算的情况下实现高性能,但精度要求不高。在低预算方面,我是指计算资源和人力资源:游戏需要快速运行,但不能花费开发人员或美术师大量时间。模拟流体的方法有许多种。在本系列中,我将介绍非常适合视频游戏的方法:便宜,美观,可轻松编写。

如果您要在视频游戏中模拟流体,需要克服很多挑战。流体力学是渗透在数学领域中的一个复杂的主题。它在数字上也充满了挑战性,单纯的实施很不稳定或者操作完全错误,由于流体跨越空间中的每个点,因此,模拟它们需要花费大量计算资源,包括处理和内存两个方面。(尽管流体模拟非常适合在图形处理单元 [GPU] 上运行,但在视频游戏中,GPU 往往会忙于处理渲染。)提高数值稳定性的最简单、最明显的方式是使用更多、更小的时间步进,但这会显著增加计算成本,因此我们倾向于采用能够有效提高流体粘性的其他技术,这意味着游戏中的流体往往会厚而粘稠。诸如光滑粒子流体动力学等最常见的技术不是很适合微妙、朦胧的运动,例如烟雾和火焰。能够解决这些难题的模拟方法有助于在视频游戏中添加更多的流体种类,包括火焰和烟雾。

为了解决这些难题,我提出了一种适合模拟微妙、朦胧的运动的流体模拟技术,该技术基于在任何完整的三维 (3D) 游戏引擎中都可找到的粒子系统模式。它可以使用尽可能多的可用 CPU 线程,线程越多,效果就会越精细。

此方法与游戏开发有很多协同效应,包括以下方面:

  • 游戏引擎支持粒子系统和物理模拟。
  • CPU 往往有未使用的核心。
  • 流体模体适合并行处理。

我提出的方法使用了涡流粒子法 (VPM),这是一种不同寻常的技术,可带来以下优势:

  • 它是一种基于粒子的方法,可重复使用现有粒子引擎。
  • 涡流模拟很适合微妙、朦胧的运动,例如烟雾和火焰。
  • 模拟算法在数值上很稳定,即使没有没有粘性(显式或隐式)也不受影响。

本系列介绍了数学和数值。我提出了基于粒子的流体模拟主题的变体,并纳入了一个热力对流和燃烧的模型,以便系统也可以建立火焰模型。我展示了积分和微分两种数值方法,将它们的优缺点进行对比,提出了一种混合方法,这种方法既能利用每种方法的优点又能避开它们的缺点。这将可以形成一种快速(离子数量呈线性)、流畅的流体模拟,能够模拟朦胧的流体,例如火焰和烟雾。

尽管 VPM 在某些场景中获得了明显的成功,但 它在其他场景中有很大的局限性。例如,它难以显示液体与气体之间的交界处,例如水池表面。我简要地介绍了光滑粒子流体动力学方法 (SPH),以探索一种能够在常见的混合框架中结合 VPM 和 SPH 的方式,但(大体上)我留下了很大的改进空间。

本系列文章留有多个未探索的思路。在文章的结尾,我总结出了我鼓励您探索并与社区分享的思路列表。

第 1 部分第 2 部分概述了流体动力学和模拟技术。第 3 部分第 4 部分提出了一种实时运行双向流-固耦合作用的涡流粒子流体模拟。第 5 部分分析并优化了模拟代码。第 6 部分介绍了另一种用于根据涡量计算流速的方法。第 7 部分展示了如何将流体模拟集成到典型的粒子系统中。第 8 部分第 9 部分第 10 部分第 11 部分介绍了如何在基于涡流的流体模拟中模拟密度、浮力、热量和燃烧。第 12 部分介绍了不恰当的采用会如何导致不必要的跳动,并介绍了如何缓解这种情况。第 13 部分新增了凸多胞形和类似提升的作用力。第 14 部分第 15 部分第 16 部分第 17 部分第 18 部分新增了容器、SPH、液体和流体表面。第 19 部分详细介绍了如何使用树码算法求涡量的积分以计算出矢势。

流体力学

根据我们在建立多个流体模型方面积累的实践经验,我概括了一些这些模拟背后的数学和物理原理。流体模型需要运行数学算法以同时求解一系列方程。每个方程管理流体的物理行为的不同方面。

动量

动量方程(其中一个为著名的纳维尔-斯托克斯方程)描述了动量如何演变以及质量如何移动。这是一个非线性方程,非线性特征是导致流体如此具有挑战性和趣味性的原因。

涡量是动量的旋度。涡量方程描述了流体在何处发生旋涡,即流体在何处以有趣的方式移动。由于涡量是动量的衍生物,因此求解涡量方程相当于求解动量方程。本系列文章利用这种联系,将仅关注流体有涡量的地方的作用力数值,通常流体有涡量的地方比流体有动量的地方稀疏得多。涡量方程还含蓄地舍弃了流体中的分歧,即与流体的压缩性相关的部分。正确处理压缩性需要更多的计算资源或更细微的数值策划,但在与视频游戏相关的绝大多数场景中,您可以忽视压缩性。因此,涡量方程也可产生一种避开压缩性问题的方式。

平流描述了粒子如何移动。动量方程和涡量方程都有平流项。它是非线性项,因此它负责流体运动的最有趣的方面以及最具挑战性的数学和数字问题。使用基于粒子的方法,让我们能够将平流项单独分开来,只需按照流速场在周围移动粒子即可对其进行处理。通过这种方法,可以将 VPM 纳入粒子系统,事实上操作很简单。它还让粒子系统能够重复使用流速场,以用于流体模拟使用的涡流粒子和传播渲染视觉效果使用的“示踪”粒子。

动量方程和涡量方程的浮力项描述了重力、压力和密度如何产生力矩。这种效果蕴含了流体的上升方式,因此对于模拟火焰和烟雾的运动至关重要。注意,虽然本系列中的 VPM 模拟技术未明确建立压力梯度模型,但假设了压力梯度完全沿着重力方向。这一假设让流体模拟浮力,尽管无需将压力作为其单独的部分进行建模。要建立正确的压力梯度模型,通常必须建立压缩性模型,正如在某处所提到的,这通常需要耗费大量计算资源。因此,通过做出压力梯度始终沿着重力方向这一假设,可以看出,能够节约大量计算资源。计算密度梯度需要了解相邻粒子之间的关系。在本系列中,我提出两种解决此问题的方式:基于栅格的方法和基于粒子的方法。基于栅格的方法直接采用一种空间分区方案,该方案也可用于计算粘性效应。基于粒子的方法使用 SPH 使用的算法子集。这两种方法都可以产生令人满意的结果,因此决策取决于哪种方法成本更低。

动量方程和涡量方程中的应力项和应变项描述了压力和剪切如何在流体内产生运动。这就是粘性进入模拟的位置。改变粘性的大小和形式让模拟能够对从烟雾等微妙、朦胧的东西到油或粘液等粘稠的东西等各种流体进行建模。本系列中的流体模拟使用了粒子强度交换法 (PSE) 技术交换邻近粒子之间的动量。该技术需要模拟跟踪粒子邻近的粒子,即了解最近邻的粒子。我提出了一种使用统一栅格空间分区的简单方法,但其他方法也可能有效,这也是我鼓励您进一步探索的思路之一。

涡量方程的伸展项和倾斜项描述了由于配置,一定距离的旋涡之间如何相互作用。严格来说,这就是 3D 效果,它会导致涡旋运动。没有这种效果,流体的行为就少了很多趣味性。我提出的算法使用有限差分计算伸展和倾斜,但其他方法也可能有效。在本文的结尾,我提到了该计算的一个有趣的副作用,您可以使用它来建立表面张力模型。

质量守恒

连续方程说明了,一定体积的质量变化相当于经由体积表面的质量流入量/流出量。正如前面所提到的,本系列中的模拟技术通过施加流体是不可压缩的条件,避开了求解该方程的工作。

状态方程

状态方程描述了流体如何热胀冷缩(以及因此而改变密度)。结合动量方程中的浮力项,状态方程允许算法模拟“热空气上升,冷空气下降”的直观行为。

燃烧

阿仑尼乌斯方程描述了流体的成分如何转变:从燃料转变成等离子再转变成废气。它还描述了液体如何升温因此导致热空气上升,这些将被注入状态方程,以对流体密度如何随着温度的变化而变化进行建模。

拖拽

阻力描述了流体如何与实体相互作用。我提出了一种基于建立粘性模型所使用的 PSE 方法的方法:我在类似的范例中处理了流体粒子和实体。我还将此过程扩展到了交换热量,因此,实体可以加热或冷却流体,反之亦然。

空间分割

流体方程在一个连续的时间和空间域上运行,但在计算机模拟它们需要在时间和空间上分割这些方程。您可以将空间分割为多个区域,这些区域可以移动(例如对于粒子)或不移动(例如对于固定栅格)。

顾名思义,VPM 是基于粒子的方法,而不是基于栅格的方法。然而,我提出的算法也使用了统一栅格空间分区来帮助解答有关空间关系的询问,例如哪些粒子在哪些粒子附近或者哪些粒子在与流体相互作用的实体附近。有很多空间分区可用,并且在每个实施内都可行。针对本文章系列,我选择了适度简单和快速的一部分,但我认为这一过程也可以得到显著改善,因此我在文章末尾提供了一些您可以尝试的想法。

注:其他分割办法也可行,例如在光谱域中。这是为了让好奇的读者知道其他可能性,但为简洁起见,我省去了详细内容。

涡流粒子法

在本系列中,我主要采用 VPM 用于对流体运动进行建模,但即使在该方法中,关于如何执行数值解算器的各个方面,您也有很多选择。最终,计算机需要根据涡量获得流速,并且有两种数学方法来执行此操作:积分和微分。任何一种方法都可以通过多个数值算法进行求解。

我提出的积分方法为直接求和和树码。直接求和具有渐进时间复杂度 O(N2),在提出的所有方法中,该方法是最慢但也是最容易实现的方法。树码具有渐进时间复杂度 O(N log N),该方法介于最慢和最快之间,其代码复杂度明显高于直接求和,但复杂度抵得上速度优势。除这些方法以外,还有其他一些我未涉及的办法可能也可以使用。例如,多极方法具有渐进式的低计算复杂度等级,但在数学和数值上都需要非常高的复杂度。

我提出的微分方法需要求解矢量泊松方程。在我提出的所有方法中,这种方法的渐进运行时间最快,并且数学和代码不是很复杂。基于上述说明,它似乎是一个显而易见的选择,但存在一个涉及边界条件的问题。

求解任何偏微分方程都需要施加边界条件:在域的空间边界处求解方程。对于积分方法,最简单的条件是“开放”,这相当于没有围墙的无限域。模拟算法处理实体,包括墙壁和地板,这些应足以施加适合任何场景几何图形与流体相互作用的边界条件,因此施加更多的边界条件是多余的。

我提出的泊松解算器使用了带统一栅格的矩形盒。在此盒上施加“无滑移”或“无通过”边界条件比较容易,但流体好像在盒内一样进行移动。您可以移动域边界,使其远离流体运动有趣的部分,但由于此盒具有统一栅格,大多数的栅格单元本身会没有任何有趣的地方,但会耗费内存和计算过程。所以,理想情况下,您将有一个支持开放边界条件的泊松解算器,这相当于了解边界处的解,但泊松解算器又是为了获取解,因此是循环依赖关系。

为了解决这一问题,我使用了积分方法计算域边界(二维表面)处的解,然后使用泊松解算器计算整个域内部的解。该混合方法运行 O(N) 时间(比树码快),但其结果优于树码解算器结果。

评估

VPM 很适合火焰和烟雾,但不适合液-气边界。SPH 很适合液-气边界,但不流畅。我尝试将两者结合起来但效果不佳,但我认为这种方法是有价值的。

更多可能性

我在本系列中提出的方法和代码提供了示例以及针对游戏视频的流体模拟的出发点。要将这些示例转变成可行的产品代码,需要进一步完善模拟和渲染代码。

模拟

VPM 改进

我实施了一个简单的统一栅格空间分区方案。对该数据结构执行查询会耗费大量时间。您可以对其进行优化或进行更换,例如使用空间散列。您也可以将每个单元容器换成更轻巧的容器。

尽管比较困难,但还是可以对 VPM 中的这些液-气边界进行建模。您可以通过使用水平集跟踪平面,使用表面几何图形计算曲率,使用曲率计算表面张力,并将这些效应纳入涡量方程。计算曲率需要计算 Hessian,它与 Jacobian 有关,而 Jacobian 已被用于计算应变和应力。

VPM 有一个明显的数学问题:首先是一束小粒子携带一个极小区域中的涡量,非常之小,容易将它们视为点。涡量在数学上就像一个磁场,您可以将这些涡流粒子比作为细小的磁体。然而,这些磁体只有一个“极”,这在数学和物理上都是不可能的。同样,不存在像涡流“点”的东西。如果您只有一个点,涡流场可能存在分歧,而这在数学上是不可能的,在物理上也是毫无意义的。然而,此模拟方法正是存在此问题。解决此问题的一种方式是使用涡流线,例如拓扑上形成的环。封闭涡流环没有净分歧。(例如,请参见 Angelidis 和 NeyretSee 共同撰写的“Simulation of Smoke Based on Vortex Filament Primitives” 。)涡流线也可以在流体边界处终止,例如在与实体的交界处。旋转体是一个最明显的示例:事实上,旋转体有一个涡量,涡线应通过旋转体。

注:在 SIGGRAPH 2010 上发表的“Filament-Based Smoke with Vortex Shedding and Variational Reconnection”出现了以下错误:作者将旋转体置于流体内,但他们的涡流线没有通过这些旋转体。他们好像在后续期刊上更正了此错误,并且曾出现此错误的 YouTube* 视频不再可见。

其他技巧

因为 SPH 也是一个使用粒子的流体模拟方法,所以我的直觉是,它应会对 VPM 起到补充作用,以便一些混合方法可以既适用于朦胧的流体,也适用于液状或粘稠的流体。我不会说我的尝试成功,但我希望它可以激发出统一这些方法的设想。尽管我的实施失败,但我认为基本思路仍是有效的。

本系列文章没有涉及它们,但基于栅格的方法非常适合特定情况,例如当势流很重要时以及浅水波等。同样,谱方法具有极高的准确性,但这正是视频游戏所舍弃的东西。

渲染

在伴随这些文章的代码中,大多数处理时间用在渲染方面,而不是模拟。这是个好消息,因为示例代码中的简单渲染没有利用现代 GPU,因此有很多提高速度的机会。

示例代码执行多个顶点操作,例如计算面向相机的四边形。该代码易并行,因此可编程顶点着色程序可在 GPU 上快速执行该代码,因为 GPU 有数百个或数千个处理单元。

然而,结果证明,在每个顶点上操作的例程上添加更多 CPU 核心不会产生线性加速,这意味着内存带宽限制处理速度。事实上,要加速处理,机器需要访问更少的内存。此外,有解可供使用:在顶点缓冲区内,每个粒子仅存储一个元素,而不是每个三角形顶点存储一个元素。甚至可按原样传输一份粒子缓冲。由于您可以控制顶点着色程序如何访问内存,该顶点缓冲可以采用您喜欢的任何格式,包括粒子缓冲拥有的格式。这意味着使用更少的带宽。

注意,GPU 很可能仍需要一份单独的粒子缓冲,即便其内容与 GPU 使用的粒子缓冲完全相同。原因是这些处理器异步运行,因此,如果它们共享了一个缓冲,CPU 可能会在 CPU 访问数据的中途修改粒子缓冲,这会导致不一致的渲染伪影。在这种情况下,复制粒子缓冲较为谨慎。(也许直接存储器存取引擎可以进行复制,且不会妨碍 CPU。)相比之下,渲染共享粒子缓冲的视觉伪影可能会非常之小和罕见,以致于用户可能没有察觉到。您应该尝试多个变体,以便在速度和视觉质量之间达到平衡。

为了使流体模拟看起来像连续、稠密的流体,而不是一系列稀疏的点,示例代码使用了大量示踪粒子,实际有数万个的示踪粒子。可以说,如果有数百万粒子,效果会更好,但处理和渲染的计算费用很高昂,无论是在时间上还是在内存上。如果您使用更少数量的同等大小的粒子,渲染效果会留下间隙。如果您增大粒子大小,间隙会消除,但流体可能会看起来比较朦胧,也就是说除非粒子仅沿着可能出现更小粒子的方向增大。此问题至少有三种解决方法:

  1. 使用立体渲染替代粒子渲染。这样做会涉及计算体纹理和使用更少数量的更大面向相机四边形访问体纹理进行渲染;效果会很棒。
  2. 沿示踪粒子伸展的方向伸长示踪粒子。其中一种方式是将示踪粒子视为成对配对,在这种情况下,它们在彼此附近初始化并作为胶囊形的两端进行渲染,而不是将每个粒子作为单独的 blob 进行处理。您甚至可以将其与用于跟踪上,即和当前相机变化的着色程序相结合,引入一个简单而有效的运动模糊;两者的数学运算都较为类似。
  3. 展开选项 2 的思路,甚至可以使用更多的成对示踪粒子系列。例如,您可以四个(或者您选择的数量 N 个)为一组发射示踪粒子,并将它们渲染成一条丝带。然而,注意,如果粒子群“扭结”,渲染可能会非常棘手;这会导致丝带折叠部分,因而屏幕空间会出现零区。

关于作者

Michael J. Gourlay 博士就职于 Microsoft,在“环境理解”小组担任 HoloLens* 主要开发负责人。他领导团队实施跟踪、表面重构和校准。他之前就职于 Electronic Arts (EA Sports),担任足球运动业务部门的软件架构师、Madden NFL* 高级首席工程师、角色物理学和 ANT*(EA 使用的程序动画系统)高级首席工程师、综合格斗* 高级首席工程师、FranTk*(Connected Careers Mode 背后的引擎)原架构师、NASCAR* 主程序设计师。他编写了 Lynx*(全球 EA 游戏中使用的视觉特效系统)和获得专利的高带宽在线互动应用程序算法。

他还开发了相关课程,在中佛罗里达大学、佛罗里达互动娱乐学院,以及最顶尖的旨在教授程序员、制作人和艺术家如何制作视频游戏和训练模拟的跨学科研究生项目中从事教学工作。

加入 EA 之前,他使用计算流体动力学和世界最大规模的并行巨型计算机开展了科学研究。Michael 分别获得了乔治亚理工学院和科罗拉多大学博尔德分校颁发的物理学学位和哲学学位。


利用 Skull Canyon 建造一台街机游戏机

$
0
0

大家好,我是 Bela Messex,我和另一名开发人员成立了一个伙伴系统,我们的工作室位于洛杉矶的公寓内,我们是 Little Bug 游戏的开发人员。

为什么要建造一台街机游戏机?

在我和我的联合开发人员所处的世界中,DIY 产品并不畅销,只是一种自然、必要的创新方式。 我和 Paul 相识以前,那时我们还没有共同设计视频游戏,我们制作交互式装置、杂志和漫画。 我们对数字游戏与物理交互的结合非常感兴趣,实现两者结合有多种形式,一种简单的方式是将我们的首款游戏 Little Bug 放置于定制的街机游戏机内。 事实证明,这样做非常轻松、有趣而且简单,在 Fantastic Arcade 和 Indiecade 等展会中,其独特的互动吸引了许多参会者。

规划

开始设计前,我利用 Image Effects、Animations 和完全失真的照明一个渲染了 Unity 设计。要是现实生活和视频游戏一样就好了,但现在至少我有了一个目标。

组件

尽管以下组件适用于我们的项目,也能帮助您开展自己的项目,但您可以根据游戏的独特要求来定制组件。

  • 英特尔 NUC Skull Canyon。
  • 2 个街机操作杆。
  • 3 个街机按钮。
  • 2 个通用 PC 操作杆主板(包括电线)。
  • 4 英寸 x 8 英寸 MDF 面板。
  • 24 英寸显示器。
  • 8 英寸 LED 强光灯。
  • 电源插板。
  • 电钻。
  • 射钉枪和木胶。
  • 各种型号的螺丝钉和弹簧。
  • 6 英寸琴式铰链。
  • 魔术贴扎带。
  • 束线带。
  • 黑色油漆和彩色油漆笔。
  • 半透明树脂玻璃。

建造游戏机

之前制作装置时,我主要负责焊接,所以我需要向 Paul 请教如何测量与切割 MDF 面板。 我们利用竖锯、铅笔和基本绘图工具当场设计形状,完成了测量与切割。 下图显示 Paul 在仓库工作室中建造即将完工的游戏机。

我们利用胶水和射钉枪将碎片组合在一起,如果您想要它承受更大的强度,可以使用螺丝钉固定。 请注意前面的铰链 - 这是 Paul 的想法,但是稍后在安装按钮和操作杆时,发挥了很大作用。 涂料旁边是脚踏板,由于 Little Bug 游戏需要同时使用两个操作杆和一个按钮,因此,我们专门针对这个独特的控制要求而设计了脚踏板。 双杆设置在游戏控制器上没有任何问题,但是转化成两个标准尺寸的街机操作杆时,两只手都占用了,如何按下按钮? 解决方法:用脚按按钮!

为整个框架喷漆后,终于进入了有趣的环节 - 安装电子部件。 我选择了较为经济(15 美元)的套件,包括 6 个按钮、一个操作杆、一个 USB 控制器和全部线缆。 运行了数百轮游戏后,它们仍旧表现良好。 请注意屏幕上面的 LED,能让字幕发光,制造经典街机游戏的感觉。

通过魔术贴扎带将 NUC 安装在游戏机后面之后,我在 Unity inspector 内同步了按钮和操作杆,建造了专为街机游戏机设计的全新构造。 Little Bug 采用手绘 sprite,因此,我们利用油漆笔绘制了所有的外部设计,以保持外观一致。 用油漆在涂漆用胶带上绘制模版,以此制作 Marquee。

街机游戏的乐趣

能够亲眼见证玩家与自己制作的游戏交互,这种乐趣是其他任何事情无法比拟的。 尽管 Little Bug 本质上没有变化,但是交互方式截然不同,看到玩家有了全新的游戏体验,我作为游戏设计人员感到非常激动。 NUC 体积轻巧、性能卓越,最适合创建此类的游戏体验,它的表现令人满意,我现在已经开始计划利用它设计更多的游戏。

案例研究 - 利用英特尔® 深度学习 SDK 训练图像识别模型

$
0
0

下载文档

简介

英特尔® 深度学习 SDK 是一套免费工具,数据科学家和软件开发人员用它开发、训练和部署深度学习解决方案。SDK 包含一个训练工具和一个部署工具,可以独立使用,也可以共同用于整个深度学习工作流程。本篇案例研究不仅介绍了 LeNet*(一种进行手写数字识别的重要图像识别拓扑),还展示了如何利用训练工具在面向英特尔® 架构优化的 Caffe* 上对混合国家标准技术研究所 (MNIST) 数据集进行可视化设置、调试和训练。目标受众是数据科学家。

人类视觉系统和卷积神经网络

在接触英特尔深度学习 SDK 的使用方法之前,了解基本的人类视觉系统工作原理,以及它和计算机神经网络的联系,会有所帮助。神经元是人脑的基本计算单元。它从树突中接收输入,当输入的总和达到一定阙值时,将产生输出,触发相连的神经元。抽象地讲,该生物系统可以由下图表示 [1]:

这是一个极其简化的模型。事实上,人脑通过视觉皮质的若干层来处理输入信号,视觉皮质负责特性提取、特性检测和分类。特性提取是指视觉皮质中的细胞对视域(感受域)中的重叠区域进行二次采样,其作用相当于处理输入图像的过滤器。特性检测发生在皮质层的第 17、19 和 19 号区域,分类集中在第 20、21 号区域。请看下面的图片 [2] 。经过处理的信息通过向前和向后传播传输到之前的层后,才能正确地识别图像。

在卷积神经网络 (CNN) 中,卷积层相当于特性检测器,完全连接层相当于分类器。在运行时处理特性提取时,多个输入集同时经过 CNN (称为小批),然后调整每次迭代的权重,从每个正向传播中聚集特性,在向后传播的过程中微调特性。下面,我们来了解一下 LeNet 拓扑,它是一种用于手写数字识别的重要的 CNN。

LeNet 拓扑

[3] 所发布的 LeNet-5 架构如下所示:

该拓扑共有 7 层(不包括输入):两组卷积层和二次采样层,两层完全连接层和一层输出分类层。

第一个卷积层 C1 有六个特性映射,尺寸为 28´28。选择了带有随机权重和常量偏差的 5´5 内核。在六个特征映射之间,总共构成了 156 个可训练参数(6fm * (5 * 5 + 1[偏项]))。通过每次移动一个像素(跨度等于 1),对特征映射进行重叠区域扫描,在第一层总共形成了 122,304 个连接。您会发现每层的神经元数量都在成倍增长,增长速度会因待解决问题的复杂度不同而有所差别。为了减少计算单元的数量,进行二次采样。在 S2 层中,有 6 个尺寸为 14´14 的特性映射。在相应的特性映射 C1 中取样 2´2 尺寸的像素,添加 4 个输入,然后乘以可训练系数和偏差,从而缩小尺寸。请注意,二次采样(池化)层中的 2´2 区域不相互重叠。因此,在 S2 层中,我们最终获得 12 个可训练参数((系数 + 偏差)* 6 个特性映射)和 5,880 个连接。

下面请看 C3 层。此层共有 16 个特性映射,每个特性映射的尺寸为 10´10。下表介绍了如何减少S2 和 C3 之间的像素数[3]:

从 S2 到 C3 的不对称选择确保了每个特性映射获得不同的像素后,提取不同的特性,同时将连接数量控制在合理的范围内。我将简要介绍下 S4。和 S2 的原理完全一致。

最后,让我们来看一下完全连接层。由于这些属于分类器,在先前层中提取的全部特性用于匹配输入,以提取正确的输出。请记住,在 C1、S1、C2 和 S2 中,选择第一次传播中的随机权重和偏差。根据 CNN 的实际输出评估输入时发现,准确性非常低,这点和我们预想的一样。我们的目标是提高模型的准确性,以实现大多数(即使不是全部)输入的预期输出与提供的标签相匹配。我们的解决方法是采用面向成本函数的梯度下降。简言之,该公式如下所示 [4]:

C 代表成本函数,处理所选的权重和偏差。我们的目标是利用权重“w”和偏差“b”所提取的特性,尽量降低任意输入“x”的实际输出“y”和全部输入“n”的预期输出“a”之间发生错误的可能性。

随后,我们将详细介绍如何在 Caffe 中创建卷积层、池化层和完全连接层,向您展示如何利用英特尔深度学习 SDK 选择梯度和其他超参数。

MNIST 数据集

MNIST 数据集是一个由 7 万张手写数字灰度图像构成的存储库 [5]。每张图像的尺寸为 28´28。该数据集基于两个 NIST 数据集,一个由 Census Bureau 的员工收集,另一个由高中生收集。为了加大数据的差异,最终的 MNIST 集在每个数据集中收集 3 万张图像用于训练,5 千张图像用于测试。

您可以点击此处,获取该数据集。我们使用 MNIST 数据集和上述 LeNet 拓扑,展示英特尔深度学习 SDK 中的训练工具。在开始之前,请确保能够正常处理数据,使类别标签 (0,1…9) 位于目录结构的最高级别,并确保每个文件夹内有相应的图像:

现在,让我们借助英特尔深度学习 SDK,探讨如何训练模型。如果您尚未安装英特尔深度学习 SDK,可以单击 此处立即下载。安装程序包括 Windows* 和 MacOS* 两种版本。安装程序使用 Docker 在Ubuntu* 14.04 设备(或更高版本)的后台安装 SDK。训练程序在面向英特尔架构优化的 Caffe 框架上运行。如需帮助,请参考 [7]。英特尔深度学习 SDK 训练工具提供一个图像用户界面,以操作参数,直观显示训练过程。

利用英特尔® 深度学习 SDK 训练模型

易用性是利用英特尔® 深度学习 SDK 进行模型训练的主要优势之一。作为一名数据科学家,您应该更关注如何轻松准备训练数据,尽可能使用现成的拓扑,在必要时设计新的模型,以及借助自动实验和高级可视化训练模型。该训练工具能提供上述全部优势,还简化了常见的深度学习框架的安装过程。以下是该训练工具的概述:

现在,我们来看一下如何利用现有的拓扑,生成经过训练的模型。首先,通过 IP 地址和安装训练工具的设备端口启动训练用户界面。如果未指定端口编号,默认编号为 8080。输入您在安装过程中创建的用户名和密码,并登录界面。

第一步:上传数据集

在左侧的 Uploads选项卡中选择包含上述标签文件夹和相关图像的数据集 zip 文件。选择文件夹路径,然后单击 Upload。完成后,上传成功的数据集路径可以通过 Completed部分获取。

第二步:创建一个新数据集

选择训练/验证百分比和数据增加

Datasets选项卡中单击 New Dataset。命名数据集,并从下拉列表中选择一个已经上传成功的数据集。您可以选择一定比例的数据用于训练、验证和测试。

训练过程的效率取决于数据集的数据可变性,因此,您可以通过某些转换来增加模型的输入,无需改变基本数据集。实用的增加技术包括旋转、双向移位、放大和镜像。请参阅 [8],了解关于每个选项的更多信息。

处理数据

我们所使用的 MNIST 数据集包含 28´28 像素的灰度图像,所以,需要对设置进行相应地调整。如果您需要调整数据的大小,请使用任意一个选项。用户指南包含关于每个选项的更多知识。

选择数据集后端和图像格式

创建数据集

单击Create Dataset。创建完成后,显示训练和测试数据集中每个标签下的数据数量。

第三步创建一个模型

选择数据集

在左侧的 Models选项卡中单击 New Model,然后命名该模型(为了简单起见,我为它选择了与数据集名称相同的名称,您也可以选择其他名称)。

选择拓扑

训练工具目前支持三种图像识别拓扑:LeNet、AlexNet* 和 GoogLeNet*.因为我们针对手写数字识别进行模型训练,我选择了 LeNet,它非常适合这个任务。通过在下面运行的 Caffe* 英特尔® 分发版获取基本数据(卷积层、池化层、完全连接层等的通道数量)。如果您想训练另一种模型,假设使用 Cifar 100* 或 ImageNet 中的彩色图像,可以选择 AlexNet 或 GoogLeNet 进行模型训练。

您也可以基于 LeNet、AlexNet 或 GoogLeNet 创建全新的定制拓扑,具体方法将在后面的部分介绍。

执行数据转换

如果您在训练过程中需要增加一些随机性,可以执行数据转换操作,不会影响数据集中的原始数据。执行数据转换操作的具体步骤详见用户指南。现在,我将使用默认设置。

选择超参数

在此,您选择进行模型微调的设置。某些重要参数包括:

Epoch:通过所有 CNN 层的一次完整传输,数据集中的全部数据文件都经过训练。

批处理尺寸:CNN 数据集通常都很大。为了提高训练效率,数据集被分为包含“x”个图像的批处理。单个批处理通过 CNN 的一次完整的传输被称为一次迭代。大型批处理尺寸可能会降低参数更新过程中的可变性,还会消耗大量内存。因此两者的平衡非常重要。

基础学习速度:在之前讨论的梯度下降算法中,我说过,由于第一次传输的权重和偏差是随机选择的,所以准确率很低。为了实现全局最小值的收敛,我们更改了该算法的基础学习速度。学习速度的提高将加速收敛,但是学习速度过高不利于收敛。另一方面,较低的学习速度更有助于全局最小值的收敛

解析器类型:默认选项是随机梯度下降,在连续批次的输入数据集中随机采集样本,以更快地收敛全局最小值。您也选择采用用户指南描述的其它选项。

现在,您可以开始运行模型了。完成后,将显示每个 epoch 执行的准确性和损失,以及最终训练、验证和测试的准确性。

此时,训练已经完成。需要训练工具生成的 Caffe 文件列表。单击 Download,并保存文件。下面,我们将简要介绍每一种文件,并联系所学的概念。

了解 Caffe* 模型文件

已下载的 model.zip 文件包含了解 CNN 所需的全部文件。如果您想创建自定义拓扑以及调试模型,这些文件非常重要。还可以使用这些文件在部署平台上根据实时数据验证模型。让我们进一步了解这个存档文件中的文件。

最重要的文件是 train_val.prototxt,该文件包含模型的架构 [9]。

数据层

我们看一下数据层的描述。

name:"MNISTLeNet"
layer {
  name:"MNISTFinal"
  type:"Data"
  top:"data"
  top:"label"
  include {
    phase:TRAIN
  }
  transform_param {
    mirror: false
    scale:0.00390625
  }
  data_param {
    source:"/workspace/dl-genie/jobs/datasets/ca04ddcd-66b2-422d-8de8-dcc1ad38cfd4/train.txt_LMDB"
    batch_size:64
    backend:LMDB
  }
}

上述代码生成两个 blob,由“top”表示:一个面向数据,另一个面向标签。“include”部分表示数据层针对训练阶段创建。由于验证需要相同的结构,您将在 train_val.prototxt 文件中发现另一个数据层,在“include”部分表示测试。下一步,我们对像素进行扩展,使它们全部在 0 到 1 的范围内(通过 1/256 = 0.00390625 来实现)。然后,设置数据源,使其指向创建数据集的 docker 容器。需要指出的是,将后端设置为 LMDB,将批处理尺寸设置为 64,和训练工具显示的一致。

卷积层

layer {
  name:"conv1"
  type:"Convolution"
  bottom:"data"
  top:"conv1"
  param {
    lr_mult:1
  }
  param {
    lr_mult:2
  }
  convolution_param {
    num_output:20
    kernel_size:5
    stride:1
    weight_filler {
      type:"xavier"
    }
    bias_filler {
      type:"constant"
    }
  }
}

从上述的 LeNet 拓扑可知,第一个卷积层用来输入尺寸为 28´28 的二进制图像。由“bottom:”参数表示,显示数据 blob 为输入。“param”部分表示根据权重和偏差调整学习速度,权重和偏差是该层的可学习参数。将权重的学习速度 (lr_mult:1) 设置为超参数显示的值。将偏差学习速度设置为权重学习速度的两倍。一般来讲,这样做是为了提高收敛速度。

接下来,需要定义卷积层中的通道数量,由“num_output”定义。需要指出的是,此处的通道数量和上述 LeNet 拓扑的通道数量不同。Caffe 框架中的 LeNet 拓扑使用上述 LeNet 算法的一种变体,但是,从概念上讲,它们彼此相似。将 kernel_size 设置为 5´5 像素(和 LeNet-5 相同),通过每次移动一个像素(由“跨度”显示),扫描尺寸为 28´28 的输入图像。还需要指出的一点是,在第一次迭代时,权重和偏差是随机选择的,这些参数学习如何在训练过程中微调特性。本示例中的 weight_filler 设置为“Xavier”,从均匀分布的 [-scale, scale] 中对权重进行取样,其中,scale = sqrt (3/ n);n= 输入的数量。如果您想进一步了解 Caffe 提供的其它类型的 filler,请查看此文件。我们将 bias_filler 设置为常量值 = 0。

二次采样或池化层

layer {
  name:"pool1"
  type:"Pooling"
  bottom:"conv1"
  top:"pool1"
  pooling_param {
    pool:MAX
    kernel_size:2
    stride:2
  }
}

定义二次采样层相对简单。输入前一个卷积层,选择尺寸为 2´2 的像素区域,按照“stride”的指示移动两个像素,以执行最大池化。这表明不存在重叠区域。通过二次采样,我们得到一个特性映射,其尺寸是第一个卷积层中通道尺寸的一半。

train-val.prototxt 文件包含另外两个部分,列出包含 50 个通道的第二个卷积层和第二个池化层。由于它们类似于上述部分,不在这里探讨。

完全连接层

layer {
  name:"ip1"
  type:"InnerProduct"
  bottom:"pool2"
  top:"ip1"
  param {
    lr_mult:1
  }
  param {
    lr_mult:2
  }
  inner_product_param {
    num_output:500
    weight_filler {
      type:"xavier"
    }
    bias_filler {
      type:"constant"
    }
  }
}
layer {
  name:"relu1"
  type:"ReLU"
  bottom:"ip1"
  top:"ip1"
}
layer {
  name:"ip2"
  type:"InnerProduct"
  bottom:"ip1"
  top:"ip2"
  param {
    lr_mult:1
  }
  param {
    lr_mult:2
  }
  inner_product_param {
    num_output:10
    weight_filler {
      type:"xavier"
    }
    bias_filler {
      type:"constant"
    }
  }
}

在 Caffe 中,“InnerProduct”指完全连接层。唯一的变化是通道数量设置为 500。修正线性单元 (ReLU) 执行元素智能函数 f(x) = max(0,x)。最后一个完全连接层输出 10 个信号。这是一个二进制信号。激活输出 n (say n= 3) 后,显示经过训练的模型预测输入为 3。

损失层

layer {
  name:"loss"
  type:"SoftmaxWithLoss"
  bottom:"ip2"
  bottom:"label"
  top:"loss"
}

如前所述,在 CNN 中,将模型准确性向后传播,以调整权重和偏差,更好地进行特性提取和预测。损失层负责在向后传播过程中输入标签 blob 和当前预测、计算损失以及返回数据。

您可以将某些规则应用于层定义。例如,在定义仅限训练过程中的准确层时,您可以使用以下规则:

layer {
name:"accuracy_top5"
type:"Accuracy"
bottom:"ip2"
bottom:"label"
top:"accuracy_top5"
include {
phase:TEST
}

accuracy_param {
top_k:5
}
}

我们来看一下 solver.prototxt 文件。该文件包括利用训练工具界面定义的全部超参数。您可以改变一个或多个参数,来观察训练过程的变化。

# The train/test net protocol buffer definition
net:"/workspace/dl-genie/jobs/models/ce7c60e9-be99-47bf-b166-7f9036cde0c8/train_val.prototxt"
# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
# The base learning rate, momentum and the weight decay of the network.
base_lr:0.01
momentum:0.9
weight_decay:5.0E-4
# The learning rate policy
lr_policy:"inv"
gamma:1.0E-4
power:0.75
# Display every 100 iterations
display:31
# The maximum number of iterations
max_iter:12645
# snapshot intermediate results
snapshot:843
snapshot_prefix:"/workspace/dl-genie/jobs/models/ce7c60e9-be99-47bf-b166-7f9036cde0c8/snapshot"
# solver mode:CPU or GPU
solver_mode:CPU
type:"SGD"

需要指出的是,在默认情况下,英特尔深度学习 SDK 在 CPU 上运行训练,无需手动配置 Caffe。如果您想在面向英特尔架构优化的 Caffe 上运行训练,请按照 本文的说明进行操作。

您现在已经知道如何解释 Caffe 模型文件,我们来看一下如何利用训练工具界面自定义拓扑。

利用英特尔® 深度学习 SDK 自定义拓扑

我们来回顾一下新模型的创建过程。创建新的模型名称和选择数据集后,转至 Topology选项卡,并选择一个现有的拓扑。在本示例中,我选择的是 LeNet 拓扑。如下所示,单击 edit

预安装 train_val.prototxt 文件的所选模型文本框显示:

现在,您可以修改卷积层、池化层和完全连接层的参数。.输入新模型的名称,并保存新拓扑。保存成功后,生成自定义拓扑列表,您可以通过列表选择合适的拓扑。

您可以按照上述步骤继续进行训练。训练完成后,训练工具下载的模型文件可用于部署平台,做出实时预测。

参考资料和资源

[1] 利用卷积神经网络进行图像识别

[2] 用于一般图像识别的神经网络架构

[3] 用于文档识别的梯度学习

[4] 利用神经网络识别手写数字

[5] MNIST 数据库

[6] 英特尔® 深度学习 SDK

[7] 英特尔® 深度学习 SDK – 训练工具安装指南

[8] 英特尔® 深度 SDK – 训练工具用户指南

[9] 利用 Caffe 在 MNIST 上训练 LeNet

[10] 利用面向英特尔® 架构优化的 Caffe* 训练和部署深度学习网络

对本文件中包含的软件源代码的提供均依据相关软件许可而做出,任何对该等源代码的使用和复制均应按照相关软件许可的条款执行。

该示例源代码根据“英特尔示例源代码许可协议”发布

英特尔® 高级矢量扩展指令集简介

$
0
0

作者 Chris Lomont

下载文章

下载 英特尔® 高级矢量扩展指令集简介 [PDF 1.4MB]

英特尔® 高级矢量扩展指令集(英特尔® AVX)是在英特尔® 架构 CPU 上执行单指令多数据 (SIMD) 运算的指令集。这些指令添加了以下特性,对之前的 SIMD 产品——MMX™ 指令和英特尔® 数据流单指令多数据扩展指令集(英特尔® SSE)进行了扩展:

  • 将 128 位 SIMD 寄存器扩展至 256 位。英特尔® AVX 的目标是在未来可以支持 512 或 1024 位。
  • 添加了 3 操作数非破坏性运算。之前在 A = A + B 类运算中执行的是 2 操作数指令,它将覆盖源操作数,而新的操作数可以执行 A = B + C 类运算,且保持原始源操作数不变。.
  • 少数几个指令采用 4 寄存器操作数,通过移除不必要的指令,支持更小、更快的代码。
  • 对于操作数的内存对齐要求有所放宽。
  • 新的扩展编码方案 (VEX) 旨在使得以后添加更加容易以及所执行的指令编码更小、速度更快。

与这些改进密切相关的是新的融合乘加 (FMA) 指令,它可以更快、更精确地执行专门运算,例如单指令 A = A * B + C。第二代英特尔® 酷睿™ CPU 中将可提供 FMA 指令。其他特性还包括处理高级加密标准 (AES) 加密和解密的指令、用于某些加密基元的紧缩 carry-less 乘法运算 (PCLMULQDQ) 以及某些用于未来指令的预留槽,如硬件随机数生成器。

 

指令集概述

新指令使用英特尔的 VEX prefix 进行编码,VEX prefix 是一个 2个或 3 个字节的前缀,旨在降低当前和未来 x86/x64 指令编码的复杂性。两个新的 VEX prefix 形成于两个过时的 32 位指令——使用 DS 的 Load Pointer(LDS-0xC4,3 字节形式)和使用 ES 的 Load Pointer(LES-0xC5, 2 字节形式),它们以 32 位模式加载 DS 和 ES 段寄存器。在 64 位模式中,操作码 LDS 和 LES 生成一个无效操作码异常,但是在英特尔® AVX 下,这些操作码可另外用作编码新指令前缀。最终,VEX 指令只能在 64 位模式中运行时使用。前缀可比之前的 x86 指令编码更多的寄存器,可用于访问新的 256 位 SIMD 寄存器或者使用 3 和 4 操作数语法。作为用户,您无需担心这个问题(除非您正在编写汇编器或反汇编器)。


注:下文假定运算都是在 64 位模式中进行。


SIMD 指令可以在一个单一步骤中处理多个片段的数据,加速许多任务的吞吐量,包括视频编解码、图像处理、数据分析和物理模拟。在 32 位长度(称之为单精度)和64 位长度(称之为双精度)中,英特尔® AVX 指令在IEEE-754浮点值上运行。IEEE-754 是一个标准定义的、可复制的强大浮点运算,是大多数主流数字计算的标准。

较早的相关英特尔® SSE 指令还支持各种带符号和无符号整数大小,包括带符号和无符号字节(B,8 位)、字(W,16 位)、双字(DW,32 位)、四字(QW,64 位)和双四字(DQ,128 位)长度。并非所有指令都适用于所有大小组合,更多详细信息,敬请参阅“更多信息”中提供的链接。请参阅本文后文中的图 2,了解数据类型的图形表示法。

支持英特尔® AVX(和 FMA)的硬件包括 16 个 256 位 YMM 寄存器 YMM0-YMM15 和一个名为 MXCSR的 32 位控制/状态寄存器。YMM 寄存器替代了英特尔® SSE 使用的较早的 128 位 XMM 寄存器,它将 XMM 寄存器视作相应 YMM 寄存器的下层部分,如图 1 所示。

MXCSR 的 0-5 位显示设置“粘滞”位后 SIMD 浮点异常,除非使用位LDMXCSRFXRSTOR清除,否则它们将一直保持设置。设置时 7-12 位屏蔽个体异常,可通过启动进行初始设置或重置。0-5 位分别显示为无效运算、非法、被零除、溢出和精度。如欲获取详细信息,请参阅“更多信息”部分提供的链接。

 

 

 

图 1. XMM 寄存器覆盖 YMM 寄存器。


图 2 显示了英特尔® SSE 和英特尔® AVX 指令中使用的数据类型。对于英特尔® AVX,允许使用增加至 128 或 256 位的 32 位或 64 位浮点类型的倍数以及增加至 128 位的任意整数类型的倍数。

图 2.英特尔® AVX 和英特尔® SSE 数据类型

 

指令通常分为标量版本和矢量版本,如图 3 所示。矢量版本通过将数据以并行“SIMD”模式在寄存器中处理进行运算;而标量版本则只在每个寄存器的一个条目中进行运算。这一区别减少了某些算法中的数据移动,提供了更加出色的整体吞吐量。

图 3. SIMD 与标量运算

 

当数据以 n 字节内存界限上存储的 n 字节块进行运算时,数据为内存对齐数据。例如,将 256 位数据加载至 YMM 寄存器中时,如果数据源为 256 位对齐,则数据被称为“对齐”.

对于英特尔® SSE 运算,除非明确规定,否则都需要内存对齐。例如,在英特尔® SSE 下,有针对内存对齐和内存未对齐运算的特定指令,如MOVAPD(移动对齐的紧缩双精度值)和 MOVUPD(移动非对齐的紧缩双精度值)指令。没有像这样分为两个的指令需要执行对齐访问。

英特尔® AVX 已经放宽了某些内存对齐要求,因此默认情况下,英特尔® AVX 允许未对齐的访问;但是,这样的访问将导致性能下降,因此旨在要求数据保持内存对齐的原规则仍然是不错的选择(面向 128 位访问的 16 位对齐和面向 256 位访问的 32 位对齐)。主要例外是明确指出需要内存对齐数据的 SSE 指令的VEX 扩展版本:这些指令仍然要求使用对齐的数据。其他要求对齐访问的特定指令请参阅英特尔® 高级矢量扩展指令集编程指南中的表2.4(请参阅“更多信息”中提供的链接)。

除了未对齐数据问题外,另外一个性能问题是混合使用旧的仅 XMM 的指令和较新的英特尔® AVX 指令会导致延迟,因此需要最大限度地控制 VEX 编码指令和旧的英特尔® SSE 代码之间的转换。也就是说,不要将 VEX 前缀的指令和非 VEX 前缀的指令混合使用,以实现最佳吞吐量。如果您非要这么做,请对同一 VEX/非 VEX 级别的指令进行分组,最大限度地控制二者之间的转换。此外,如果上层 YMM 位通过 VZEROUPPERVZEROALL设置为零(编译器应自动插入),则无转换损失。该插入要求另外一个指令,因此推荐使用分析 (profiling)。

英特尔® AVX 指令类

如上所述,英特尔® AVX 增加了对许多新指令的支持并将当前的英特尔® SSE 指令扩展至新的 256 位寄存器,大部分旧的英特尔® SSE 指令都具有一个 V 前缀的英特尔® AVX 版本,以访问新的寄存器容量和 3 操作数形式。根据指令的计算方式,新英特尔® AVX 指令的数量多达几百个。

例如,旧的 2 操作数英特尔® SSE 指令ADDPS xmm1、xmm2/m128现在可以使用 VADDPS ymm1、ymm2、ymm3/m256 形式以 3 操作数语法表示为 VADDPS xmm1、xmm2、xmm3/m128 或者 256 位寄存器。少数指令还支持 4 操作数,例如 VBLENDVPS ymm1、ymm2、ymm3/m256、ymm4 ,在一定条件下在 ymm4 中根据掩码将单精度浮点值由 ymm2 ymm3/m256 复制到 ymm1 。这是在之前的形式上进行了改进,其中 xmm0 为隐式需求,要求编译器解放 xmm0 。现在所有寄存器都明确可见,寄存器的分配有了更大的自由度。此处, m128 是一个 128 位内存位置, xmm1 是一个 128 位寄存器,以此类推。

有些新指令仅限 VEX(非英特尔® SSE 扩展指令),包括许多将数据移进或移出 YMM 寄存器的方法。以 VBROADCASTS[S/D] 为例,它将一个单一值加载至 XMM 或 YMM 寄存器的所有元素中,并提供了多种使用 VPERMILP[S/D] 将数据移至一个寄存器的方法。(方括号中的内容请参阅附录 A。)

英特尔® AVX 添加了算法指令,以使变量对单精度和双精度紧缩和标量浮点数据进行加、减、乘、除、平方根、比较、最小值、最大值和约数的运算。许多新的条件判定对于 128 位英特尔® SSE 也非常有用,提供了32 种比较类型。英特尔® AVX 还包括从之前的SIMD 中获得的指令,包括逻辑、混合、转换、测试、紧缩、解紧缩、移动、加载和存储。工具集还添加了新指令,包括非跳跃式获取(将单数据或多数据传播至 256 位目标,屏蔽移动基元进行有条件的加载和存储)、向 256 位 SIMD 寄存器中插入多 SIMD 数据或者从中提取多 SIMD 数据、在一个寄存器内转换基元进行数据处理、分支处理以及紧缩测试指令。


未来添加
英特尔® AVX 手册还列出了某些未来可能会使用到的指令,此处并未完全列出,有待补充。此处并不确保这些指令都如编写的那样可以实现。

预留两个指令(VCVTPH2PS VCVTPS2PH ),用于支持 16 位浮点转换为单和双浮点类型或者从中转换。16 位格式称之为半精度,具有一个 10 位尾数(非反向规格化数有一个隐含的以 1 开头的数,导致 11 位精度)、5 位指数(偏差 15)和 1 位符号。

拟定的 RDRAND 指令使用一个具有密码的安全硬件数字随机位生成器,为 16 位、32 位和 64 位寄存器生成随机数。成功后,进位标识被设置为 1 (CF=1 )。如果没有足够的熵值可用,进位标识将被清除 (CF=0 )。

最后,有四个指令(RDFDBASE、RDGSBASE、WRFSBASE 和 WRGSBASE)可在 64 位模式中以全部权限等级读取和写入 FS 和 GS 寄存器。

另外,以后还会添加 FMA 指令,执行类似 A = + A * B + C 的运算,右侧的加号 (+) 都可以变更为减号 (?),而且右侧的三个操作数顺序可以随意发生变化。还有交叉加法和减法形式。紧缩 FMA 指令可以执行具有 256 位矢量的 8 个单精度 FMA 运算或者 4 个双精度 FMA 运算。

A = A * B + C 这类的 FMA 运算要优于每次执行一个步骤,因为中间结果被视为无限精度,会在存储上执行约数计算,因此计算更为精确。这一单个约数是为“融合”前缀提供的。它们也比按步骤执行运算的速度要快。

每个指令对于操作数 A、B 和 C 都有三种形式的顺序,每个顺序对应一个 3 位扩展:形式 132执行 A = AC + B,形式 213执行 A = BA + C,形式 231执行 A = BC + A。顺序数仅代表表达式右侧操作数的顺序。

可用性与支持

在硬件中检测英特尔® AVX 特性的可用性需要使用 CPUID 指令在 CPU 和操作系统中查询支持,稍后会做详细说明。2011 年第一季度推出的第二代英特尔® 酷睿™ 处理器(代号为 Sandy Bridge 的英特尔® 微架构)是英特尔首款支持英特尔® AVX 技术的处理器。这些处理器没有新的 FMA 指令。为了能够在没有硬件支持的情况下进行开发和测试,免费的英特尔® 软件开发仿真器(请参阅“更多信息”中提供的链接)提供了对这些特性的支持,包括英特尔® AVX、FMA、PCLMULQDQ 和 AES 指令。

为了能够在大多数设置中可靠地使用英特尔® AVX 扩展指令集,操作系统必须支持在线程环境切换中保存和加载新的寄存器(采用 XSAVE/XRSTOR),以预防数据损坏。为了避免出现此类错误,从支持英特尔® AVX 感知环境切换的操作系统明确地设置一个 CPU 位,以支持新的指令;否则,在使用英特尔® AVX 指令时,会生成一个未定义的操作码 (#UD) 异常。

带有 Service Pack 1 (SP1) 的 Microsoft Windows* 7 和带有 SP1 的 Microsoft Windows* Server 2008 R2(32 位和 64 位版本)以及更高版本的 Windows* 都支持英特尔® AVX 在线程和进程切换中进行保存和恢复。Linux* 内核 2.6.30(2009 年6 月)及更高版本也支持英特尔® AVX。

检测可用性与支持
对英特尔® AVX、FMA、AES 和 PCLMULQDQ 四个领域进行支持检测的步骤是类似的,都包括检查相应特性的硬件和操作系统支持(请参阅表 1)。包括以下步骤(计算位是从位 0 开始):

  1. 使用 CPUID.1:ECX.OSXSAVE bit 27 = 1 确认操作系统支持 XGETBV
  2. 同时,确认支持 CPUID.1:ECX bit 28=1 (支持英特尔® AVX)和/或 bit 25=1 (支持 AES)和/或 bit 12=1 (支持 FMA)和/或 bit 1=1 (PCLMULQDQ)。
  3. 发出 XGETBV ,并验证在位 1 和位 2 处特性支持的掩码是 11b(操作系统支持 XMM 状态和 YMM 状态)

表 1.特性检测掩码

FeatureBits to checkConstant
英特尔® AVX28,、27018000000H
VAES28,、27, and 2501A000000H
VPCLMULQDQ28、 27, and 1018000002H
FMA28,、27, and 12018001000H


条目 1 中提供了实施该进程的样例代码,其中 CONSTANT 是表 1 中的值。稍后将提供 Microsoft* Visual Studio* C++ 内联函数版本。

条目 1.特性检测

INT Supports_Feature()
   {
   ; result returned in eax
   mov eax, 1
   cpuid
   and ecx, CONSTANT
   cmp ecx, CONSTANT; check desired feature flags
   jne not_supported
   ; processor supports features
   mov ecx, 0; specify 0 for XFEATURE_ENABLED_MASK register
   XGETBV; result in EDX:EAX
   and eax, 06H
   cmp eax, 06H; check OS has enabled both XMM and YMM state support
   jne not_supported
   mov eax, 1; mark as supported
   jmp done
   NOT_SUPPORTED:
   mov eax, 0 ; // mark as not supported
   done:
   }
 

用途

在最低的编程级别,大部分常用 x86 汇编器现在都支持英特尔® AVX、FMA、AES 和 VPCLMULQDQ 指令,包括 Microsoft MASM*(Microsoft Visual Studio* 2010 版本)、NASM*、FASM* 和 YASM*。请参阅各自的相关文档,获取详细信息。

对于语言编译器,英特尔® C++ 编译器 11.1 版及更高版本和英特尔® Fortran 编译器都可以通过编译器开关支持英特尔® AVX;而且这两种编译器还支持自动矢量化和浮点循环。英特尔® C++ 编译器支持英特尔® AVX 内联函数(使用 #include 访问内联函数)和内嵌汇编语言,甚至还可以使用 #include "avxintrin_emu.h"支持英特尔® 内联函数模拟。

Microsoft Visual Studio* C++ 2010 (SP1) 及更高版本在编译 64 位置代码(使用 /arch:AVX编译器开关)时支持英特尔® AVX(请参阅“更多信息”)。它使用 标头支持内联函数,但是不支持内嵌汇编语言。MASM*、代码的反汇编视图和寄存器的配置程序视图(完全支持 YMM)中都支持英特尔® AVX。

GNU Compiler Collection* (GCC*) 4.4 版通过同一标头 支持英特尔® AVX 内联函数。Binutils 2.20.51.0.1 及更高版本、gdb 6.8.50.20090915 及更高版本、最新版的 GNU 汇编器 (GAS) 以及 objdump 中还提供了其他 GNU 工具链支持。如果您的编译器不支持英特尔® AVX,您可以在许多情况下发出所需的字节,但是一流的支持能为您带来更多方便。

以上提及的三个 C++ 编译器都可以从 C 或 C++ 代码中使用英特尔® AVX 支持同一内联函数运算,从而简化运算。内联函数是编译器使用相应的汇编函数替换的函数。大部分英特尔® AVX 内联函数的命名都遵循以下格式:
 

_mm256_op_suffix(data_type param1, data_type param2, data_type param3)

其中 _mm256是在新的 256 位寄存器上运行的前缀;_op是运算,类似于加法 add或者减法 sub;而 _suffix则表示运算的数据类型,第一个字母表示紧缩 (p)、扩展紧缩 (ep) 或标量 (s)。表 2 中列出了其余字母所代表的类型。

表 2.英特尔® AVX 后缀标记

MarkingMeaning
[s/d]单精度或双精度浮点
[i/u]nnn位大小 nnn为 128、64、32、16 或 8
[ps/pd/sd]紧缩单精度、紧缩双精度或标量双精度
epi32扩展紧缩 32 位带符号整数
si256标量 256 位整数


表 3 中列出了数据类型。前两个参数是源寄存器,第三个参数(显示时)是一个整数掩码、选择因子或偏移值。

表 3.英特尔® AVX 内联函数数据类型

TypeMeaning
__m256256 位,作为 8 个单精度浮点值,表示一个 YMM 寄存器或内存位置
__m256d256 位,作为 4 个双精度浮点值,表示一个 YMM 寄存器或内存位置
__m256i256 位,作为整数、(字节、字等)
__m128128 位单精度浮点(每个 32 位)
__m128d128 位双精度浮点(每个 64 位)


某些内联函数位于其他标头中,如 中的 AES 和 PCLMULQDQ。查看您的编译器文档或者网站,了解各种内联函数的位置。

Microsoft Visual Studio* 2010
为了简单明了,本文中的以下部分将使用带有 SP1 的 Microsoft Visual Studio* 2010,英特尔® 编译器或 GCC* 上运行的代码与之类似。如果您依次点击 Project Properties > Configuration > Code Generation ,在Enable Enhanced Instruction Set 下选择Not Set ,然后将 /arch:AVX手动添加至 Command Line 条目下的命令行,带有 SP1 的Microsoft Visual Studio* 2010 将自动生成英特尔® AVX 代码。作为使用内联函数的一个实例,条目 2 提供了基于内联函数的英特尔® AVX 特性检测例程。


条目 2.基于内联函数的特性检测

// get AVX intrinsics
#include <immintrin.h>
// get CPUID capability
#include <intrin.h>

// written for clarity, not conciseness
#define OSXSAVEFlag (1UL<<27)
#define AVXFlag     ((1UL<<28)|OSXSAVEFlag)
#define VAESFlag    ((1UL<<25)|AVXFlag|OSXSAVEFlag)
#define FMAFlag     ((1UL<<12)|AVXFlag|OSXSAVEFlag)
#define CLMULFlag   ((1UL<< 1)|AVXFlag|OSXSAVEFlag)

bool DetectFeature(unsigned int feature)
	{
	int CPUInfo[4], InfoType=1, ECX = 1;
	__cpuidex(CPUInfo, 1, 1);       // read the desired CPUID format
	unsigned int ECX = CPUInfo[2];  // the output of CPUID in the ECX register.
	if ((ECX & feature) != feature) // Missing feature
		return false;
	__int64 val = _xgetbv(0);       // read XFEATURE_ENABLED_MASK register
	if ((val&6) != 6)               // check OS has enabled both XMM and YMM support.
		return false;
	return true;
	}
 

Mandelbrot 实例

为了使用新指令进行展示,使用了普通 C/C++ 代码(检查以确认编译器不会将代码转换为英特尔® AVX 指令!)和新的英特尔® AVX 指令(作为内联函数)来计算 Mandelbrot 集图像,对比它们的性能。Mandelbrot 集是在伪代码(如条目 3 所示)中定义的复杂数字上进行的计算密集型运算。


条目 3.Mandelbrot 伪代码

z,p are complex numbers
for each point p on the complex plane
	z = 0
	for count = 0 to max_iterations
		if abs(z) > 2.0
			break
		z = z*z+p
	set color at p based on count reached

常见的图像是位于长方形 (-2,-1) 至 (1,1) 中复杂平面部分之上的。可以通过多种方式着色(不在此做介绍)。提升最大迭代数,放大至其他部分并确定随着时间的推移,值是否会“消失”。

为了突出 CPU,将方框 (0.29768, 0.48364) 放大至 (0.29778, 0.48354),以多种大小计算计数网格并使用最大迭代 4096。充分着色时,最终的计数网格如图 4 中所示。
 

图 4.Mandelbrot 集 (0.29768, 0.48364) 至 (0.29778, 0.48354),采用最大迭代 4096
 


条目 4 中提供了计算迭代数的基本 C++ 实施。相比于 2 的复杂数字的绝对值替换为了相比于 4.0 的范数,通过删除平方根,速度几乎翻倍。对于所有版本,使用单精度浮点将尽可能多的元素紧缩至 YMM 寄存器,速度将更快,但是在以后进行放大后,与双精度相比,精度将降低。


条目 4.简单的 Mandelbrot C++ 代码

 

// simple code to compute Mandelbrot in C++
#include <complex>
void MandelbrotCPU(float x1, float y1, float x2, float y2,
                   int width, int height, int maxIters, unsigned short * image)
{
	float dx = (x2-x1)/width, dy = (y2-y1)/height;
	for (int j = 0; j < height; ++j)
		for (int i = 0; i < width; ++i)
		{
			complex<float> c (x1+dx*i, y1+dy*j), z(0,0);
			int count = -1;
			while ((++count < maxIters) && (norm(z) < 4.0))
				z = z*z+c;
			*image++ = count;
		}
}

针对性能测试多个版本:条目 4 中的基本版(一个类似 CPU 的版本,通过浮点扩展复杂类型);基于内联函数的 SSE 版本以及条目 5 中显示的基于内联函数的英特尔® AVX 版本。在 128×128、256×256、512×512、1024×1024、2048×2048 和 4096×4096 图像尺寸上对所有版本进行测试。每种实施在对更多工作保留了基本指令集限制的同时,性能可能会有所提升,但是它们应该能代表您可以实现的性能。

英特尔® AVX 版本经过精心设计,尽可能适合 16 个 YMM 寄存器。为了能够帮助追踪您希望如何分配它们,变量使用ymm0ymm15进行命名。当然,编译器根据自身准则分配寄存器,但是为了考虑周到,您可以尝试使用这种方式将所有计算放入寄存器中。(实际上,从反汇编开始,编辑器就不能完美地分配它们,在汇编代码中重构它将是学习英特尔® AVX 的一次不错练习。)


条目 5.英特尔® AVX 内联函数 Mandelbrot 实施

float dx = (x2-x1)/width;
float dy = (y2-y1)/height;
// round up width to next multiple of 8
int roundedWidth = (width+7) & ~7UL;

float constants[] = {dx, dy, x1, y1, 1.0f, 4.0f};
__m256 ymm0 = _mm256_broadcast_ss(constants);   // all dx
__m256 ymm1 = _mm256_broadcast_ss(constants+1); // all dy
__m256 ymm2 = _mm256_broadcast_ss(constants+2); // all x1
__m256 ymm3 = _mm256_broadcast_ss(constants+3); // all y1
__m256 ymm4 = _mm256_broadcast_ss(constants+4); // all 1's (iter increments)
__m256 ymm5 = _mm256_broadcast_ss(constants+5); // all 4's (comparisons)

float incr[8]={0.0f,1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f}; // used to reset the i position when j increases
__m256 ymm6 = _mm256_xor_ps(ymm0,ymm0); // zero out j counter (ymm0 is just a dummy)

for (int j = 0; j < height; j+=1)
{
	__m256 ymm7  = _mm256_load_ps(incr);  // i counter set to 0,1,2,..,7
	for (int i = 0; i < roundedWidth; i+=8)
	{
		__m256 ymm8 = _mm256_mul_ps(ymm7, ymm0);  // x0 = (i+k)*dx
		ymm8 = _mm256_add_ps(ymm8, ymm2);         // x0 = x1+(i+k)*dx
		__m256 ymm9 = _mm256_mul_ps(ymm6, ymm1);  // y0 = j*dy
		ymm9 = _mm256_add_ps(ymm9, ymm3);         // y0 = y1+j*dy
		__m256 ymm10 = _mm256_xor_ps(ymm0,ymm0);  // zero out iteration counter
		__m256 ymm11 = ymm10, ymm12 = ymm10;        // set initial xi=0, yi=0

		unsigned int test = 0;
		int iter = 0;
		do
		{
			__m256 ymm13 = _mm256_mul_ps(ymm11,ymm11); // xi*xi
			__m256 ymm14 = _mm256_mul_ps(ymm12,ymm12); // yi*yi
			__m256 ymm15 = _mm256_add_ps(ymm13,ymm14); // xi*xi+yi*yi

			// xi*xi+yi*yi < 4 in each slot
			ymm15 = _mm256_cmp_ps(ymm15,ymm5, _CMP_LT_OQ);
			// now ymm15 has all 1s in the non overflowed locations
			test = _mm256_movemask_ps(ymm15)&255;      // lower 8 bits are comparisons
			ymm15 = _mm256_and_ps(ymm15,ymm4);
			// get 1.0f or 0.0f in each field as counters
			// counters for each pixel iteration
			ymm10 = _mm256_add_ps(ymm10,ymm15);

			ymm15 = _mm256_mul_ps(ymm11,ymm12);        // xi*yi
			ymm11 = _mm256_sub_ps(ymm13,ymm14);        // xi*xi-yi*yi
			ymm11 = _mm256_add_ps(ymm11,ymm8);         // xi <- xi*xi-yi*yi+x0 done!
			ymm12 = _mm256_add_ps(ymm15,ymm15);        // 2*xi*yi
			ymm12 = _mm256_add_ps(ymm12,ymm9);         // yi <- 2*xi*yi+y0

			++iter;
		} while ((test != 0) && (iter < maxIters));

		// convert iterations to output values
		__m256i ymm10i = _mm256_cvtps_epi32(ymm10);

		// write only where needed
		int top = (i+7) < width? 8: width&7;
		for (int k = 0; k < top; ++k)
			image[i+k+j*width] = ymm10i.m256i_i16[2*k];

		// next i position - increment each slot by 8
		ymm7 = _mm256_add_ps(ymm7, ymm5);
		ymm7 = _mm256_add_ps(ymm7, ymm5);
	}
	ymm6 = _mm256_add_ps(ymm6,ymm4); // increment j counter
}

所有版本的完全代码和 Microsoft Visual Studio* 2010 (SP1) 项目(包括测试用具)的更多信息,请参阅“更多信息”部分提供的链接。

结果如图 5 和图 6 所示。为了避免太多数字受缚于特定的 CPU 速度,图 5 显示了每个版本相对应的 CPU 版本的性能,展示了算法的一个简单非 SIMD C/C++ 实施。按照预计,英特尔® SSE 版本总共执行 4 次,因为每通道执行 4 像素;而英特尔® AVX 版本和 CPU 版本一样,总共执行 8 次。由于循环、内存访问、非最佳指令顺序和其他因素都需要开销,提高 4 倍和 8 倍应该最佳,因此首次尝试时相当不错。


图 5.不同大小的相对性能


图 6 中的第二个图表显示每毫秒计算的像素对于每单位大小来说是不变的;此外,算法显示从 CPU 到英特尔® SSE 版本的性能提升了四倍,而从英特尔® SSE 到英特尔® AVX 版本的性能提升了两倍。


图 6.不同大小的绝对性能

 

结论

本文提供了新的英特尔® 高级矢量扩展指令集(英特尔® AVX)的中级概述。这些扩展指令集与之前的英特尔® SSE 指令类似,但是提供了更大的寄存器空间并添加了新的指令。Mandelbrot 实例显示了与之前的技术相比所提升的性能比率。有关详细信息,请查看“英特尔® 高级矢量扩展指令集编程指南”(请在“更多信息”部分查找该文件的链接)。

编程快乐!

更多信息

英特尔® 高级矢量扩展指令集编程指南: http://redfort-software.intel.com/en-us/avx/

联邦信息处理标准出版物 197,“发布高级加密标准”:http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf

The IEEE 754-2008 floating-point format standard at http://en.wikipedia.org/wiki/IEEE_754-2008

IEEE 754-2008 浮点格式标准:http://en.wikipedia.org/wiki/IEEE_754-2008

64 位驱动程序浮点支持:http://msdn.microsoft.com/en-us/library/ff545910.aspx

Mandelbrot 集的维基百科条目:http://en.wikipedia.org/wiki/Mandelbrot_set

英特尔® 软件开发仿真器:http://redfort-software.intel.com/en-us/articles/intel-software-development-emulator

下载完整的 Mandelbrot 英特尔® AVX 实施:http://www.lomont.org/

 

 

作者简介

Chris Lomont 是 Cybernet Systems 的一名研发工程师,曾参与过量子计算算法、NASA 图像处理、美国国土安全部门安全软件的开发和计算机取证分析等项目。他拥有普渡大学的博士学位,此外还拥有物理学、数学和计算机科学的学士学位。作为一名游戏程序员,他还短期从事过金融建模、机器人制造和各种咨询工作。他在业余时间喜欢与妻子一起徒步旅行,还爱好看电影、做专题座谈、娱乐性编程、数学研究、研究物理、听音乐和做各种实验。您可以访问他的个人网站:www.lomont.org或者他的电子设备网站:http://www.hypnocube.com/

 

 

附录 A:指令集参考

许多指令都是紧缩或标量形式,即它们在寄存器的多个并行元素或者一个单一元素上执行——标记为 [P/S]。条目长度分为双精度或单精度浮点(简称为双精度单精度),标记为 [D/S];整数形式分为字节、字、双字和四字,标记为 [B/W/D/Q]。整数形式有时还分为带符号形式和无符号形式,标记为 [S/U] 。有些指令在寄存器的高区或低区运行,标记为 [H/L] ;下文的表格中提供了其他可选元素。英特尔® SSE 形式和英特尔® AVX 形式中的指令以英特尔® AVX 形式的 (V) 为前缀,支持 3 操作数和 256 位寄存器。方括号 ( []) 中的条目为必选;圆括号 ( ()) 中的条目为可选。

范例:

 

  • (V)ADD[P/S][D/S]是紧缩或标量、双精度或单精度相加,有 8 种可能的形式——VADDPD, VADDPS, VADDSD, VADDSS, 和不以 V开头的版本。
  • (V)[MIN/MAX][P/S][D/S]表示最大或最小双精度或单精度紧缩或标量的 16 种不同指令。

下一表格列出了多个比较类型。VEX 前缀的指令具有 32 个比较类型;非 VEX 前缀的比较仅支持圆括号中的 8 个类型。每个比较类型分为多种形式,其中O = 有序的、U = 无序的、S = 发信号、Q = 不发信号。有序/无序表示如果一个操作数是 NaN(浮点中的非数),比较是 false 还是 true,在计算过程中出现某些错误时会发生该情形,如被 0 除或者负数的平方根。发信号/不发信号表示至少一个操作数是 QnaN(用于错误捕获的静态非数)时是否会出现一个异常。

 

 

 

TypeFlavorsMeaning
EQ(OQ), UQ, OS, US等于
LT (OS), OQ小于
LE (OS), OQ小于等于
UNORD (Q), S无序测试 (NaN)
NEQ (UQ), US, OQ, OS不等于
NLT (US), UQ不小于
NLE (US), UQ不小于等于
ORD (Q), S有序测试 (非 NaN)
NGE US, UQ不大于等于
NGT US, UQ不大于
FALSE OQ, OS比较一直是 false
GE OS, OQ大于等于
GT OS, OQ大于
TRUEUQ, US比较一直是 true


最后,我们在此提供了所有英特尔® AVX 指令:

 

 

 

 

ArithmeticDescription
(V)[ADD/SUB/MUL/DIV][P/S][D/S]加/减/乘/除紧缩/标量双精度/单精度
(V)ADDSUBP[D/S]紧缩双精度/单精度加减交互指数
(V)DPP[D/S]点积,基于即时任务
(V)HADDP[D/S]水平相加
(V)[MIN/MAX][P/S][D/S]最小/最大紧缩/标量双精度/单精度
(V)MOVMSKP[D/S]双精度/单精度符号掩码开方
(V)PMOVMSKB生成包括大部分重要位的掩码
(V)MPSADBW多个绝对差值求和
(V)PABS[B/W/D]字节/字/双字上的紧缩绝对值
(V)P[ADD/SUB][B/W/D/Q]加/减紧缩字节/字/双字/四字
(V)PADD[S/U]S[B/W]紧缩带符号/无符号加饱和字节/字
(V)PAVG[B/W]平均紧缩字节/字
(V)PCLMULQDQCarry-less 乘法四字
(V)PH[ADD/SUB][W/D]紧缩垂直加/减字/双字
(V)PH[ADD/SUB]SW紧缩垂直加/减饱和
(V)PHMINPOSUW最小垂直无符号字和位置
(V)PMADDWD乘加紧缩整数
(V)PMADDUBSW无符号字节和带符号字节乘以带符号字
(V)P[MIN/MAX][S/U][B/W/D]最小/最大紧缩带符号/无符号整数
(V)PMUL[H/L][S/U]W乘以紧缩带符号/无符号整数和存储高区/低区结果
(V)PMULHRSW使用约数和移位乘以紧缩无符号
(V)PMULHW乘以紧缩整数和存储高区结果
(V)PMULL[W/D]乘以紧缩整数和存储低区结果
(V)PMUL(U)DQ乘以紧缩带符号/无符号双字整数和存储四字
(V)PSADBW计算无符号字节绝对差值总和
(V)PSIGN[B/W/D]根据其他操作数上的符号更改一个操作数中每个元素的符号
(V)PS[L/R]LDQ操作数中字节左/右移位量
(V)SL[L/AR/LR][W/D/Q]位左移/算法右移/逻辑右移
(V)PSUB(U)S[B/W]紧缩带符号/无符号减去带符号/无符号饱和
(V)RCP[P/S]S计算紧缩/标量单精度的近似倒数
(V)RSQRT[P/S]S计算紧缩/标量单精度平方根的近似倒数
(V)ROUND[P/S][D/S]紧缩/标量双精度/单精度的约数
(V)SQRT[P/S][D/S]紧缩/标量双精度/单精度的平方根
VZERO[ALL/UPPER]将 YMM 寄存器的全部/上层归零

 

 

 

ComparisonDescription
(V)CMP[P/S][D/S]比较紧缩/标量双精度/单精度
(V)COMIS[S/D]比较标量双精度/单精度,设置 EFLAGS
(V)PCMP[EQ/GT][B/W/D/Q]比较紧缩整数等于/大于
(V)PCMP[E/I]STR[I/M]比较显式/隐式长度字符串,返回指数/掩码

 

 

ControlDescription
V[LD/ST]MXCSR加载/存储 MXCSR 控制/状态寄存器
XSAVEOPT保存优化的处理器延伸状态

 

 

ConversionDescription
(V)CVTx2y将类型 x转换为类型 y,其中 xy从以下选择:
DQ 和 P[D/S],
[P/S]S 和[P/S]D, or
S[D/S] 和 SI.

 

 

Load/storeDescription
VBROADCAST[SS/SD/F128]通过传播进行加载(将单个数值加载到多个位置)
VEXTRACTF128128 位浮点值开方
(V)EXTRACTPS紧缩单精度开方
VINSERTF128插入紧缩浮点值
(V)INSERTPS插入紧缩单精度值
(V)PINSR[B/W/D/Q]插入整数
(V)LDDQU移动四倍未对齐整数
(V)MASKMOVDQU使用非暂时提示NT Hint存储双四字中的指定字节
VMASKMOVP[D/S]有条件的 SIMD 紧缩加载/存储
(V)MOV[A/U]P[D/S]移动对齐/未对齐的紧缩双精度/单精度
(V)MOV[D/Q]移动双字/四字
(V)MOVDQ[A/U]移动对齐/未对齐的双字至四字
(V)MOV[HL/LH]P[D/S]移动高区到低区/低区到高区的紧缩双精度/单精度
(V)MOV[H/L]P[D/S]移动高区/低区的紧缩双精度/单精度
(V)MOVNT[DQ/PD/PS]使用非暂时提示移动紧缩整数/双精度/单精度
(V)MOVNTDQA使用对齐的非暂时提示移动紧缩整数
(V)MOVS[D/S]移动或合并标量双精度/单精度
(V)MOVS[H/L]DUP移动单个奇/偶指数的单精度
(V)PACK[U/S]SW[B/W]在字节/字上对无符号/带符号饱和进行紧缩
(V)PALIGNR字节对齐
(V)PEXTR[B/W/D/Q]整数开方
(V)PMOV[S/Z]X[B/W/D][W/D/Q]使用带符号/零扩展紧缩移动(仅根据长度,不支持 DD、DW 等)

 

 

LogicalDescription
(V)[AND/ANDN/OR]P[D/S]紧缩双精度/单精度值的位逻辑 AND/AND NOT/OR
(V)PAND(N)逻辑AND (NOT)
(V)P[OR/XOR]位逻辑 logical OR/exclusive OR
(V)PTEST紧缩位测试,如果位逻辑 AND为 all 0,则设置零标记
(V)UCOMIS[D/S]无序比较标量双精度/单精度并设置EFLAGS
(V)XORP[D/S]紧缩双精度/单精度的位逻辑 XOR

 

 

ShuffleDescription
(V)BLENDP[D/S]混合紧缩双精度/单精度,基于掩码选择元素
(V)BLENDVP[D/S]混合值
(V)MOVDDUP向所有值中复制偶数值
(V)PBLENDVB变量混合紧缩字节
(V)PBLENDW混合紧缩字
VPERMILP[D/S]转换双精度/单精度值
VPERM2F128转换浮点值
(V)PSHUF[B/D]根据即时值移动紧缩字节/双字
(V)PSHUF[H/L]W移动紧缩高区/低区字
(V)PUNPCK[H/L][BW/WD/DQ/QDQ]解紧缩高区/低区数据
(V)SHUFP[D/S]移动紧缩双精度/单精度
(V)UNPCK[H/L]P[D/S]解紧缩和交错紧缩变量双精度/单精度值

 

 

AESDescription
AESENC/AESENCLAST执行一轮 AES 加密
AESDEC/AESDECLAST执行一轮 AES 解密
AESIMC执行 AES InvMixColumn变换
AESKEYGENASSISTAES 次轮密钥生成协助

 

 

Future InstructionsDescription
[RD/WR][F/G]SBASE读/写 FS/GS 寄存器
RDRAND读取随机数(至 r16、r32、r64)
VCVTPH2PS将 16 位浮点值转换为单精度浮点值
VCVTPS2PH将单精度值转换为 16 位浮点值

 

 

FMAEach [z] is the string 132 or 213 or 231, giving the order the operands A,B,C are used in:
132 is A=AC+B
213 is A=AB+C
231 is A=BC+A
VFMADD[z][P/S][D/S]面向双精度/单精度紧缩/标量的融合乘加 A = r1 * r2 + r3
VFMADDSUB[z]P[D/S]融合乘交互加/减紧缩双精度/单精度 A = r1 * r2 + r3(奇指数),A = r1 * r2-r3(偶指数)
VFMSUBADD[z]P[D/S]融合乘交互减/加紧缩双精度/单精度 A = r1 * r2 - r3(奇指数),A = r1 * r2+r3(偶指数)
VFMSUB[z][P/S][D/S]面向双精度/单精度值紧缩/标量的融合乘减 A = r1 * r2 - r3
VFNMADD[z][P/S][D/S]紧缩/标量双精度/单精度的融合负数乘加 A = -r1 * r2+r3
VFNMSUB[z][P/S][D/S]紧缩/标量双精度/单精度的融合负数乘减 A = -r1 * r2-r3

 

如欲了解有关编译器优化的更多完整信息请参阅我们的优化声明

面向机器学习和深度学习的英特尔优化工具和框架

$
0
0

本文介绍了面向机器学习和深度学习的英特尔优化工具和框架,还展示了集成至上述优化工具和框架的英特尔库(有助于充分利用优化工具和框架,在英特尔® 架构上实现最佳性能)。这些信息对初次使用的用户、数据科学家和机器学习工作人员非常实用,能够帮助他们快速了解英特尔优化工具和框架。

简介

机器学习 (ML) 属于一般意义上的人工智能 (AI),基于一系列用于数据分析的算法。深度学习 (DL) 是一项专门的机器学习技术,基于一系列算法,这些算法利用包含多个处理层的图,模拟高级别的数据抽象(https://en.wikipedia.org/wiki/Deep_learning)。

如今,机器学习,尤其是深度学习,在应用和行业中得到了越来越广泛的应用,如图像和视频识别/分类、面部检测、自然语言处理和财务预测。

英特尔机器学习和深度学习优化框架是利用深度学习的最简单的方法。使用英特尔优化工具和框架训练、部署深度学习,将确保这些工具以最高效的方式利用英特尔® 架构。以下链接显示了面向英特尔架构优化框架的实例,还提供了优化框架速度提升(相比于未经优化的框架)的表格,https://software.intel.com/zh-cn/ai/deep-learning

(请访问http://itpeernetwork.intel.com/myth-busted-general-purpose-cpus-cant-tackle-deep-neural-network-training/

http://itpeernetwork.intel.com/myth-busted-general-purpose-cpus-cant-tackle-deep-neural-network-training-part-2/获取实例)。

从图中我们可以发现,英特尔机器学习和深度学习解决方案堆栈跨越不同的层。在硬件上开发的高度优化数学库支持以最高效的方式利用若干英特尔® 处理器产品家族。这些优化的数学库为更高级别的工具和框架提供了基础,帮助解决不同领域的机器学习和深度学习问题。

我们将在下一部分简要总结用于优化框架的英特尔库和工具。尽管这些工具和库用于优化面向英特尔框架的机器学习和深度学习框架,也可以将其应用于其他需要高度优化数值例程的应用或软件包,便于它们利用英特尔® 硬件的矢量化、多线程和分布式计算功能。

面向机器学习和深度学习的英特尔® 软件工具

英特尔正积极与开源社区合作,面向英特尔架构优化现有的和全新的框架,还借助库的强大功能,优化机器学习和深度学习工具,这些库通过构建模块加速任务。

英特尔开发了 3 个在英特尔上架构上运行的高度优化的库。

  • 英特尔® 数学核心函数库(英特尔® MKL)(https://software.intel.com/zh-cn/intel-mkl) 提供一系列面向深度学习的高度优化性能基元 (https://software.intel.com/zh-cn/node/684759)。这个库还包括高度优化(矢量化和线程化)的功能,使每个英特尔® 处理器产品家族达到最高性能。这些功能针对单核矢量化和高速缓存内存利用率而优化,实现多核与众核处理器的自动并行性。

    英特尔 MKL 为常见的数学库(如 BLAS、LAPACK 和 FFTW)提供标准 C 和 Fortran API,无需更改代码。重新连接应用后,英特尔 MKL 将使每个英特尔处理器产品家族的性能达到最高。以最小的付出实现深度学习应用的强大性能。

    英特尔 MKL 面向最新版英特尔处理器而优化,包括英特尔® 至强处理器和英特尔® 至强融核™ 处理器。尤其是面向英特尔® 高级矢量扩展指令集 2 和英特尔® 高级矢量扩展指令集 512 ISA 进行了优化。

    英特尔® MKL 库可以通过 Community Libraries 项目免费下载(https://software.intel.com/sites/campaigns/nest/)。
     
  • 面向深度神经网络的英特尔® 数学核心函数库(英特尔® MKL-DNN)(https://01.org/mkl-dnn)是一款面向深度学习应用的开源性能库,用于实现英特尔架构的最高性能。

    它提供了经过优化的深度神经网络基元,能够快速地集成深度学习框架。鼓励社区开发人员开发新的功能,并在推出英特尔 MKL 版本前,快速应用该功能。因此,深度学习科学家和软件开发人员都能够为这个开源库贡献出自己的力量,并从中受益。
     
  • 英特尔® 数据分析加速库是一款性能库,由高度优化的算法构建模块构成,适用于所有的数据分析阶段(预处理、转换、分析、建模、验证和决策制定)。专门用于常见的数据平台,包括 Hadoop*、Spark*、R* 等,能够提高数据访问的效率。通过英特尔® 性能库社区许可,可以免费获取该库 (https://software.intel.com/sites/campaigns/nest/)。
     

深度学习框架

英特尔机器学习和深度学习优化框架利用上述库的功能,支持利用英特尔处理器高效地执行训练和推断。

英特尔正积极将数学库集成至各种框架,使这些框架的用户可以在英特尔处理器上高效地运行深度学习训练和推断任务。例如,英特尔® Caffe* 分发包和英特尔® Theano* 优化包集成了最新版英特尔 MKL。英特尔正将多模功能集成至这些框架,以在多个节点间分配训练工作负载,减少总体训练时间。

以下结构图显示了上述不同的库和框架之间的交互,以及如何在若干优化库中将英特尔 MKL 和英特尔 MKL-DNN 库用作构建模块。

深度学习技术的使用包含两个主要步骤:

  • 训练:在这个步骤中,我们尝试基于标记数据(如标记图像)创建模型
  • 推断(又称评分):模型创建成功后,将被用于数据预测(例如,在未标记的图像中发现对象)

运行于英特尔架构上的英特尔机器学习和深度学习优化框架将实现两个步骤的最高性能。

由于深度学习任务(训练和推断)需要大量的计算,因此,利用针对基础硬件优化的框架和工具来完成深度学习任务,这点非常重要。虽然许多常见的深度学习框架(如 Caffe、Theano 等)属于开源软件,但是没有经过优化,无法在英特尔架构上高效运行。只有运行经过英特尔优化的框架版本,才能在英特尔架构上实现最佳性能。

不管您是想要学习机器学习和深度学习的新手,还是执行特定机器学习或深度学习任务的数据科学家,都可以通过使用英特尔优化框架而获益。探索英特尔优化工具的最佳方式是访问面向人工智能的英特尔® 开发人员专区门户,https://software.intel.com/ai,通过该门户,您将更详细地了解支持人工智能的英特尔® 技术。

如欲下载英特尔优化框架,并安装文档和训练,请访问 https://software.intel.com/ai/deep-learning

该网页提供下载优化框架所需的 GitHub* 页面链接,以及多种文档、视频和示例的链接。

如果您是一名软件开发人员,并对创建或优化个人工具和框架感兴趣,可以查看英特尔现代代码工程师专家优化常用框架的实例。其中一个实例可以通过以下链接获取 https://software.intel.com/videos/getting-the-most-out-of-ia-using-the-caffe-deep-learning-framework

您将从中了解如何利用现代代码技术优化常见的 Caffe* DL 框架,也可以通过这些技术,分析和优化机器学习和深度学习工具或框架,在英特尔架构上实现前所未有的高效性。

除了英特尔优化框架以外,英特尔还发布了一款深度学习 SDK,它是一种集成环境,支持用户实时查看深度学习过程的不同方面,并能直观地表示深度学习模型。英特尔计划继续开发这款面向深度学习的高级工具。如欲获取新工具的更多信息,请访问 https://software.intel.com/zh-cn/deep-learning-sdk

结论

数据分析(尤其是机器学习和深度学习)的使用为许多行业带来了更大的竞争优势。如今,机器学习和深度学习工具的开发节奏不断加快,利用面向硬件优化与调试的工具和框架,对机器学习从业人员和数据科学家来说非常重要。这是因为,优化这些工具和框架需要花费大量的时间和资源;而使用未经优化的工具,将延长处理时间,导致失去竞争优势。英特尔正积极与开源社区合作,优化机器学习和深度学习工具与框架,支持用户以最小的付出在英特尔架构上实现最佳性能,如欲利用英特尔优化工具,满足机器学习与深度学习的需求,请访问 https://software.intel.com/zh-cn/ai

开始使用英特尔® 机器学习扩展库

$
0
0

简介

英特尔® 机器学习扩展库(英特尔® MLSL)能够高效地实施深度学习中使用的通信模式。它针对深度学习框架开发人员设计,可帮助他们从项目扩展中受益。

英特尔 MLSL 的部分特性包括:

  • 基于 MPI 构建,支持使用其它通信库
  • 经过专门的优化,可以提高通信模式的可扩展性
  • 支持各种互连结构:英特尔® Omni-Path 架构、InfiniBand* 和以太网
  • 使用通用 API 支持深度学习框架(Caffe*、Theano*、Torch* 等)

安装

下载英特尔® MLSL 软件包

  1. 转至https://github.com/01org/MLSL/releases并下载:
     
    • intel-mlsl-devel-64-<version>.<update>-<package>.x86_64.rpm用于 root 安装,或者
    • l_mlsl_p_<version>.<update>-<package>.tgz用于用户安装。
  2. 在相同的页面上,下载源代码压缩文件(.zip.tar.gz)。该压缩文件包含 LICENSE.txtPUBLIC_KEY.PUB文件。PUBLIC_KEY.PUB对于 root 安装是必须的。

系统要求

操作系统

  • Red Hat* Enterprise Linux* 6 或 7
  • SuSE* Linux* Enterprise Server 12

编译器

  • GNU*:C, C++ 4.4.0 或更高版本
  • 英特尔® C/C++ 编译器 16.0 或更高版本

安装英特尔® MLSL

英特尔® MLSL 软件包包含英特尔 MLSL 软件开发套件 (SDK) 和英特尔® MPI 库运行时组件。按照下面的步骤安装软件包。

Root安装

  1. 作为root登录。
  2. 安装软件包:
     
    rpm --import PUBLIC_KEY.PUB
    rpm -i intel-mlsl-devel-64-<version>.<update>-<package>.x86_64.rpm

    在软件包名称中,<version>.<update>-<package>代表字符串,例如 2017.1-009

英特尔 MLSL 将会安装在 /opt/intel/mlsl_<version>.<update>-<package>

用户安装

  1. 将软件包提取至目标文件夹:
     
    tar -xvzf l_mlsl_p_<version>.<update>-<package>.tgz -C /tmp/
  2. 运行 install.sh脚本并按照说明操作。
     
    ./install.sh

英特尔 MLSL 将会安装在 $HOME/intel/mlsl_<version>.<update>-<package>

开始使用

成功安装产品后,您可以使用其全部功能。

如欲了解英特尔 MLSL 如何工作,以及如何使用库 API,建议构建并启动随英特尔 MLSL 提供的示例应用。示例应用模拟了深度学习框架的运行,同时大量使用英特尔 MLSL API 以实现并行化。

按照下面的步骤构建并启动示例应用:

  1. 设置英特尔 MLSL 环境:
    source <install_dir>/intel64/bin/mlslvars.sh
  2. 构建 mlsl_test.cpp:
    cd <install_dir>/test
    make
  3. 启动 mlsl_test二进制,mpirun为所需的的节点数量 (N)。mlsl_test包含两个参数:
    • num_groups– 定义并行化的类型,基于以下逻辑:
      • num_groups == 1– 数据并行化
      • num_groups == N– 模式并行化
      • num_groups > 1 and num_groups < N– 混合并行化
    • dist_update– 支持分布式权重更新

启动命令示例:

# use data parallelism
mpirun –n 8 -ppn 1 ./mlsl_test 1
# use model parallelism
mpirun –n 8 -ppn 1 ./mlsl_test 8
# use hybrid parallelism, enable distributed weight update
mpirun –n 8 -ppn 1 ./mlsl_test 2 1

应用实施英特尔 MLSL 的标准工作流。如欲获得详细的示例说明,以及通用的分布式工作流和 API 参考,请访问随英特尔 MLSL 提供的 开发人员指南和参考

物联网产品开发路径:制造一台智能售货机

$
0
0

为了展示利用云数据分析开发的、用于零售的快速产品开发路径解决方案,利用英特尔® 物联网开发人员套件和 Grove* 商用物联网开发人员套件创建了一个概念验证,并利用英特尔® 物联网网关、工业传感器、英特尔® 物联网网关软件套件、英特尔® System Studio 和 Microsoft Azure*,将其扩展为一项工业解决方案。该解决方案监控售货机的库存、产品销售和维护。网关收集来自温度传感器、步进电机、线圈开关和产品购买应用的数据,并将其用于边缘数据分析。

本文包含智能售货机原型的创建概述。如欲获取操作指南,请访问物联网产品开发路径:如何创建一台智能售货机

请访问 GitHub*,获取该项目的最新代码示例和文档。

 

物联网 (IoT) 的关键机遇源于为日常设备添加智能化功能,作为改善设备操作、提高业务操作的效率和效益的手段。例如,售货机无处不在,非常常见,这种配有硬币或货币识别器的机器为各种类型的零售商带来可观的潜在收入来源。正因如此,近几年售货机提供的货物范围大幅扩大,包括机场和其他场所普遍销售的消费电子产品。

图 1.完整的智能售货机。

相比其他零售点,售货机有其独有的优势,它们每天 24 小时,全年 365 运行,且无需收银员。此外,它们为分销商提供了其它销售方式无法提供的极大控制,如对公共区域、办公楼的控制。但是与此同时,售货机需要定期服务:频繁地补充销售产品,定期进行计划内及计划外的维护。 

阅读本文后,售货机所有者将更深入地了解售货机设备每个组件的状态,有助于其提升服务效率。英特尔开展了一个开发项目,研究这一问题以及与构建智能售货机相关的其他机遇。完整的设备如图 1 所示。该项目的灵感很大程度上来源于 英特尔和凌华科技提供的智能售货机解决方案蓝图。本文详细介绍了项目开发工作的流程。文本从介绍结构化项目方法开始(分为多个阶段),然后按阶段详细介绍项目开发过程。 

如果您对此感兴趣,可以按照本文中英特尔项目团队采取的步骤,开发一台智能售货机。或许更重要的是,本文可被概括为一套指导方针,以满足其他项目类型的需求。英特尔免费提供这一文档,鼓励使用这一方法和流程推动物联网的探究、发明和创新。

 

 


方法

从本质上来讲,物联网采用开放式创新,利用种类繁多的项目,实现简单设备到复杂设备、日常设备到新型设备的智能化。与此同时,每个项目都基于行业从以前的物联网项目中获取的经验,最佳实践表明了物联网项目之间的共同结构元素。

为了充分利用这些共性并帮助提高开发的成功机会,英特尔开发了一种结构化的物联网项目开发方法。这种方法包含一个六阶段模型,指导着从灵感的初现到解决方案投入最终商业使用的整个产品开发流程。它具有较大的通用性,能够满足任何物联网项目的需求。

起始阶段 (1-3)

项目方法的前三个阶段是调查。着重于构思和评估项目解决特定问题的潜力,为产品的最终商业化实施做准备。因此,相比严格处理更精细的设计点,这些阶段更注重集思广益和概念验证。 

Grove 物联网商业开发人员套件包含一个英特尔® NUC 系统、英特尔物联网网关软件套件和面向 Arduino 与 Genuino 101 的 Grove Starter Kit(由 Seeed 制造),可帮助实现快速原型开发。该项目还使用了 Arduino 101*(美国以外地区称为 Genuino 101*)开发板。

  • 第一阶段:确定项目可以利用的机会。物联网项目的第一步是确定项目将面临的问题或机会。这一阶段的文档应确定机会本身、解决方案(对于最终用户以及构建和实施的机构)的价值以及项目概念的局限性,包括设计挑战和限制。
  • 第二阶段:设计概念验证,以利用机会。最初的解决方案设计提出了一种实用的解决方案构建方法,包括硬件、软件和网络元素。设计必须尽可能在构建原型之前解决第一阶段中确定的设计挑战和限制,包括适当考虑成本和安全性等因素。
  • 第三阶段:构建和完善概念验证。解决方案原型基于第二阶段中创建的设计,根据需要进行变更并记录下来。在这一阶段中,基于缺点的设计变更和测试期间发现的其他机会也应该记录下来。

完成阶段 (4-6)

项目方法的最后三个阶段只有在决定进行解决方案产品化之后才进行。因此,这些阶段明确涉及稳定性、安全性和可管理性方面的增强,准备产品的大规模生产以及从中盈利以实现其商业潜力。

项目的完成阶段包括将解决方案变为工业级传感器和相关组件,使用商业级网关构建并完成功能集。

  • 第四阶段:生成可靠的测试版。项目一旦获批为可行的解决方案,并计划针对生产而开发,下一步便是明确最终设计,生产以产品为导向的版本。此版本代表着对资源的大量投资,包括商业级传感器和其他组件以及商业物联网网关。
  • 第五阶段:评估功能并添加特性。对完成的解决方案测试版本进行了测试,以验证其能否根据设计参数正常运行。作为测试流程的一部分,项目团队还确定了融入解决方案的附加特性和功能,使其更加强大,并为最终用户提供更多的价值。
  • 第六阶段:完成设计并进入生产。产品具有完整功能后,团队会通过添加高级管理和安全特性来增强解决方案,并根据需要优化设计,以增强制造的适销性和效率等因素。解决方案的生产用户界面 (UI) 已经完成。这一阶段的工作还包括在进入全面生产之前进行解决方案销售和营销的最终规划。

第一阶段:确定机会 

尽管传统的售货机收入来源很可观,但是效率非常低下。每台售货机必须由维护人员定期补充机器的库存产品。通常为售货机指定固定路线,工作人员驾驶卡车,按照常规路线完成供货。

为了便于理解这个方法固有的低效性,给您举例说明,如果送货路线正好经过一幢高层办公楼。工作人员在办公楼前停下,他面临两个选择,一是猜测第 15 或 20 层的售货机需要补充哪些货物,把货物搬到上面后,再返回卡车搬走剩下的货物。二是利用手中的记事本详细制定库存补充计划。上述两个方法都花费了不必要的时间和精力,加大了售货机公司的成本。 

此外,分销商必须平衡工作人员补充货物的频率,如果过于频繁,浪费了工作时间,如果间隔时间过长,售货机货物空缺,损失收益。分销商在某种程度上需要依靠最终客户上报售货机的故障,从而加剧了这一状况的严峻性。

英特尔的项目发起人确定,将智能售货机作为潜在项目的基础,以展示物联网功能和本文所述的项目方法。该核心组确定了项目期间可能需要的技能,包括项目管理、编程、云架构和文档。根据所需的技能列表,核心组成立了完整的项目团队,项目人员主要由英特尔员工构成,偶尔加入一些外部人员,以完善团队的专业知识。

整个项目团队的第一个议事日程是量化该项目作为初期原型设计的潜在机遇。该使用案例的核心功能是支持售货机智能监控产品库存水平和操作状态,并通过物联网网关将信息返回云。

项目团队决定集成云资源,以实现数据存储和管理功能。该方法旨在助力开发完全连接的可扩展解决方案,利用售货机组的整体环境,优化操作。云方法的主要价值在于其预测销售的分析潜力,有助于优化彼此分散的多台售货机的供应链。还有助于优化负责补充机器库存、执行计划外维修的工作人员的效率。

第二阶段:设计概念验证原型 

项目团队决定,为了尽可能增强项目的实用性,以满足开发人员社区的需求,应基于现成的部件和技术开发该项目。基于这个决定,将物料清单限定为 Grove 商用物联网开发人员套件、英特尔物联网开发人员套件和英特尔物联网网关软件套件 (https://software.intel.com/zh-cn/iot/hardware/gateways/wind-river),利用在行业内广泛应用的低成本或免费软件技术,并随时应用免费开源软件 (FOSS)。

为了加速原型阶段并降低其复杂性,该团队选择将原型的局部部分构建为一个工作台模型,这个模型包含计算平台和传感器,而不包含实际的售货机,尽管在项目的未来阶段需要添加这样一个实际比例的设备。

原型硬件选择

此项目选用了英特尔® NUC 套件 DE3815TYKHE 小型 PC。这个平台如图 2 所示,其高级规范在表 1 中给出。除了具备强大的性能,该团队认为,由于英特尔最近推出了专门针对物联网的硬件平台,可以为该展示项目提供前瞻性选择。英特尔 NUC 基于英特尔® 凌动™ 处理器 E3815,提供一款无风扇散热解决方案、4GB 板载闪存存储(以及用于额外存储的 SATA 连接)以及各种 I/O。英特尔 NUC 被认为是一款高度紧凑和可定制的设备,可提供台式 PC 规模的功能。

为了简化连接传感器的流程,该团队选择采用使用 Arduino 101 开发板的 Arduino 生态系统,如图 2 所示,其规格如表 1 所示。这一开发板可让英特尔 NUC 的硬件和引脚与 Arduino 盾板兼容,这符合项目团队的开源理念。虽然项目的当前迭代中没有使用蓝牙®,但开发板具有该功能,团队正在考虑未来进行使用。

 

图 2.英特尔 NUC 套件 DE3815TYKHE 和 Arduino 101 开发板。

 


表 1:智能售货机项目使用的原型硬件

 

英特尔 NUC 套件
DE3815TYKHE

Arduino 101
开发板

处理器/
微控制器

英特尔凌动处理器 E3815(512K 高速缓存,1.46 GHz)

英特尔® Curie™ 计算模块@ 32 MHz

内存

8 GB DDR3L-1066 SODIMM (max)

  • 196 KB 闪存

  • 24 KB SRAM

网络/ IO

集成 10/100/1000 局域网

  • 14 个数字 I/O 引脚

  • 6 个模拟 IO 引脚

尺寸

190 x 116 x 40 毫米

68.6 x 53.4 毫米

完整规格

规格

规格

对于原型创建过程中所需的传感器和其他组件,团队选择采用面向 Arduino 和 Genuino 101* 的 Grove Starter Kit (由 Seeed Studio制造),后者在 Grove 商用物联网开发人员套件中使用。这个系列的组件成本较低,由于它是预先选择的一组部件,因此可减少确定和获取物联网原型的材料清单所需的工作量。为原型选择的传感器和其他组件(在下一部分中详述)由以下关键数据引导:

  • 售货机的内部温度
  • 售货机每件待售商品的库存水平
  • 售货机门开启或关闭状态
  • 售货机线圈堵塞检测

原型软件规格

对于原型操作系统,该团队考虑了 Yocto Project*-built Linux 和英特尔物联网网关软件套件。Yocto Linux 符合项目利用免费开源软件 (FOSS) 的构想,还提供了高度的灵活性,对源代码的有力控制,以及根据系统需求定制轻量化嵌入式操作系统的功能。另一方面,英特尔物联网网关软件套件提供即购即用的实施,无需定制。该团队将这些因素组合作为原型开发的最佳实践,因此选择了英特尔物联网网关软件套件作为原型的操作系统。

下列应用被确定作为解决方案的一部分进行开发:

  • 控制应用:在售货机上运行,收集来自传感器的数据,处理解决方案机电方面的操作(例如开/关货架线圈),并与人类用户(例如客户和管理员)以及云交换数据。
  • 管理应用:在 PC 或平板电脑上运行,并允许详细查看售货机的操作,包括事件、状态和日志以及访问云数据和分析。该应用还支持常规维护。
  • 客户应用 (也被称为移动应用):在智能手机或其他移动设备上运行,支持客户购买售货机中的产品。 

第三阶段:构建和完善概念验证原型

通过使用英特尔® NUC 套件 DE3815TYKHE、Arduino 101 开发板和物联网版 Grove Starter Kit Plus,该团队开发了概念验证原型,以模拟能够分发两种产品的简单售货机,如图 3 所示。它包括一台 2x16-字符的 LCD 显示屏(用于显示产品名称和价格信息)、两个选择按钮、一个用于分发产品的步进电机和两个显示机器状态的 LED(分别为绿色和红色)。还包括一台温度传感器和一个“故障检测”按钮。按下电脑应用中的购买按钮后,将分发产品;为了简单起见,原型省略了支付处理硬件。

图 3.智能售货机概念验证原型

原型硬件实施

原型的物料清单如表 2 所示。

表 2.智能售货机原型组件

 

组件

详细信息

基本系统

英特尔 NUC 套件 DE3815TYKHE

http://www.intel.com/content/www/cn/zh/support/boards-and-kits/intel-nuc-kits/intel-nuc-kit-de3815tykhe.html

Arduino 101 开发板

https://www.arduino.cc/en/Main/ArduinoBoard101

USB Type A 转 Type B 线缆

用于连接 Arduino 101 开发板和英特尔 NUC

Grove Starter Kit 组件

Grove* 基座护罩 V2

http://www.seeedstudio.com/depot/Base-Shield-V2-p-1378.html

带有驱动程序的 Grove* 齿轮步进电机

http://www.seeedstudio.com/depot/Gear-Stepper-Motor-with-Driver-p-1685.html

Grove* 按钮 

http://www.seeedstudio.com/depot/Grove-Button-p-766.html

Grove* 温度传感器 

http://www.seeedstudio.com/depot/Grove-Temperature-Sensor-p-774.html

Grove* 绿色 LED

http://www.seeedstudio.com/depot/Grove-Green-LED-p1144.html

Grove* 红色 LED

http://www.seeedstudio.com/depot/Grove-Red-LED-p-1142.html

Grove* LCD RGB 背光灯

http://www.seeedstudio.com/depot/Grove-LCD-RGB-Backlight-p-1643.html

Grove* 触摸传感器

http://seeedstudio.com/depot/Grove-Touch-Sensor-p-747.html

原型软件实施

概念验证原型中使用的控制应用是用 C++ 编写的。还利用了一台 Node.js* 组件,用于处理 Microsoft Azure 云。云用于与客户和管理应用(如温度警报和产品分发要求)交换事件。客户应用是用 JavaScript* 编写的(在 web 浏览器中使用),以避免将应用迁移到多个智能手机平台的需要。

解决方案软件所需的开发环境是英特尔® System Studio,它是一个面向 Eclipse* IDE 的插件,支持以 C/C++ 的方式连接英特尔 NUC 和开发应用。

此外,开发该解决方案还使用了 libmraa*(一种 C/C++ 库,支持在英特尔 NUC 上直接访问 I/O)和 Firmata*(支持与 Arduino 开发环境的编程交互,以利用 Arduino 的硬件抽象功能)。使用 Libmraa 提取 Firmata 可以更好地对英特尔 NUC 上的 I/O 进行编程控制,从而简化从传感器收集数据的流程。UPM* 库提供用于访问传感器的特定功能调用。

第四阶段:生成可靠的测试版。

概念验证正常运行后,项目团队将重心转移到创建智能售货机的生产版。整个解决方案被认为包括以下主要部件:

  • 一台售货机:能够分发产品,并将数据返回网关。这是一个复杂的解决方案定制部件,包含各种传感器和相关组件。
  • 网关:作为基于英特尔架构的商业产品购买,并使用定制开发的软件实施。
  • 管理和客户应用:在 JavaScript 中改进与实施,用于控制整个解决方案,生成并访问基于云的分析。
  • 云分析:基于 Microsoft Azure,能够基于来自售货机的定期使用数据形成洞察,以改进业务流程。

选择售货机组件

项目完成阶段的早期成果包括选择将构成最终投产解决方案的特定组件。

售货机设备采购

团队建造的概念验证原型是对售货机的主板级模拟,但是,生产版需要建造实际的、功能完备的售货机。该团队计划建造一台定制机器,或购买一台二手机器,然后针对项目要求对其进行改造。最终,选用了定制机器,这样将确保出售的产品范围最为广泛。定制机器的最初规格和制造初期的机器图片如图 4 所示。


售货机模型规格

定制台式售货机出售各种盒装、泡罩包装或袋装的小型产品。为了适应产品的不同尺寸,对三个受线圈驱动的售货机托盘进行配置:

  • 乘放 12-14 个小型泡罩包装产品的 3 英寸紧凑间距线圈
  • 乘放 9-12 个中型盒装产品的 4 英寸中型间距线圈
  • 乘放 6-8 个大型盒装产品(如 T 恤)的 5-6 英寸稀疏间距线圈

每台步进电机驱动一个线圈,将产品推入机器底部的托盘。人们可以透过塑胶玻璃表面查看售货机产品,还为英特尔显示器和/或数字键盘留有截孔。

机体为黑色亚光钢板,托盘为铝制,货架线圈为镀钢材质。打开售货机的正面,可以补充货物;打开背面能够安装、维修售货机机制。 

预计售货机深度为 24-30 英寸,高为 36 英寸,宽为 30 英寸。总体目标重量为 70 磅以内。

客户应用能够支持产品购买。


图 4.售货机规格和制造过程中的设备照片

这个阶段还制定了一些其他的关键决定,包括选择工业级传感器、一台基于英特尔® 架构的商业网关、一个全面支持生产的操作系统、用于数据存储与分析的云服务和面向管理和客户应用的软件技术。

选择传感器和相关组件

工业级传感器和相关组件替代了概念验证原型所中的相应 Grove Starter Kit 组件,详细信息见表 3。

表 3.生产版智能售货机组件

组件

详细信息

售货机模型

定制制造:

  • 配有铰链前门和可拆卸背板的机箱

  • 用于分发产品的三线圈可拆卸托盘

  • 三个步进电机(每个线圈配备一台电机),每台电机均装配了能够传感全线圈旋转的开关。

  • 配有电子部件的可拆卸托盘

Dell iSeries Wyse 物联网网关

https://iotsolutionsalliance.intel.com/solutions-directory/dell-iseries-wyse-3290

USB Type A 转 Micro-USB Type B 线缆

用于连接 I2C/GPIO 控制器和网关

12V 5A 电源

用于步进电机驱动程序主板

连接 I2C/GPIO 控制器的 FTDI* UMFT4222EV USB

http://www.mouser.com/new/ftdi/ftdiumft4222ev/

基于 ElecFreaks* PCA9555 的 GPIO 扩展器

http://www.elecfreaks.com/store/iic-gpio-module-p-692.html

SparkFun* 四步进电机驱动程序主板

https://www.sparkfun.com/products/retired/10507

采用 Adafruit* AM2315 包装的 I2C 温度/湿度传感器

https://www.adafruit.com/product/1293

Grove LCD RGB 背光灯 

http://www.seeedstudio.com/depot/Grove-LCDRGB-Backlight-p-1643.html

VCC* CNX714C200FVW (红色 LED 面板安装指示器)

http://www.mouser.com/ProductDetail/VCC/CNX714C200FVW

VCC* CNX714C900FVW(白色 LED 面板安装指示器)

http://www.mouser.com/ProductDetail/VCC/CNX714C900FVW

网关选择

选择在智能售货机产品版中使用的网关时,请注意以下因素:

  • 强大的计算资源:用于确保平稳的性能,消除操作过程中因中断而引起的错误,尤其需要考虑与云进行通信的正常使用需求。
  • 现成的商业可用性:是项目按计划进行所必需的。某些团队成员更偏好 Vantron* VT-M2M-QK 网关,由于无法及时获取该设备,因此,未在项目中使用。

最终,为项目产品阶段的实施选择了 Dell iSeries Wyse 3290 物联网网关,其规格详见表 4。该网关可为当前功能和可预见的功能提供所需的性能,并为作为商业产品的假设性售货机分销提供现成的可用性(可能大批量)。

表 4.智能售货机产品阶段的网关规格

 

Dell iSeries Wyse 3290 物联网网关

 

处理器

英特尔® 赛扬® 处理器 N2807(1 M 高速缓存,高达 2.16 GHz)

内存

4 GB DDR3 RAM 1600 MHz

网络

  • 局域网:1 x 10/100/1000 BASE-T

  • WLAN:802.11a/b/g/n/ac

  • 个域网:蓝牙低功耗 4.0 

物理规格

  • 尺寸:69 x 197.5 x 117 毫米

  • 重量:2.34 千克

继续使用英特尔物联网网关软件套件(原型基于此套件)是一个明确的决定,主要是因为网关面向操作系统进行了预验证。此外,英特尔 NUC 和网关均可运行英特尔® 物联网网关软件套件,从而简化将软件元素从原型移植到产品版智能售货机模型的流程。同样地,其他核心软件组件,如英特尔 System Studio 和原型中使用的库保持不变,以轻松迁移至向产品阶段。

在线操作

如图 5 所示,系统包括在物联网网关上运行的软件、Microsoft Azure 云和服务器端应用。

图 5.智能售货机拓扑:在线运行

 

物联网网关软件实施

物联网网关软件包含 3 个部分:

  • 控制应用:通过英特尔物联网开发人员套件库 libmraa 和 libupm*,以 C++ 的形式实施,执行以下任务:

    查看机械故障并将故障/无故障事件报告给数据库。
    监控温度波动是否在允许范围以内,当温度超出规定范围或恢复规定范围时,报告事件。
    查看来自产品选择按钮的事件,首先在客户应用中产生,然后生成“分发”事件,通过云将事件发送至售货机。

  • 本地 DB用于控制应用和 DB 后台程序之间的进程间通信。本地 SQLite 数据库使用 $HOME/Vending_Prototype/events.sqlite3文件,该文件包含“事件”表,随时将事件报告给云。双向复制云和售货机之间传递的事件。
  • DB 后台程序通过 Node.js 实施,它在本地数据库和云之间双向发送报告事件。

Microsoft Azure 云实施

Microsoft Azure 云维护智能售货机的产品库存信息,跟踪来自客户应用和售货机的事件,并提供分析数据和针对不同条件触发响应(如低库存或机器故障)的功能。主要的云分析功能如下所示:

  • 在产品缺货的情况下,将信息发送至云,通过管理应用向客户显示警报。 
  • 如果售货机内部温度低于或高于预设置的阙值,将信息发送至云,以备分析。在管理应用中向客户显示警报。nbsp;
  • 如果 3 个货架线圈中的任何一个无法正常运行,将信息发送至云,以备分析。在管理应用中向客户显示警报。 
  • 如果售货机的托盘被抽出,显示“机器开启”状态,LCD 和 LED 变为红色。如果托盘被推回机体,显示“机器已准备就绪”状态,LCD 和 LED 变为绿色。

管理应用提供关于主页、设置、登录历史、库存状态和警报详情的信息。

第五阶段:完成设计并发布到生产

负责开发这一解决方案的项目团队是以工程为核心的,因此为最终产品开发一流的用户界面有些超出了该团队的核心能力。为此,该团队聘用了一位签订合同的外部人员。这名负责开发用户界面的人员与核心软件开发团队一起参加定期团队会议和专门会议。

在讨论中,不断改进用户界面,以集成其他性能和功能。例如,团队将颜色代码和选项(用于切换华氏与摄氏温度)添加至管理应用用户界面。将功能添加至客户应用用户界面后,要求客户在交易完成前验证他们的购买意向,还进行了其他小的改进。

管理应用 

管理应用用户界面(如图 6 所示)专为在平板电脑上操作而设计,并且提供面向智能售货机的管理功能。 

图 6.智能售货机管理应用用户界面

管理应用用户界面包含以下主要元素:

  1. 菜单系统包含一个转到主界面(如下图所示)的“Home”按钮、一个显示软件信息“About”界面、一个提供硬件设置详细信息(包括放置和连接传感器)的“Setup”按钮、一个访问事件日志的“Log”按钮(用于跟踪购买、警报和维护)和一个“Alert”按钮,该按钮提供主动维护警报的相关信息,如每个警报的类型和发生时间。
  2. 库存面板反映云内设置的库存水平,通过颜色代码显示不同水平:深蓝表示库存超过容量的三分之二,浅蓝表示库存在容量三分之一和三分之二之间,橙色表示库存低于三分之一。单击面板,将生成详细的库存窗口,明确显示库存量、物品所在的托盘以及每个物品的定价。
  3. 温度模块是一个双阙值温度辐射图,显示售货机当前的内部温度,可以选用华氏温度或摄氏温度。白色条框代表温度在可接受的范围内,如果温度超出规定范围,系统将生成警报。软件每隔几秒调用一次温度,并更新用户界面。
  4. 线圈状态模块报告售货机线圈和电机的状态,表明是否存在任何故障,如堵塞或电气故障。
  5. 售货机单元模块直观显示错误条件的存在与位置信息,以及售货机门的开/关状态。

客户应用

如图 7 所示,客户应用专为在移动设备上运行而设计,支持客户在购买时与售货机进行交互。 

图 7.智能售货机客户应用

客户应用包括以下主要因素:

  • 状态窗口显示机器是否可以接单,还具备购物车的功能,展示用户在购买前所选的物品列表。当将物品加入购物车后,出现“Buy”按钮,可以看到销售总量,单击“Buy”按钮完成购买后,应用将订单信息发生至云,售货机收到云的确认信息后,分发物品并更新库存数量。
  • 订购窗口中,售货机中的每一项产品都对应一个选择按钮,单击按钮后,将产品添加至状态窗口下的购物车列表。每个产品按钮旁边都有显示库存数量和产品价格的字段。

完整的产品版智能售货机

图 9 显示了组装完成的智能售货机,已安装了网关、传感器和其他组件。

图 9.完全组装的智能售货机

 

第六阶段:评估功能并添加特性

实际的产品版智能售货机正常运行后,项目团队成员开始预测可以将哪些未来可行的功能集成至产品版。

增强云分析

该团队发现利用 Microsoft Power BI* 服务和 Power BI 桌面*(一种集成至 Microsoft Azure 的云托管的业务智能和云服务),能够增强云分析功能。这些功能显著增强了智能售货机的数据可视化。

增强事件通知数据流

在评估阶段,团队确定利用事件通知和 Microsoft Azure 分析,能够对机器操作的某些方面实施自动化。尤其确定了基于以下数据流的增强功能将在未来实现:

  • 库存。如果产品的数量降至两个单位以内,未来的增强功能可以向云分析发出通知,管理应用将收到重新订购库存的警报。如果库存数量降至零,将重复该流程,并向机器显示屏和客户应用发出通知,表明产品已断货。
  • 维护。如果机器出现故障(如线圈无法转动一周、温度超出预设置的范围等),未来的增强功能将生成通知,并发送至云分析,服务人员将收到通知。还将向管理应用发送警报,通知其监控服务呼叫数量。

结论

在智能售货机开发过程中追踪产品开发路径,将为开发团队提供关于创建解决方案的思考模式。先是创意阶段,然后是利用低成本设备快速构建原型以及简化的物理模型,确保了项目的快速开展。因此,能够在时间和资金投入相对较少的前提下,尽早确定项目的潜在可行性。

 该项目还建议创建一个将云分析集成至物联网解决方案的模型。本实施不仅专注于大数据洞察中蕴含的机遇,还展示了云作为通信和中心数据存储所发挥的重要功能。同时,云数据为生成业务智能提供了大量的机会,有助于优化供应链、提高维护效率以及增强盈利能力。

更多信息

不得将本文件用于关于本文中所描述的英特尔产品的任何侵权行为或其他法律解释。您同意授权英特尔随后起草的任何专利声明的非排他性、免版税许可,包括本文公开的主题。
 
本文件不构成对任何知识产权的授权,包括明示的、暗示的,也无论是基于禁止反言的原则或其他。
 
所述产品可能包含设计缺陷或错误(已在勘误表中注明),这可能会使产品偏离已经发布的技术规范。这些缺陷或失误已收录于勘误表中,可索取获得。

英特尔以“概不保证”的方式提供这些信息,仅为方便我们的客户和合作伙伴,不承担与您使用信息相关的任何责任。英特尔明确拒绝所有明确或隐含的担保,包括但不限于对于适销性、特定用途适用性和不侵犯任何权利的隐含担保,以及任何对于履约习惯、交易习惯或贸易惯例的担保。
 
英特尔、Intel 标识、Intel 商标: 英特尔® 凌动™ 处理器 E3815、英特尔® Curie™ 计算模块、英特尔® 物联网开发人员套件、英特尔® 物联网网关、英特尔® 物联网网关软件套件、英特尔® NUC 和英特尔® System Studio 是英特尔在美国和/或其他国家的商标。
*其他的名称和品牌可能是其他所有者的资产
 
英特尔版权提示:“© 英特尔公司”

物联网产品开发之路:如何构建智能自动售货机

$
0
0

物联网 (IoT) 产品开发之路是商用物联网解决方案开发系列的一部分。该系列涵盖初步概念阶段、原型构建阶段和产品改进阶段,旨在开发切实可行的产品。该项目采用 Grove* 商用物联网开发人员套件,以及基于英特尔® 下一代计算设备 (NUC) 套件 DE3815TYKHE 小外形电脑和 Arduino* 101 开发板构建的原型。

本文展示了如何构建原型,以及如何使用相同的技术来部署英特尔物联网网关和工业传感器。这不需要特殊的设备或深入的专业知识,其目标是为物联网项目的原型开发阶段提供一些通用指导。

注:这一开发板在美国称为“Arduino* 101”,在其他地方称为“Genuino* 101”。在本文中称为“Arduino 101”开发板。

本文介绍了如何构建 智能自动售货机原型。 如欲了解详情,请查看 物联网产品开发之路:构建智能自动售货机

请访问 GitHub,获得该项目的最新代码示例和文档。

 

简介

完整的智能自动售货机如图 1 所示。通过该实践开发人员可以学习到如何:

图 1.完整的智能自动售货机。
  • 连接英特尔 NUC 套件 DE3815TYKHE。
  • 使用英特尔® 物联网开发人员套件中的 MRAA 和 UPM 与 IO 和传感器库交互;该套件是一款完整的软硬件解决方案,可帮助开发人员探索物联网和实施创新项目。
  • 在英特尔® System Studio 中运行该代码示例;该工具是一个 IDE,可创建与传感器和制动器交互的应用,支持快速开发面向英特尔物联网平台的软件。
  • 使用 Microsoft Azure* 平台设置并连接至云服务,从而为解决方案的不同组件提供云分析和通信中枢。

功能

该项目支持模拟智能自动售货机的以下功能::

  • 贩卖多种商品
  • 跟踪售货机内的产品存货情况
  • 库存水平低于预设的阈值以下时发送告警
  • 确定电源启动和故障
  • 售货机门打开时发送通知
  • 显示线圈状态
  • 监控机器内部温度并发送告警
  • 提供日志记录历史维护、库存和相关事件
  • 提供用于购买产品的配套应用

 

 

工作原理

该智能自动售货机原型使用传感器来触发各种不同的操作:

  • 按钮模拟从售货机选择指定产品
  • 步进电机分发产品
  • 红色和绿色 LED 分别代表故障和 OK 状态
  • 温度传感器监控售货机内部温度
  • LCD 显示售货机状态

所有数据流均通过作为媒介的云服务形成。例如,如果客户使用移动应用选择一款产品,相关信息便会传送至云端以及售货机本身。借助这种方法,便可在云端控制存货水平。

同样,与产品、定价和维护事件相关的数据在云端集中管理,这有助于进行全面的趋势分析和报告。例如,服务告警可以发送至服务人员,而且管理应用可得到更新以便进行追踪。请注意,虽然智能自动售货机原型在设计的时候考虑了上述功能,但在此次演示中并未实施。

设置英特尔® NUC 套件 DE3815TYKHE

本节将指导如何在 NUC 上安装英特尔® 物联网网关软件套件。

注:如果您具备 Grove 商用物联网开发人员套件,那么 NUC 上便已经预装了英特尔物联网网关软件套件。

  1. 如果没有帐号,需要在英特尔® 物联网平台市场上创建一个。
  2. 下载英特尔物联网网关软件套件,按照电子邮件中的说明下载映像文件。
  3. 解压该存档文件,然后将 .img文件写入 4GB U 盘:

    在 Microsoft Windows* 上可以使用类似 Win32 Disk Imager* 的工具:https://sourceforge.net/projects/win32diskimager
    在 Linux* 上使用sudo dd if=GatewayOS.img of=/dev/sdX bs=4M; sync,其中 sdX表示 U 盘。

  4. 将 U 盘从系统上拔出,然后插入包含显示器、键盘和电源线的英特尔 NUC。
  5. 打开 NUC,然后在启动时按 F2进入 BIOS。
  6. 如果要通过 U 盘启动:

    a. 在 Advanced 菜单选择 Boot
    b. 在 Boot ConfigurationOS Selection下,选择 Linux
    c. 在 Boot Devices下,确保 选中 USB框。
    d. 保存更改并重启。
    e. 按 F10进入启动选择菜单,然后选择 U 盘。

  7. 使用 root:root登录系统。
  8. 使用下面的命令在本地存储上安装 Wind River Linux:
    ~# deploytool -d /dev/mmcblk0 --lvm 0 --reset-media –F

    注:由于本地存储应用容量有限,不建议设置恢复区。重新使用 U 盘,恢复至出厂映像。

  9. 使用 poweroff命令关闭网关。然后,拔下 U 盘并重新打开网关,以便从本地存储设备启动。
  10. 插入以太网线缆,然后使用 ifconfig eth0命令查找分配给网关的 IP 地址(假设您已完成相应网络设置)。
    如果所在的网络与网关相同,您可以通过开发设备远程使用网关。如果想使用英特尔® 物联网网关开发中心(而非命令行),可在浏览器中输入 IP 地址,并进行首次设置。
  11. 使用英特尔物联网网关开发中心将 MRAAUPM库更新至官方库(https://01.org)发布的最新版本。输入以下命令,也可达到相同的效果:
     ~# smart update
     ~# smart upgrade
     ~# smart install upm
  12. 使用以下命令安装 Java* 8 支持(执行前面的命令后)。这将移除预编译的 OpenJDK* 7,并安装 OpenJDK* 8,后者支持 MRAA 和 UPM:
    ~# smart remove openjdk-bin
    ~# smart install openjdk-8-jre
  13. 插入 Arduino 101 开发板,然后重启 NUC。将 Firmata* 方案闪存至 Arduino 101,这样就可以与 MRAA 和 UPM 结合使用了。

设置 Arduino 101 开发板

有关 Arduino* 101 开发板的设置说明,请访问 https://www.arduino.cc/en/Guide/Arduino101

连接其他组件

本节将介绍如何连接 NUC 和其他硬件组件。表 1 汇总了用于该原型的材料清单,图 2 所示为如何安装这些组件。

表 1.智能自动售货机原型组件。

 

组件

详细信息

基本系统

英特尔® NUC 套件 DE3815TYKHE

http://www.intel.com/content/www/cn/zh/support/boards-and-kits/intel-nuc-kits/intel-nuc-kit-de3815tykhe.html

Arduino* 101 开发板

https://www.arduino.cc/en/Main/ArduinoBoard101

USB Type A 转 Type B 线缆

用于将 Arduino 101 开发板连接至 NUC

Grove* Starter Kit Plus IoT Edition 的组件

基座护罩 V2

http://www.seeedstudio.com/depot/Base-Shield-V2-p-1378.html

带有驱动程序的齿轮步进电机

http://www.seeedstudio.com/depot/Gear-Stepper-Motor-with-Driver-p-1685.html

按钮模块

http://www.seeedstudio.com/depot/Grove-Button-p-766.html

温度传感器模块

http://www.seeedstudio.com/depot/Grove-Temperature-Sensor-p-774.html

绿色 LED

http://www.seeedstudio.com/depot/Grove-Green-LED-p-1144.html

红色 LED

http://www.seeedstudio.com/depot/Grove-Red-LED-p-1142.html

触摸装置

http://www.seeedstudio.com/depot/Grove-Touch-Sensor-p-747.html

带有 RGB 背光模块的 LCD

http://www.seeedstudio.com/depot/Grove-LCD-RGB-Backlight-p-1643.html

 
图 2.智能自动售货机概念验证原型。

 

安装英特尔® System Studio

英特尔® System Studio 是 Eclipse* 的一款插件,支持您在英特尔 NUC 或其他兼容板上连接、更新和编程物联网项目。它能够帮助您使用 C 和 C++ 语言编写应用,并提供专门针对英特尔®物联网开发人员套件设计的两个库:

  • MRAA是一种低级别库,可将输入/输出接口转换成针脚,以供物联网开发板使用。

  • UPM是一种传感器库,支持使用 MRAA 的多种语言。UPM 使您能够针对自己的项目轻松的使用或构建传感器表示。

在 Windows* 上安装

Note: 7-Zip* 支持超长路径名称(压缩文件中的某些文件经常拥有超长的路径名称),因此只有使用7-Zip 软件才能解压该安装程序文件。

  1. 从以下网址下载 7-Zip 软件:http://www.7-zip.org/download.html
  2. 右击下载的可执行文件,并选择 以管理员身份运行
  3. 点击 下一步并按照安装向导中的说明安装应用。
  4. 使用 7-zip,解压安装程序文件。

警告:确保将安装程序文件解压至路径名称中不包含空格的文件夹位置。例如,文件夹 C:\My Documents\ISS不符合要求;C:\Document\ISS符合要求。

在 Linux* 上安装

  1. 下载 英特尔® System Studio for Linux*安装程序文件。
  2. 打开一个新的终端窗口。
  3. 导航至包含安装程序文件的目录。
  4. 输入命令:tar -jxvf file解压 tar.bz2文件,其中 file代表安装程序文件的名称。例如 tar -jxvf iss-iot-linux.tar.bz2。使用的命令可能会略有不同,具体取决于安装程序文件的名称。

在 Mac* OS X* 上安装

  1. 下载英特尔 System Studio for Mac* OS X* 安装程序文件。
  2. 打开一个新的终端窗口。
  3. 导航至包含安装程序文件的目录。
  4. 输入命令:tar -jxvf file解压 tar.bz2文件,其中 file代表安装程序文件的名称。例如 tar -jxvf iss-iot-mac.tar.bz2。使用的命令可能会略有不同,具体取决于安装程序文件的名称。

注:如果您看到消息提示 "iss-iot-launcher can’t be opened because it is from an unidentified developer",请右击文件并选择 Open with。选择 Terminal应用。在打开的对话框中,单击 Open

启动英特尔® System Studio

  1. 导航至包含安装程序文件的目录。
  2. 启动英特尔 System Studio:
  • 在 Windows* 中,双击 iss-iot-launcher.bat启动英特尔 System Studio。
  • 在 Linux* 中,运行 iss-iot-launcher.sh
  • 在 Mac* OS X* 中,运行 iss-iot-launcher

注:使用 iss-iot-launcher文件(而不是英特尔® System Studio 可执行文件)将启动英特尔 System Studio 以及所有必要的环境设置。每次可使用 iss-iot-launcher文件来启动英特尔® System Studio。

安装 Microsoft* Azure* 组件

Azure* 云能够在网络中维护智能自动售货机的产品信息,追踪售货机收到的事件,而且未来还能够分析数据,并根据不同的状况触发响应措施(例如库存较低或者机器故障)。

实施 Azure* C++ API

使用 C++ API 连接至 Azure* 需要编译以下所有库,以便构建 Casablanca 项目:

在 Azure* 中创建 web 应用

编译 Boost

wget -O  boost_1_58_0.tar.gz  ‘http://downloads.sourceforge.net/project/boost/boost/1.58.0/boost_1_58_0.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fboost%2Ffiles%2Fboost%2F1.58.0%2F&ts=1438814166&use_mirror=iweb’
tar czvf boost_1_58_0.tar.gz
cd boost_1_58_0
./bootstrap.sh
./b2

编译 Casablanca

克隆 Casablanca:

git clone https://git.codeplex.com/casablanca

https://github.com/Microsoft/cpprestsdk

编译 Casablanca:

https://casablanca.codeplex.com/wikipage?title=Setup%20and%20Build%20on%20Linux&referringTitle=Documentation
git clone https://github.com/Azure/azure-storage-cpp.git

https://github.com/Azure/azure-storage-cpp.git

SQLite3 安装和表初始化

SQLite3 IPK 软件包安装:

root@galileo:~# opkg install sqlite3
Installing sqlite3 (3:3.8.6.0-r0.0) on root.
Downloading http://iotdk.intel.com/repos/1.5/iotdk/i586/sqlite3_3.8.6.0-r0.0_i586.ipk.
Configuring sqlite3.

产品数据库创建和初始化:

root@galileo:~# sqlite3 Vending_Prototype/products.sqlite3
SQLite version 3.8.6 2014-08-15 11:46:33
Enter ".help" for usage hints.
sqlite> create table products(name varchar(255) primary key, price smallint, quantity smallint);
sqlite> insert into products values('Coke',150,2);
sqlite> insert into products values('Pepsi',130,3);

事件数据库创建和初始化:

root@galileo:~# sqlite3 Vending_Prototype/events.sqlite3
SQLite version 3.8.6 2014-08-15 11:46:33
Enter ".help" for usage hints.
sqlite>
sqlite> create table events(time INT, type smallint, key varchar(255), value smallint);

SQLite3 Node.js 软件包安装:

npm install sqlite3

Azure* 安装

npm install azure-storage

结论

正如本文所介绍的,物联网开发人员可通过网关、管理、移动和云软件功能来构建原型,而且成本较低,不需要专业的技能。借助Grove* 商用物联网开发人员套件和 Arduino* 101 开发板,项目团队能够快速进行原型开发,以便测试物联网概念的可行性,进而为物联网产品开发之路提供有力的支持。

请访问 GitHub,获得该项目的最新代码示例和文档。

不得将本文件用于关于本文中所描述的英特尔产品的任何侵权行为或其他法律解释。您同意授权英特尔随后起草的任何专利声明的非排他性、免版税许可,包括本文公开的主题。
 
本文件不构成对任何知识产权的授权,包括明示的、暗示的,也无论是基于禁止反言的原则或其他。
 
所述产品可能包含设计缺陷或错误(已在勘误表中注明),这可能会使产品偏离已经发布的技术规范。这些缺陷或失误已收录于勘误表中,可索取获得。

为方便客户和合作伙伴,英特尔基于“按原样”原则提供相关信息,而且概不承担任何责任。英特尔明确拒绝所有明确或隐含的担保,包括但不限于对于适销性、特定用途适用性和不侵犯任何权利的隐含担保,以及任何对于履约习惯、交易习惯或贸易惯例的担保。
 
英特尔、Intel 标识、英特尔® 物联网网关、英特尔® 物联网网关软件条件、英特尔® NUC、英特尔® 下一代计算设备 (NUC) 套件 DE3815TYKHE、英特尔® 物联网平台市场和英特尔® System Studio 是英特尔公司在美国和其他国家(地区)的商标。
其他的名称和品牌可能是其他所有者的资产
 
英特尔版权提示:“© 英特尔公司”

 


如何在 Linux* 中安装英特尔® 数据分析加速库(英特尔® DAAL)的 Python* 版本

$
0
0

简介

英特尔® 数据分析加速库(英特尔® DAAL) 1, 2是一款用于数据分析的软件解决方案。它提供用于数据预处理、转换、建模和预测等任务的构建模块。

英特尔 DAAL 2017 测试版提供对 Python *脚本语言的支持。

本文介绍了一种安装英特尔 DAAL 的 Python 版本的简单方法。

安装

在 Linux* 中安装英特尔 DAAL 的 Python 版本有多种方法。英特尔 DAAL 包含在 Intel® Distribution for Python 和 Intel® Parallel Studio XE 2017 beta 中。然而,对于 Intel Parallel Studio 2017 beta 3,用户需要先编译 Python 源代码才能使用。

感谢 Zhang 为我们展示一种通过 Anaconda* 4分发版安装英特尔 DAAL 的简单方法。

分步说明

以下步骤将向您介绍如何安装 Intel Distribution for Python 和 Intel DAAL:

  1. 安装 Anaconda 分发版。

    • 转到 Anaconda 下载网站 4,然后下载 Anaconda 针对 64 位 Linux 的 2.7 或 3.5 Python 版本。
    • 执行以下命令,安装 Anaconda:

      bash Anaconda2-4.0.0-Linux-x86_64.sh(针对 Python 2.7)
      or
      bash Anaconda3-4.0.0-Linux-x86_64.sh(针对 Python 3.5)

  2. 将英特尔渠道添加到 Anaconda。

    1. 在将英特尔渠道添加到 Anaconda 之前,确保已正确安装 Anaconda。一种方法是在命令提示符下运行 Python,看看这个 Python 版本是否来自 Anaconda:

    2. 如果第 2.1 步正确,使用 Anaconda 中包含的 conda 实用程序,利用以下命令将英特尔渠道添加到 Anaconda:

      conda config --add channels intel

    3. 检查确保已使用以下命令添加了英特尔渠道:

      conda config --get channels

      如果已添加英特尔渠道,结果将类似这样:

  3. 在 Anaconda 下安装英特尔® DAAL 的 Python 版本。

    使用以下命令为英特尔 Python 版本创建一个新环境,并安装 Intel Distribution for Python 和英特尔 DAAL:

    conda create -n intelpython --override-channels --channel intel python=3.5 intelpython scipy pydaal

    其中:

    intelpython (after the switch '-n'):英特尔版本的 Python 环境的名称。这可以是任何名称。此名称将用于以后切换到英特尔版本的 Python 环境。
    Channel intel:英特尔渠道。
    python=3.5:英特尔版本的 Python 使用 Python version 3.5,而非 2.7。
    intelpython:英特尔版本的 Python 名称。这个名称不能更改。
    pydaal:英特尔 DAAL 的 Python 版本。
    scipy: pydaal 需要这一软件包。

  4. 检查确保 Python 的环境存在。

    使用以下命令确保英特尔版本的 Python 环境“intelpython”已创建:

    conda env list

    屏幕将如下所示:

  5. 切换到英特尔 Python 环境。

    若要使用英特尔 DAAL 的 Python 版本,您需要进入英特尔版本的 Python 环境。使用以下命令,切换到上文创建的英特尔版本的 Python 环境“intelpython”:

    Source activate intelpython

    如果环境切换成功,您看到的屏幕可能是这样的:

    若要切换回默认环境,请发出以下命令:

    Source deactivate

  6. 检查确保已选择英特尔版本的 Python。

    在使用 Intel Distribution for Python 之前,我们需要切换到英特尔版本的 Python 环境,如上所示。运行以下命令,确保已选择英特尔版本的 Python,而不是 Anaconda 附带的 Python 版本:

    Python3.5

    屏幕将如下所示:

    注:英特尔 DAAL 的 Python 版本仅适用于 Python 3.5 及以上版本。它不适用于 Python 2.7。

结论

本文介绍了一种在 Linux 中安装 Intel Distribution for Python 和英特尔 DAAL 的简单方法。

参考资料

1 英特尔® DAAL

2 https://software.intel.com/zh-cn/daal

3 下载带英特尔® DAAL 2017 Beta 的英特尔® Parallel Studio XE 2017 Beta

4 https://www.continuum.io/downloads

借助英特尔® 数据分析加速库,提升主组件分析的性能

$
0
0

您是否遇到过网站迟迟无法打开或根本无法访问的情况?如果是这样,网站可能正遭遇拒绝服务1 (DoS) 攻击。DoS 攻击指攻击者让网络充斥垃圾邮件等信息,使网络因忙于处理这些信息而不能处理其他用户的请求。

为防止垃圾邮件 DoS 攻击,网络需要识别并过滤垃圾邮件。其中一个方式是将电子邮件模式与垃圾邮件签名库中的模式进行比较。与库中模式匹配的入站模式应被标记为攻击。由于垃圾邮件具有各种不同的形式,因此无法构建存储所有模式的库。为提高识别垃圾邮件的几率,需对数据进行重构,以简化数据分析。

本文探讨了一种非监督式2 机器学习3算法,即主组件分析4 (PCA),它可用于简化数据。本文还介绍了英特尔® 数据分析加速库(英特尔® DAAL)5可如何帮助优化该算法,使其以更高性能在搭载英特尔® 至强® 处理器的系统上运行。

什么是主组件分析?

PCA 是一种主流数据分析方法,用于在不损害数据属性的情况下降低数据复杂性,从而简化数据可视化和分析。降低数据复杂性意味着减小原始数据维度,同时保留原始数据集的重要特征。它通常用作 K-means 等机器学习算法的预先步骤,6,可简化建模,从而提升性能。

图 1-3 描述了 PCA 算法的工作原理。为便于说明,我们将范围限制在二维空间。


图 1.原始数据集布局。

图 1 所示为数据集的对象。我们需要找到方差最大的方向。


图 2.平均值和方差最大的方向。

图 2 显示了数据集的平均值和方差最大的方向。第一个具有最大方差的方向称为第一个主组件。


图 3.查找下一个主组件。

图 3 所示为下一个主组件下一个主组件是方差第二大的方向。请注意,第二大的方向与第一大的方向是标准正交关系。

图 4-6 显示了 PCA 算法如何用于减小维度。


图 4.重定向图表。

图 4 所示为旋转图表后的新图表。在新图表中,与第一个主组件对应的轴线 (P1) 成为了水平轴线。


图 5.将对象投射到 P1 轴线。

在图 5 中,整个图表都进行了旋转,对应第一个主组件的轴线 (P1) 成为了水平轴线。


图 6.将二维减小至一维。

图 6 显示了使用 PCA 根据最大方差将二维(P1 和 P2)减小至一维 (P1) 的效果。同一概念可用于减小多维数据集的维度,同时通过减小具有较低方差的维度保留它们的许多特征。

如需了解有关 PCA 数学表征的信息,请查阅参考资料 7 和 8。

PCA 的应用

PCA 应用包括:

  • 检测 DoS 和网络探头攻击
  • 图像压缩
  • 模式识别
  • 分析医疗成像

PCA 的优缺点

下面列出了 PCA 的部分优势和劣势。

  • 优点
    • 快速算法
    • 显示数据的最大方差
    • 减小原始数据的维度
    • 减小噪音。
  • 缺点
    • 非线性结构难以使用 PCA 建模

英特尔® 数据分析加速库

英特尔 DAAL 是一个包含众多优化的基本构建模块的库,适合数据分析和机器学习。这些基本构建模块经过高度优化,能适应最新版英特尔® 处理器的最新特性。如欲了解关于英特尔 DAAL 的更多信息,请查看参考资料 5。

下一部分介绍了如何协同使用 PCA 和 PyDAAL —— 英特尔 DAAL 的 Python* API。请按照参考资料 9 的说明安装 PyDAAL。

在英特尔数据分析加速库中使用 PCA 算法

如需使用英特尔 DAAL 在 Python 中调用 PCA 算法10,请实施下列步骤:

  1. 输入如下命令以导入必要的封装,并导入
    1. 发布下列命令,导入加载数据所需的函数:
      from daal.data_management import HomogenNumericTable
    2. 使用下列命令导入 PCA 算法:
      import daal.algorithms.pca as pca
    3. 导入用于计算的 numpy。
      Import numpy as np
  2. 导入 createSparseTable 函数,创建数值表格,以存储从文件中读取的输入数据。
    from utils import createSparseTable
  3. 将数据加载至上述数据集对象。
     dataTable = createSparseTable(dataFileName)
    其中,dataFileName 表示 input .csv 数据文件的名称
  4. 使用关联法为 PCA 创建算法对象。
    pca_alg = pca.Batch_Float64CorrelationDense ()
    注:若要使用 svd(奇异值分解)法,我们可使用下列命令:
    pca = pca.Batch_Float64SvdDense()
  5. 设置算法的输入。
    pca_alg.input.setDataset(pca.data, dataTable)
  6. 计算结果。
    result = pca_alg.compute()
    结果可使用下列命令检索:
    result.get(pca.eigenvalues)
    result.get(pca.eigenvectors)

结论

PCA 是最简单的非监督式机器学习算法之一,可用于减小数据集的维度。英特尔 DAAL 包含优化版 PCA 算法。借助英特尔 DAAL,您无需担心您的应用无法在配备未来更多代英特尔至强处理器的系统上高效运行。英特尔 DAAL 将自动利用全新英特尔至强处理器中的新特性。您只需将您的应用链接到英特尔 DAAL 的最新版。

参考资料

1. 拒绝服务攻击

2. 非监督式学习

3. 维基百科 —— 机器学习

4. 主组件分析

5. 英特尔 DAAL 简介

6. K-means 算法

7. 面向机器学习的主组件分析

8. 主组件分析教程

9. 如何安装 Python 的英特尔分发版

10. Python 网站

在英特尔® 数学核心函数库中引入 DNN 基元

$
0
0

    深度神经网络 (DNN) 处于机器学习领域的前沿。这些算法在 20 世纪 90 年代后期得到了行业的广泛采用,最初应用于诸如银行支票手写识别等任务。深度神经网络在这一任务领域已得到广泛运用,达到甚至超过了人类能力。如今,DNN 已用于图像识别、视频和自然语言处理以及解决复杂的视觉理解问题,如自主驾驶等。DNN 在计算资源及其必须处理的数据量方面要求非常苛刻。就这一点而言,现代图像识别拓扑 AlexNet 需要几天的时间在现代计算系统中进行训练,并使用超过 1,400 万张图像。消除这种复杂性需要使用经过良好优化的构建模块来缩短训练时间,以满足工业应用的需求。

    英特尔® 数学核心函数库(英特尔® MKL)2017 引入了 DNN 域,它包含加速最常用的图像识别拓扑(包括 AlexNet、VGG、GoogleNet 和 ResNet)所需的功能。

    这些 DNN 拓扑依靠大量的标准构建模块或基元,这些构建模块或基元以称为张量的多维集的形式对数据进行预算。这些基元包括卷积、归一化、激活和内积函数,以及处理张量所需的函数。在英特尔架构上高效执行计算需要通过向量化利用 SIMD 指令并通过线程利用多个计算内核。向量化非常重要,因为现代处理器在最多 512 位长(16 个单精度数字)的数据向量上进行运算,并且每个周期最多可执行两个乘法和加法(融合乘加或 FMA)运算。利用矢量化需要将数据连续定位在内存中。由于张量的尺寸通常较小,所以更改数据布局会带来巨大的开销;我们设法在拓扑中执行所有运算,同时不更改不同基元的数据布局。

英特尔 MKL 为使用最广泛的运算(针对适用于矢量化的数据布局实施)提供了基元:

  • 直接批量卷积
  • 内积
  • 池化:最大值、最小值、平均值
  • 标准化:跨渠道的本地响应标准化 (LRN)、批次规标准化
  • 激活:修正线性单元 (ReLU)
  • 数据操作:多维转置(转换)、拆分、合并、求和和缩放。

编程模式

    神经网络拓扑的执行流程包括两个阶段:设置和执行。在设置阶段,应用会为实施评分、训练或其他应用特定计算所需的所有 DNN 运算创建描述。为将数据从一个 DNN 运算传递到下一个运算,一些应用会创建中间转换,并在适当的输出和输入数据布局不匹配时分配临时数组。这个阶段在典型应用中执行一次,然后进行执行实际计算的多个执行阶段。

    在执行步骤期间,数据在 BCWH(批处理、通道、宽度、高度)这样的平面布局中馈送到网络中,并转换为适用于 SIMD 的布局。当数据在层之间传播时,数据布局被保留,并在需要执行现有实施不支持的运算时进行转换。

 

    英特尔 MKL DNN 基元实施了一个简单的 C 应用编程接口 (API),可用于现有 C/C++ DNN 框架。调用英特尔 MKL DNN 函数的应用应包括以下阶段:

    设置阶段: 对于特定 DNN 拓扑,应用会为实施评分、训练或其他应用特定计算所需的所有 DNN 运算创建描述。为将数据从一个 DNN 运算传递到下一个运算,一些应用会创建中间转换,并在适当的输出和输入数据布局不匹配时分配临时数组。

    执行阶段:在这一阶段,应用会调用将 DNN 运算(包括必要的转换)应用于输入、输出和临时数组的 DNN 基元。

    针对训练和评分计算的适当示例可以在 MKL 包目录中找到:<mklroot>\examples\dnnc\source 

性能

Caffe 是一种由 Berkeley Vision and Learning Center (BVLC) 开发的深度学习框架,是最热门的图像识别社区框架之一。连同 AlexNet(用于图像识别的神经网络拓扑)和 ImageNet(标记图像数据库),Caffe 通常作为基准使用。下图展示了原始 Caffe 实施和 英特尔优化版的性能对比,后者利用英特尔® 至强® 处理器 E5-2699 v4(代码为 Broadwell)和英特尔® 至强融核处理器™ processor 7250(代码为 Knights Landing)上优化的矩阵与矩阵乘法和新的英特尔 MKL 2017 DNN 基元。

 

总结

英特尔 MKL 2017 中的 DNN 基元可用于加速英特尔架构上的深度学习工作负载。如欲了解详细信息,请参阅 MKL 开发人员参考手册和示例。

 

 

英特尔® 深度学习 SDK 教程:英特尔® 深度学习 SDK 训练工具入门指南

$
0
0

下载 PDF [PDF 1.85 MB]

修订历史

修订编号描述修订日期
001初始版本。2016 年 10 月
002Beta 版更新。2016 年 12 月

 

目录

1 简介
  
1.1 发布说明
  1.2 安装英特尔® 深度学习 SDK 训练工具
  1.3 英特尔® 深度学习 SDK 训练工具简介
    1.3.1 Home 选项卡
    1.3.2 Uploads 选项卡
    1.3.3 Datasets 选项卡
    1.3.4 Models 选项卡
    1.3.5 Advanced 选项卡
2 上传图像
3 创建一个训练数据集
  3.1 将源图像添加至数据集
  3.2 数据增加
  3.3 处理输入图像数据
    3.3.1 选择图像色度类型
    3.3.2 调整图像大小
  3.4 设置数据库选项
  3.5 生成数据集
4 保存、编辑和检查数据集
5 创建模型
  5.1 分配数据集
  5.2 配置模型拓扑
    5.2.1 创建定制拓扑
注:需要指出的是,对于定制拓扑(以及预先加载拓扑),您可以通过 Parameters 选项卡配置网络解析器。
注:目前无法在定制拓扑上运行模型测试。
  5.3 转换输入图像
  5.4 配置训练参数
  5.5 运行训练程序
6 保存、编辑和检查模型
7 高级特性
  7.1 Jupyter 笔记本电脑* 编辑器
  7.2 使用示例例程
  7.3 使用 Jupyter 笔记本电脑* GUI 编辑器
  7.4 使用 Jupyter 笔记本电脑* 终端控制台
  7.5 NNCompressor 工具
8 其它资源

1 简介

1.1 发布说明

请访问 https://software.intel.com/zh-cn/articles/deep-learning-sdk-release-notes获取发布说明。

1.2 安装英特尔® 深度学习 SDK 训练工具

如欲获取安装步骤,请查看英特尔® 深度学习 SDK 训练工具 安装指南

1.3 英特尔® 深度学习 SDK 训练工具简介

英特尔® 深度学习 SDK 训练工具是英特尔深度学习 SDK 的一个特性,后者是一套免费工具,支持数据科学家和软件开发人员开发、训练和部署深度学习解决方案。点击此处获取部署工具用户指南。

利用英特尔深度学习 SDK 训练工具,您将:

  • 轻松准备训练数据、设计模型、以及利用自动化实验和高级可视化技术训练模型。
  • 简化面向英特尔平台优化的常用深度学习框架的安装与使用流程。

训练工具是一款在 Linux* 服务器或 Apple macOS* 设备上运行的 web 应用,提供便于用户使用的直观界面,用于创建和训练深度学习模型。

当您打开训练工具并登录后,展现在您面前的是一个工作空间,左侧的蓝色面板上显示了主页和一系列主选项卡。这些选项卡提供一系列特性访问,支持上传源图像,创建训练数据集以及创建和训练您的深度学习模型。

1.3.1 Home 选项卡

利用 Home 选项卡,快速访问安装向导、近期事件和当前活动进程。

  1. 快速链接 (Quick Links) 面板支持上传图像文件、创建数据集和新的模型,或从 Home 选项卡直接获取更多信息。
  2. 主动 (Active) 面板跟踪当前运行进程的状态。面板显示实时模型的完成进度条和指示器。单击该面板的主动进程,将转至显示进程详细信息的概述页面。
  3. 通知 (Notifications) 面板显示关于进程完成程度的通知消息。
  4. 历史 (History) 面板显示最新事件堆栈。
  5. 近期 (Recent) 面板列出最新创建的对象:上传、数据集和模型。单击项目列表,将转至对象概述页面。

1.3.2 Uploads 选项卡

构建和训练模型前,通过 Uploads选项卡上传图像存档文件,将形成模型训练数据集。如欲获取详细信息,请查看 上传图像主题。

1.3.3 Datasets 选项卡

利用 Datasets面板,能够基于之前上传的图像创建数据集。数据集不只是一组图像,它是一个特定格式的数据库,按照类别保存所有图像。

创建数据集时,您可以改变图像颜色模式(例如,灰度或 RGB 颜色)、编码格式或将初始图像集与数据增加相乘,如将不同的转换应用于创建修改版本所需的原始图像。全部更改均存储于数据库中,不会影响原始文件。

您可以将整个图像集用于训练、验证和测试(为每个子集分配部分图像),也可以将每个步骤都放置在单独的文件夹中。

如欲获取更多信息,请查看“创建训练数据集”部分。

1.3.4 Models 选项卡

利用该选项卡,在现有的数据集基础上创建并训练您的模型。您可以在模型中应用 3 种预定义拓扑,也可以上传定制拓扑:

在配置模型的过程中,您可以将转换应用于选定数据集中的图像,无需更改原始图像文件。

每个预定义模型已经有了一组适用于普通用途的最佳默认参数值,Models 选项卡支持配置针对特定使用案例的学习过程。

如欲获取更多信息,请查看“创建模型”部分。

1.3.5 Advanced 选项卡

您可以通过 Advanced 选项卡访问嵌入式 Jupyter 笔记本电脑* 工具,后者是一款 web 应用,用于创建能够容纳并运行代码、可视化和文本的文档。该特性能够帮助您在命令行界面 (CLI) 模式下实施面向深度学习模型训练的 Python 脚本。

如欲获取更多信息,请查看“高级特性”章节。

2 上传图像

创建训练数据集前,需要上传用于模型训练的图像。

利用 Uploads选项卡将输入图像上传为存档文件,该存档文件的结构经过严格地预定义。

需将上传成功的存档文件内的全部图像分成单独的子文件夹,以所需的训练标签/类别命名。例如,用于训练 LeNet 模型的 0-9 位示例存档文件的结构如下所示:

digits.rar/
    0/
        0_01.png
        0_02.png…
    1/
        1_01.png
        1_02.png
	   …
       …

    9/
        9_01.png
        9_02.png
	   …

选择位于您电脑或 web 上的存档文件,并指定保存全部提取图像的根目录。

目录路径与 Docker 安装目录相关,是在安装训练工具的过程中指定的。如欲获取安装步骤,请查看安装英特尔® 深度学习 SDK 训练工具

Upload按钮下方的表格提供了已完成和当前运行上传的相关信息:

3 创建训练数据集

通过 Datasets选项卡,您将轻松创建训练数据集。首先单击选项卡,面板上将出现 New Dataset图标和之前保存的数据集列表:

您可以通过名称搜索并查看已保存的数据集,对其进行编辑、重命名和删除,也可以完成它们的生成过程。如欲获取更多信息,请查看保存、编辑和检查数据集

单击 New Dataset启动向导,开始创建数据集。向导屏幕包含以下元素:

  1. 数据集名称字段 (Dataset Name field) – 设置数据集的名称
  2. 数据集描述字段 (Dataset Description field) – 设置数据集的描述
  3. 数据集管理面板 (Dataset Manage panel) – 在任意步骤保存、运行或删除当前数据集。
  4. 导航面板 (Navigation panel) – 显示当前步骤和数据集创建步骤之间的切换。

向导将创建训练图像数据集的工作流程分为 3 个独立步骤,由向导屏幕中导航条上的选项卡显示:

  1. Data folder选项卡中定义包含源图像的文件夹以及训练、验证已经其他设置所需的文件数量。
  2. Image Preprocessing选项卡中对输入图像进行预处理设置。
  3. Database option选项卡中选择图像数据库选项。

当您需要修改设置时,可以通过 NextBack按钮切换不同的步骤,也可以直接单击导航条上的选项卡。

如欲终止创建数据集,请单击工具栏右上角的 Delete 按钮。

3.1 将源图像添加至数据集

创建数据集的第一步是设置名称和源文件夹。

Dataset Name字段中设置数据集名称,以便于在若干数据集中确认特定的数据集。选择一个有意义的名称,当您在创建模型时,才能在数据集列表中快速找到所需的数据集。

如需要,可以在 Description字段中添加数据集注释。

通过以下两种方法,指定添加至数据集的上传:

  • 利用 Server folder where images were uploaded to字段指定根文件夹目录,该文件夹保存您之前上传至系统的提取存档文件。如果您还没有完成该步骤,单击 New Upload按钮创建新的上传,也可以查看“上传图像”部分,进一步了解用于数据集的图像存档文件。
  • 单击箭头按钮 ,从下拉列表中选择一个现有的上传。

您可以在整个训练图像集中定义模型训练每一阶段所需的图像组:

  • 训练– 利用一系列图像示例训练模型。
  • 验证– 用于模型选择和超参数微调。
  • 测试– 用于模型的最终测试。

为了定义验证子集,在 Validation percentage字段中选择部分图像进行验证。默认值为 10%。

同样地,在验证时您也可以使用单独的文件夹。选择 Use other folder选项后,可以指定该文件夹。

注:如果您正使用其他文件夹进行验证,各个比例的字段重新设置为零。
类似地,您也可以通过在 Testing percentage字段中选择比例,定义测试子集。

注:如果您正在使用其他文件夹进行测试,不同比例的字段重新设置为零。

3.2 数据增加

您可以利用训练工具增加功能来扩展您的数据集。利用该工具,您可以通过创建现有图像的备份,以及应用多个转化(如旋转、偏移、缩放、反射),来放大数据集。

或者利用 Max number of transformations per image字段,轻松指定应用于每张数据集图像的最大转化数量。

您也可以借助“高级”章节,额外定义应用的转化种类、转化参数和权重。此处,权重是指选用的增大类型占已执行增大的比例,以百分比的形式表示。指定权重的越高,选用类型执行的增大越多。所有选用增大类型的权重总和为 100%。

有时,转化会导致部分未定义图像暴露。例如,放大图像后,可能在边界部分产生空白区域。请查看“填充方法”章节,获取填充增大图像空白区域的方法:

  • 常量法 (Constant) - 利用十六进制 RGB 格式颜色代码值填充缺失的像素。
  • 就近填充法 (Nearest) - 利用邻近像素值填充缺失的像素
  • 覆盖法 (Wrap) - 通过平铺图像的方式填充缺失的像素
  • 反射法 (Reflect) – 通过反射某个区域的图像填充缺失的像素

3.3 预处理输入图像数据

您可以利用 Image Processing选项卡,预处理数据集中的图像。

3.3.1 选择图像色度类型

该工具支持您使用图像的彩色或灰度模式。在 Type分组中选择所需的选项。

注:如果您选择灰度选项来创建 RGB 格式的彩色图像数据集,工具将自动执行单像素 RGB 转灰度的转化,公式如下所示:
Y = 0.299* 红色 + 0.587* 绿色+ 0.114* 蓝色
此处,Y 表示强度/灰度值。

注:如果您利用 Color 选项来处理灰度图像,算法将强度值用作红色、绿色和蓝色通道值:R = Y, G = Y, B = Y.

3.3.2 调整图像大小

在默认情况下,将尺寸调整为 28x28 像素,但是您可以利用调整尺寸选项,将图像调整为任意尺寸:

  • 挤压 (Squash)
  • 裁切 (Crop)
  • 填充 (Fill)
  • 半裁切、半填充 (Half crop, half fill)

利用上述调整方法,将原始尺寸为 128x174 像素的示例图像调整为 100x100 像素的方型图像,其结果如下表所示。

原始图像,128x174 像素

挤压:通过上采样或下采样像素,利用双三次插值填充新的宽度和长度,转化原始图像,未保持宽高比。

裁切选项:调整图像大小的同时保持了宽高比。首先调整图像的尺寸,使小型图像尺寸适合相应的目标尺寸。然后裁切增大的图像,使两侧的裁切尺寸完全相等,以适合相应的目标。

填充选项:调整图像大小的同时保持了宽高比。首先调整图像的尺寸,使大型图像适合相应的目标尺寸。将调整后的图像裁切为较小尺寸,将等宽的白色 noise 条插入图像两侧,使图像尺寸等于目标尺寸。

半裁切、半填充选项调整图像大小的同时保持了宽高比。首先,利用填充选项重新调整图像大小,然后应用裁切选项。为了分别转化原始图像和目标图像的尺寸 w(宽度)、h(高度)以及 W、H,需要将原始图像的尺寸调整为 W+(w-W)/2 和 H+(h-H)/2。为了实现这一目标,需要先通过填充进行转化,然后利用裁切转化将图像尺寸调整为目标尺寸 W、H

3.4 设置数据库选项

训练工具将全部输入图像存储在一个数据库文件中。通过这个步骤,您可以设置所需的数据库选项,如数据库类型和图像编码。

您可以利用 DB 后端下拉列表选择特定类型的数据库:

  • LMDB
  • LevelDB

如欲获取两种数据库类型的更多信息,请访问 LMDBLevelDB主页。

如有需要,请在 Image Encoding下拉列表中选择一种图像编码格式。使用 PNG 或 JPEG 格式将节省磁盘空间,但有可能训练延长时间。

3.5 生成数据集

配置数据集完成后,单击数据集管理面板上的 Run图标启动数据集生成程序。训练工具打开程序后,显示数据集生成程序的进度条和详细信息:

生成结束后,数据集右侧选项卡列表的状态改为 Complete

如欲获取关于保存数据集和数据集状态的更多信息,请查看“保存、编辑和检查数据集”

4 保存、编辑和检查数据集

单击Dataset选项卡后,Dataset面板上显示 New Dataset图标和之前保存的数据集列表。列表中的数据集状态可能属于以下三种状态之一:草稿 (Draft)就绪 (Ready)已完成 (Completed)

在设置所有必填字段前,可以随时将数据集保存为草稿就绪状态表明您成功为保存数据集设置了全部必填字段,可以直接生成数据集。已完成状态确定数据集已生成。

如欲查找数据集,在Search字段中输入数据集的独特名称。

您可以利用右上角的工具栏,重命名、编辑或删除处于草稿状态的数据集

对于就绪状态的数据集,还可以进行 Run操作:.

如欲查看或编辑处于草稿就绪状态的数据集,从列表中选择数据集,或单击工具栏中的 Edit图标。

如欲查看已完成数据集的详细信息,请从列表中选择数据集。

Dataset Info选项卡中,您可以找到创建日期、Docker* 图像数据集所在的物理路径及其尺寸。

Data folder选项卡包含训练、验证和测试数据集图表,显示每个类别中的图像数量。

Image processing选项卡显示图像类型、图像尺寸和裁切类型的相关信息。

Database options选项卡中,您可以查看数据集配置 (LMDB、LevelDB) 类型和压缩类型。

5 创建模型

上传图像以及利用图像生成数据集后,您可以开始创建与训练深度学习模型了。开始创建模型前,选择蓝色垂直面板中的 Models选项卡。在面板的 Search文本字段下显示 New Model图标和之前训练和创建的模型列表。

您可以通过搜索模型名称查看现有的模型,对它们进行重命名、编辑、创建或删除。如欲获取更多信息,请查看“保存、编辑和查看模型”

利用 New Model图标创建新的模型。单击后,将显示向导屏幕。

  1. 向导屏幕包含以下因素:
  2. 模型名称字段 (Model Name field) – 一个必填字段,用于设置模型名称。
  3. 模型描述字段 (Model description field) – 添加模型操作描述
  4. 模型管理面板 (Model manage panel) – 用于保存、运行训练或在任何步骤删除当前模型

导航面板 (Navigation panel) – 显示当前步骤和模型创建步骤之间的切换

如导航面板所示,新模型创建过程包括 4 个阶段。

  1. 通过 Dataset Selection选项卡,在生成的数据集列表中选择一个数据集。
  2. 通过 Topology选项卡选择并调试一个预定义拓扑。
  3. 如需要,通过 Data Transformation选项卡转化数据集图像。
  4. Parameters选项卡中配置默认参数,以调试学习过程。

5.1 分配数据集

创建模型的第一个阶段是选择数据集。

该阶段的第一个步骤是创建一个独特的模型名称,并在 Model Name文本字段中输入该名称。使用有意义的名称将便于您在模型列表中查找该模型。

为了今后能在众多模型中迅速确认该模型,训练工具提供了在 Description字段中输入模型说明文本的选项。

在任何时候,每个模型都应被连接到特定的数据集。下一步,选择一个为模型提供训练和验证图像的数据集。可以从数据集列表中选择一个数据集,也可以通过名称搜索数据集。单击 Next进入模型创建的第二个阶段。

5.2 配置模型拓扑

第二个阶段需要配置模型拓扑。

首先在 Topology name列表中选择一个模型拓扑,该列表提供以下 3 个预加载拓扑:

  1. LeNet
  2. AlexNet
  3. GoogLeNet

针对一般使用条件下的特定拓扑,预先利用最佳训练/验证设置对预加载拓扑进行了配置。但是,您可以通过查看 Fine tune topology复选框,自定义拓扑,使其满足特定需求。共有两种微调级别 - 轻度和中度 - 您可以根据需要挑选一个级别。您也可以选择不调试原始权重。以下步骤中的配置选项将根据微调选项和微调等级的选择而变化。

如需要,请单击蓝色面板底部的 Back/Next按钮在 4 个阶段之间切换。

5.2.1 创建定制拓扑

您可以改变普通预加载拓扑的结构,也可以创建新的拓扑。

单击拓扑名称对面的 Edit按钮,基于现有的拓扑创建一个定制拓扑。

该操作将打开一个包含两个字段的向导:

  1. 查看/修改拓扑 (View/Modify topology) - 包含描述网络拓扑的 .prototxt 文件(如欲查看实例,请访问 https://github.com/BVLC/caffe/blob/master/examples/mnist/lenet.prototxt
  2. 保存为定制拓扑 (Save as custom topology) – 为新拓扑指定一个名称

编辑完成后,保存拓扑,将在定制拓扑列表中显示。

NOTE:请注意,工具验证您所编辑的拓扑结构。只保存有效的拓扑。

现在,您可以使用新创建的定制拓扑,对您的模型进行训练。

注:需要指出的是,对于定制拓扑(和预加载拓扑),您可以利用 Parameters选项卡配置网络解析器。

注:目前,无法基于定制拓扑运行模型训练。

您也可以通过单击 Delete按钮删除定制拓扑。

5.3 转化输入图像

第三个步骤支持在图像传输至训练或验证模型前,对图像进行预处理。

您可以将 3 个可选预处理操作添加至训练数据。其中的两个预处理操作 - 裁切和水平镜像,随机应用于所选的训练图像,在某种程度上增加了训练过程的随机性。在对大型数据集进行图像分类过程中,这几类随机预处理被用于改善学习模型的性能,使其能够有效应对训练集中未包含的输入图像偏差。

如果选择了减去平均值,将适用于每一张图像,一共有两个选项:减去平均值图像或像素。

5.4 配置训练参数

在第四步也是最后一步中,针对调试和训练程序配置训练参数(例如超参数)。训练工具中的预加载模型为每一个参数字段指定默认值。在一般使用案例中,这些值是特定模型的最佳参数值。

深度学习模型的典型训练包括数十万个参数(亦称作权重),因此,训练集对模型进行了一次又一次的训练。全部训练数据集的一次完整传输被称作一个 epoch。单个 epoch 结束时,训练数据集中的每张图像都在模型中恰好传输了一次。您可以通过 Training epochs字段调整 epoch 的数量。这个数字取决于模型拓扑、参数估计算法(解析器类型)、初始学习速度和学习速度衰减曲线、所需的最终准确性以及训练数据集的大小。

在单次 epoch 中,训练数据集的图像划分为不同批次,每次模型利用一个批次进行训练。单个批次的图像全部经过模型后,模型参数得到更新,继续使用下一个批次。这样的一次传递被称作一次迭代。总体来说,较大的批次尺寸会降低参数更新过程的偏差,加快转换速度。然而,在训练过程中,较大的批次尺寸会增加内存使用。

通过指定 Validation interval值,可以定义在指定 epoch 数量内进行验证的次数。例如,将数值设置为 1,在每次 epoch 结束时进行验证。利用 Validation batch size值来定义验证图像批次的大小。

训练深度学习模型是一项漫长又复杂的任务,因此,工具定期生成快照,备份正在训练的模块状态和解析器状态。如欲设置备份的频率,请使用 Snapshot intervals 字段。

参数(或权重)估算不仅面向训练数据集优化损失/误差函数,估算的权重还应该将模型应用于不可见的新数据。通过Weight decay设置可以调整模型的正则项,以避免过适现象。

学习速度决定了更新步骤对当前模型权重值的影响程度。较快的学习速度将极大影响更新,导致极小值周围的振荡或同时失去极小值。基本学习速度是学习过程开始阶段的初始学习速度。

动量项捕获前一个权重更新的方向,有助于帮助减少振荡,降低在本地最小值陷入困难的可能性。动量项在 0 和 1 之间,通常使用较高数值,如 0.9。然而,使用较高的动量项时,应降低学习速度,这点对于避免过度权重更新来说很重要。

您可以从可选类型列表中选择解析器类型,默认的类型是随机梯度下降。

使用高级学习速度选项 进一步指定在训练过程中学习速度的变化。

您可以从以下几种学习速度策略(或曲线)中选择。

步长 (Step size) 决定调整学习速度的频率(在若干次迭代中)。

Gamma控制每个调整步骤的学习速度变化数量(决定学习速度函数形状)。

通过勾选 Visualize LR复选框,将以曲线的形式直观显示学习速度。

5.5 运行训练程序

完成模型配置后,通过单击模型管理面板 上的 Run图标启动模型训练程序。训练工具打开该程序,显示进度条和模型训练时的状态:

训练完成后,模型状态在训练完成列表中更改状态。

如欲获取关于保存模型和模型状态的更多信息,请查看“保存、编辑和检查模型”

6 保存、编辑和检查模型

单击 Models后,Models面板将显示 New Model图标和之前保存的模型列表。该列表中的模型状态可能属于以下三种状态之一:草稿就绪测试完成

设置全部必填字段前,只能将模型保存为草稿就绪状态显示您已为保存的模型成功设置了全部必填字段,模型可随时进行训练。训练完成状态表示模型已经完成了对相关数据集的训练。

通过 Search字段,利用独特的名称查找模型。

您也可以利用右上角的工具栏,在 Draft state重命名编辑删除模型

对于处于就绪状态的模型,可以额外进行 Run操作:.

如欲查看或编辑草稿就绪状态的模型,从列表中选择该模型,或单击工具栏中的 Edit图标。

对于训练完成状态的模型,可以进行重命名复制删除操作:.

如欲查看已完成模型的详细信息,请从列表中选择该模型。选择模型后,将重新定向到 View model页面。

Information 选项卡中,您可以查找关于训练事件、epoch 次数、训练、验证和测试准确性的数据。选项卡的下方是一个图表,显示错误值、损失和学习速度的动态变化。

如欲下载模型,请访问 Information选项卡右上方的 Download链接。单击后,将出现一个浏览器对话框,建议您接受下载存档文件,该文档包含上一次训练 epoch 的模型快照。

Model Analysis选项卡中,您可以检查面向验证和测试数据集(前提是在配置模型时指定了数据集)的模型分类结果。

单击Show more按钮打开 Confusion Matrix

如果模型刚开始训练,至少完成一个训练 epoch 后,才能使用混淆矩阵。训练结束后,将在屏幕上方显示具体通知。混淆矩阵包含特定数据集(测试或验证)的一般模型性能信息,还包含命中和未命中数据、准确性、F1 分数等。

Dataset 选项卡中有一个表格,包含来自指定数据集(测试或验证)的图像,以及对每张图像的前 5 个预测。

该表可以滚动,您可以逐一查看每张图像。

Testing选项卡中,可以利用单个图像测试经过训练的模型。提供输入图像、预览图像并运行测试。完成测试后,您将看到指定图像的前 5 名预测,您可以手动查看模型测试任意图像的正确性。

Details选项卡显示在训练前指定的模型配置参数的快照。

7 高级特性

7.1 Jupyter 笔记本电脑* 编辑器

作为一项高级特性,训练工具提供了嵌入式 Jupyter 笔记本电脑* 编辑器,支持访问配有 Caffe* 框架的 Docker* 容器,该容器已在电脑上安装。您可以开发和运行您的 Python 脚本,利用训练工具用户界面复制整个工作流程,包括:

  • 上传图像文件
  • 生成数据集
  • 创建和训练深度学习模型。

您可以使用 基于 GUI 的编辑器或 Jupyter 终端CLI 控制台,开发您的个人脚本。

终端还支持访问上传、数据集和模型文件。

如欲获取关于 Jupyter 笔记本电脑的更多信息,请查看快速启动指南

注:需要指出的是,利用 CLI 创建的全部对象(图像上传、数据集和模型)无法在用户界面获取。

单击 Advanced选项卡后,显示 Jupyter 指示板页面:

在这个页面中,您将找到为您提供的示例笔记本电脑文件,运行 GUI 编辑器或打开终端控制台,创建您的 Python 脚本。

7.2 使用示例例程

共有两个笔记本电脑文件提供关于实施训练过程、执行图像分类的逐步指导。

示例文件包含解释性文本和每个步骤的可执行 Python 代码段。如欲运行某个代码段,选择该代码段并单击工具栏中的 按钮(Shift+Enter)。如欲终止执行代码,单击 按钮(I,I)。

00-classification.ipynb

根据该示例,利用部署于 Caffe* 框架的捆绑式预训练 CaffeNet* 模型浏览图像分类流程。该示例提供了所有必要步骤的详细描述,从加载到利用定制图像测试模型。

01-learning-lenet.ipynb

本示例详细描述了训练示例 LeNet-based 模型的步骤。

7.3 使用 Jupyter 笔记本电脑* GUI 编辑器

你可以利用 Jupyter 笔记本电脑* GUI 创建您的定制 Python 脚本。通过单击 New按钮打开编辑器,然后从下拉列表中选择 Python 2项目:

7.4 使用 Jupyter 笔记本电脑* 终端控制台

作为 GUI 编辑器的备选方案,您可以利用终端控制台创建您的 Python 脚本。

单击 New按钮打开终端,并从下拉列表中选择 Terminal项目:

除了开发脚本,您还可以通过终端访问所有工作流程对象:上传、数据集和模型文件。

在安装过程中,您已经指定了文件系统路径,该路径可以作为 Docker* 容器(Mount file system path设置)中的卷安装。在目录内,安装程序创建了保存全部上传、数据集和模型对象的 /dlsdk 目录。该目录和 Docker 环境中的 /workspace/dlsdk 目录相匹配,具有以下结构:

/workspace/dlsdk/
	custom-topologies/
	jobs/
		datasets/
		models/
	notifications/
security/
temp/
uploads/

注:需要指出的是,Jupyter 的默认目录为 /opt/jupyter。这导致 Docker 更新至新版后,文件被删除。为了将文件保存至服务器文件系统,需要将 /workspace/ 目录用作工作目录。

7.5 NNCompressor 工具

英特尔® 深度学习 SDK 训练工具还提供了 NNCompressor 工具,该工具能够显著降低卷积神经网络的复杂性。该工具实施了 低秩近似算法 (LRA),并作为 nncompress Python 模块进行部署,可以在 Jupyter* 终端控制台中使用。

如欲获取关于该工具的更多信息,请查看在发行包内部交付的 NNCompressor-README.html文件。

8 其它资源

如欲向其他英特尔® 深度学习 SDK 训练工具用户咨询问题并分享信息,请访问英特尔® 深度学习 SDK 论坛

在 Amazon Web Services* (AWS) 上分布式训练深度网络

$
0
0

下载文档

Ravi Panchumarthy(英特尔)、Thomas “Elvis” Jones (AWS)、Andres Rodriguez(英特尔)和 Joseph Spisak(英特尔)

深度神经网络具备出色的高级表达功能,并在诸多领域展示了一流的准确性,如计算机视觉、语音识别、自然语言处理以及各种数据分析领域。深度网络需要训练大量的计算,训练时间通常持续数天甚至数周。英特尔正在优化常见的框架,如 Caffe*、TensorFlow* 和 Theano* 等,以显著提升性能,缩短单个节点的训练总时间。此外,英特尔还在添加或增强上述框架的多节点分布式训练功能,以在多个节点间分享计算要求,进一步缩短训练时间。之前训练一个工作负载需要数天时间,现在只需数小时。阅读以了解更多信息

Amazon Web Services* (AWS) 虚拟私有云 (VPC) 提供了支持多节点分布式深度网络训练的绝佳环境。AWS 和英特尔展开合作,致力于创建一套构建集群的简单脚本,支持开发人员利用强大的 AWS,轻松部署并训练深度网络。本文提供了设置 AWS CloudFormation* 环境的具体步骤,以便利用 Caffe 网络训练深度网络。

AWS CloudFormation 设置

按照以下步骤创建一个 VPC,将一个 Elastic Compute Cloud (EC2) t2.micro 实例用作 AWS CloudFormation 集群 (cfncluster) 控制器。接下来,利用这个 cfncluster 控制器在 VPC 中创建一个由主 EC2 实例和若干计算 EC2 实例组成的集群。

部署 Cloudformation 和 cfncluster 的步骤

  1. 使用 AWS 管理控制台启动 AWS CloudFormation (见图 1)。


    图 1.Amazon Web Services 中的 CloudFormation

  2. 单击 Create Stack
  3. 在标记的位置,选择一个模板(见图 2),选择 Specify an Amazon S3 template URL,然后输入 https://s3.amazonaws.com/caffecfncluster/1.0/intelcaffe_cfncluster.template。单击 Next


    图 2.输入模板 URL。

  4. 为堆栈命名,如 myFirstStack。选择一个密钥对,查找您刚刚命名的密钥对(如果您需要创建一个密钥对,请遵照本说明)。保留剩余的参数。单击 Next
  5. 输入一个密钥,如 name,然后输入一个值,如 cfnclustercaffe
    需要指出的是,您可以自主命名密钥和值。名称不需要匹配之前步骤创建的密钥对。
  6. 单击 Next
  7. 检查堆栈,选中确认选框,然后单击 Create。创建堆栈过程可能需要几分钟的时间,请在创建过程中耐心等待,直到 3 个堆栈的状态全部显示为 CREATE_COMPLETE。
  8. 第三步使用的模板调用了其他两个嵌套模板,创建了一个配有 EC2 t2.micro 实例的 VPC(见图 3)。选择配有 EC2 实例的堆栈,然后选择 Resources。单击 cfnclusterMaster 的物理 ID。


    图 3.在 Resources 选项卡中选择物理 ID。

  9. 将转至 AWS EC2 控制台(图 4)。Description 的下面是 VPC ID 和子网 ID,请记下它们,因为会在随后的步骤中用到。右键点击实例,选择 Connect并按照说明操作。


    图 4.AWS EC2 控制台。

  10. 您通过 ssh 命令进入实例后,需要利用以下命令,修改集群的配置:

    cd .cfncluster
    cp config.edit_this_cfncluster_config config
    vi config

  11. 按照 config 文件中的注释(用第九步的最后一个命令打开)填写适当信息。
    • 从 AWS 系统管理员处获取 AWS_ACCESS_KEY 和 AWS_SECRET_ACCESS_KEY(如果您没有的话)或 按照本步骤获取

    需要指出的是,虽然主节点没有标记为计算节点,却相当于一个计算节点。因此,如果训练过程中使用的节点总数为 32,需要选择一个 queue_size = 31 的计算节点。

    • 使用第八步获取的 VPC ID 和子网 ID。
    • 目前使用的最新版 custom_ami 是 ami-77aa6117;新版 AMI 发布后,将更新本文内容。
  12. 利用以下命令启动集群:cfncluster create
    <vpc_name_choosen_in_config_file>
    .将启动更多的 AWS CloudFormation 模板。您可以通过 AWS 管理控制台中的 AWS CloudFormation 页面查看这些模板。

训练几个常见网络所需的示例脚本

cloud-formation-setup 完成后,如果您将集群的大小配置为 N,将创建 N+1 个实例(1 个主节点和 N个计算节点)。需要指出的是,主节点也被创建为计算节点。在创建的集群中,全部 N+1 个实例共享一个磁盘。实例包含英特尔 caffe、英特尔® 数学核心函数库(英特尔® MKL)和用于训练 CIFAR-10 和 GoogLeNet 的示例脚本。开始训练示例网络前,请登录主节点。

如欲利用现成的解析器和 train_val prototxt 文件开始训练一个 CIFAR-10 模型,请运行以下命令:

cd ~/scripts/
./aws_ic_mn_run_cifar.sh

开始训练 GoogLeNet 模型前,下载脚本所需的 ImageNet 数据集,并配置变量 path_to_imagenet_train_folderbatchsize_pernode和其他变量(如需要),并运行 ./aws_ic_mn_run_googlenet.sh 脚本

cd ~/scripts/
#Edit variables path_to_imagenet_train_folder, batchsize_pernode and others if required
vi ./aws_ic_mn_run_googlenet.sh
./aws_ic_mn_run_googlenet.sh

脚本 aws_ic_mn_run_cifar.sh创建了一个 hosts 文件 (~/hosts.aws),包含了 VPC 中所有实例的 IP 地址。然后更新解析器和位于 ~/models/cifar10/中的 train_val prototxt 文件。您可以根据自己的需求修改这些 prototxt 文件。aws_ic_mn_run_cifar.sh脚本将打开数据服务器,将数据传输至计算节点。由于数据服务器和计算一起运行,将在主节点产生一定的开销。启动数据服务器后,利用 mpirun 命令启动分布式训练。

脚本 aws_ic_mn_run_googlenet.sh创建了一个 hosts 文件 (~/hosts.aws),包含 VPC 中所有实例的 IP 地址。和 CIFAR-10 示例(由数据服务器提供数据)不同,在 GoogLeNet 训练中,每个 worker 将读取各自的数据。该脚本将基于模板解析器和位于~/models/googlenet/的 train_val prototxt,为每个 worker 创建单独的解析器、train_val prototxt 文件和 train.txt 文件。您可以修改这些模板 prototxt 文件,使其满足您的训练需求。aws_ic_mn_run_googlenet.sh脚本稍后将利用 mpirun 命令启动该任务。

声明

英特尔和 Intel 标识是英特尔在美国和/或其他国家的商标。*其他的名称和品牌可能是其他所有者的资产。©英特尔公司。

英特尔技术的特性和优势取决于系统配置,并需要借助硬件、软件或服务来实现。实际性能会因您使用的具体系统配置的不同而有所差异。任何计算机系统都无法提供绝对的安全性。请联系您的系统制造商或零售商,或访问 intel.cn,了解更多信息。

在性能检测过程中涉及的软件及其性能只有在英特尔微处理器的架构下方能得到优化。诸如 SYSmark 和 MobileMark 等测试均系基于特定计算机系统、硬件、软件、操作系统及功能,上述任何要素的变动都有可能导致测试结果的变化。请参考其它信息及性能测试(包括结合其它产品使用时的运行性能)以对目标产品进行全面评估。

如欲了解更多信息,请访问 http://www.intel.com/performance

Viewing all 583 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>