前语
在4月19号的旧金山AWS技能峰会上,亚马逊CTO Werner Vogels宣告了多项AWS新功用,其间就包含世人期待已久的FPGA实例F1。
F1 实例配有最新的 16 nm Xilinx UltraScale Plus FPGA,现在有f1.2xlarge和f1.16xlarge两种类型,其间f1.2xlarge配备有1个FPGA卡, f1.16xlarge配备有8个FPGA卡。
运用 F1 实例布置硬件加速在许多高性能核算 (HPC) 应用程序中非常有用,可解决需求高带宽、增强型联网和较高核算才干的杂乱科学、工程和事务问题。F1 实例特别适用于有时刻要求的应用程序,如临床基因组学、实时视频处理和财政危险剖析。
由于这段时刻都在学习神经网络,所以F1实例最招引我的是在FPGA上布置神经网络模型,神经网络的前向核算以高频脉冲的办法一起发生在门电路构成的神经网络单元上,想想都让人激动。
不过FPGA这个东西的确太专业了,入门学习曲线不是一般的陡,发动F1实例运转一个简略的Hello World都需求折腾一番。
所以在这儿记载一下自己发动F1实例运转Hello World的进程,供各位参阅,期望能够让咱们开端开端FPGA的旅程。
发动f1实例
f1实例的发动进程和一般的EC2发动进程相似,有关AWS账号的预备,EC2创立进程的细节请咱们参阅相关技能文档。以下只列出一些需求留意的当地。
测验时我挑选了“弗吉尼亚北部”这个区域,也便是us-east-1区域。
发动f1实例时强烈推荐运用 AWS FPGA Developer AMI 镜像, FPGA Developer AMI 包含一个预先打包的东西开发环境,其间含有用于模仿 FPGA 规划、编译代码及构建和注册 AFI 的脚本和东西。
在发动实例的第一步,挑选体系镜像的时分挑选“AWS Marketplace”,然后查找“FPGA”就能够找到FPGA Developer AMI, 该镜像在弗吉尼亚北部区域的ID为:ami-3afc6f2c,镜像挑选界面截图如下。
发动进程中留意给你的实例指定一个IAM Role, 后续运用AWS CLI指令行东西的时分就需求装备静态的Access Key和Secret Key了。
还有便是安全组装备,缺省的22号端口保存翻开状况,别的主张开3389端口,后续假如你期望运用长途衔接的办法运用图形化界面需求用到这个端口。
还有一个不需求再着重的便是你发动的f1实例需求有公有IP。
体系登录
在f1实例发动后在EC2控制台上找到这台实例的公有IP地址,然后经过ssh指令衔接该实例,留意运用的用户名是centos, ssh指令样例如下:
ssh -i ~/.ssh/ centos@
登录今后能够看到下面的信息:
___ ___ ___ _ ___ _____ __ _ __ __ ___
| __| _ / __| /_ | | __ / / /_ | / |_ _|
| _|| _/ (_ |/ _ | |) | _| V / / _ | |/| || |
|_| |_| ___/_/ _ |___/|___| _/ /_/ __| |_|___|
AMI Version: 1.2.0
Readme: /home/centos/src/README.md
GUI Setup Steps: /home/centos/src/GUI_README.md
AMI Release Notes: /home/centos/src/RELEASE_NOTES.md
Xilinx Tools: /opt/Xilinx/
Developer Support: https://github.com/aws/aws-fpga/blob/master/README.md#developer-support
留意这儿说到的GUI设置阐明文档: /home/centos/src/GUI_README.md,假如你后续期望运用图形化界面,请参阅这个文档进行操作。
克隆AWS FPGA项目
在长途f1实例上创立一个作业目录,在该作业目录下履行以下指令克隆AWS FPGA 项目:
git clone https://github.com/aws/aws-fpga.git
履行完结今后能够看到一个aws-fpga目录
装置 FPGA SDK
进入aws-fpga目录,然后履行以下指令装置FPGA SDK:
source sdk_setup.sh
装置指令履行完今后会有以下输出,标明装置成功:
Done with SDK install.
Done with AWS SDK setup.
这个进程会装置好FPGA管理东西,经过这个管理东西能够查看FPGA卡的状况,列出FPGA卡上的镜像状况,还能够履行加载镜像等操作。
首要咱们能够经过fpga-describe-local-image-slots指令查看FPGA卡的状况,这儿便是FPGA的“image slot”的状况,详细指令请如下:
sudo fpga-describe-local-image-slots -H
在我的 f1.2xlarge 实例上有如下输出:
$ sudo fpga-describe-local-image-slots -H
Type FpgaImageSlot VendorId DeviceId DBDF
AFIDEVICE 0 0x1d0f 0x1042 0000:00:1d.0
这儿列出的便是slot 0的状况,接着你能够运用fpga-describe-local-image-slots指令查看这个slot上的FPGA镜像状况:
sudo fpga-describe-local-image -S 0
其间参数 -S 用于指定期望查看的image slot,参数值便是FPGA image slot的编号。
假如你期望将新的FPGA镜像加载到一个image slot上, 你能够运用指令 fpga-load-local-image, 一起经过参数 -S指定image slot的编号,经过-I参数指定需求加载的FPGA镜像ID,如:
sudo fpga-load-local-image -S 0 -I agfi-0123456789abcdefg
有关FPGA管理东西的更多信息,请参阅以下链接:
https://github.com/aws/aws-fpga/blob/master/sdk/userspace/fpga_mgmt_tool…
装置FPGA HDK
装置好FPGA的SDK今后就需求装置FPGA HDK了,详细的装置指令如下:
source hdk_setup.sh
这个进程稍长一点,或许需求5到10分钟,履行的指令的时分输出成果中也有提示:
AWS FPGA-INFO: This could take 5-10 minutes, please be patient!
假如全部正常,装置成功后会有如下信息:
AWS FPGA-INFO: DDR4 model build passed.
AWS FPGA-INFO: ATTENTION: Don't forget to set the CL_DIR variable for the directory of your Custom Logic.
AWS FPGA-INFO: AWS HDK setup PASSED.
如成功信息里提示的,假如你今后要构建自己的FPGA模块,需求将CL_DIR变量指向你的模块目录,咱们在后续的进程中会进行设置。
装备 AWS CLI
由于FPGA镜像创立进程需求运用AWS CLI指令行东西,所以咱们需求提早装备好AWS CLI。
在咱们运用的这个FPGA Developer AMI中AWS CLI指令行东西现已装置好了,假如你运用其它镜像需求手艺装置AWS CLI的话请参阅AWS CLI指令行东西的装置文档。
需求留意的时,尽管在FPGA Developer AMI中现已装置好了AWS CLI,但是这个版别纷歧定是最新的,所以主张经过以下指令先进行晋级:
pip install –upgrade –user awscli
然后就经过以下指令发动AWS CLI装备进程:
aws configure
在装备AWS CLI的进程中一般需求供给Access Key和Secret Key,不过咱们的f1实例在发动进程中拟定了IAM Role, 并且我给这个IAM Role满足的权限,所以咱们这儿不需求装备静态的Access Key和Secret Key,咱们要做的仅仅指定区域,这儿咱们指定区域为us-east-1。
$aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: us-east-1
Default output format [None]:
构建DCP
装置好HDK,装备好东西,就能够开端跑样例了,这儿咱们运用AWS FPGA项目里的hello world样例,该样例在aws-fpga中的以下目录中:
./hdk/cl/examples/cl_hello_world
如之前装置进程中说到的,假如咱们运用目录./hdk/cl/examples/cl_hello_world中的样例,咱们需求设置CL_DIR变量指向./hdk/cl/examples/cl_hello_world目录,详细指令如下:
cd ./hdk/cl/examples/cl_hello_world
export CL_DIR=$(pwd)
接下来的作业需求运用Xilinx Vivado东西,所以咱们需求查看一下vivado东西是否装置正常,详细指令如下:
$ vivado -mode batch
正常的输出如下:
****** Vivado v2017.1 (64-bit)
**** SW Build 1846317 on Fri Apr 14 18:54:47 MDT 2017
**** IP Build 1846188 on Fri Apr 14 20:52:08 MDT 2017
** Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.
Sourcing tcl script '/opt/Xilinx/Vivado/2017.1/scripts/Vivado_init.tcl'
INFO: [Common 17-206] Exiting Vivado at Fri Apr 21 02:42:35 2017…
现在咱们能够开端构建DCP了,构建指令在$CL_DIR/build/scripts中,文件名是aws_build_dcp_from_cl.sh,所以详细指令如下:
cd $CL_DIR/build/scripts
$ ./aws_build_dcp_from_cl.sh
需求留意的是,这个指令的运转时刻比较长,需求几个小时的时刻才干完结。为了防止ssh会话中止导致构建失利,样例的作者挑选在后台运转建构进程。在咱们运转aws_build_dcp_from_cl.sh指令之后,会立刻取得以下输出,不过构建程序会在后台继续运转:
$ ./aws_build_dcp_from_cl.sh
AWS FPGA: Starting the design checkpoint build process
AWS FPGA: Checking for proper environment variables and build directories
Creating the reports directory
Creating the checkpointss directory
Creating the checkpoints/to_aws directory
AWS FPGA: Environment variables and directories are present. Checking for Vivado installation.
AWS FPGA: Build through Vivado is running as background process, this may take few hours.
AWS FPGA: Output is being redirected to 17_04_21-025018.nohup.out
AWS FPGA: If you have set your EMAIL environment variable and -notify is specified, you will receive a notification when complete.
AWS FPGA: (See $HDK_DIR/cl/examples/README.md for details)
在以上输出中咱们能够留意到,构建日志会输出到文件xxxx.nohup.out中,所以咱们能够守时查看这个日志文件然后了解构建进程.
当然,时不时跑过来看看日志文件看看是不是构建完结了并不是一个很有用的办法,假如你期望构建程序在完毕的时分给你发一封邮件,能够运用-notify参数,运用-notify参数前需求经过以下指令设置SNS:
$ export EMAIL=your.email@example.com
$ ./$HDK_COMMON_DIR/scripts/notify_via_sns.py
有关-notify参数的更多信息请参阅对应的READMD.md文件,本例中就不设置了,选用守时查看日志的笨办法。
在构建完毕后,咱们能够在xxxx.nohup.out文件中看到以下信息:
AWS FPGA: (07:00:53) Finished creating final tar file in to_aws directory.
然后你能够查看一下这个目录:$CL_DIR/build/checkpoints/to_aws,目录中会有打包好的tar文件,履行ls指令的成果如下:
$ ls checkpoints/to_aws
17_04_21-025018.Developer_CL.tar 17_04_21-025018.manifest.txt 17_04_21-025018.SH_CL_routed.dcp
上传文件到S3
在构建的dcp今后,咱们需求将tar文件上传到S3上,然后才干经过AWS CLI指令构建FPGA image。
为了上传文件到S3上,咱们需求创立对应的S3桶,这个进程能够经过AWS控制台完结,也能够运用AWS CLI指令行东西完结,有关S3的详细操作请参阅相关文档。
本例运用AWS CLI来创立S3桶并上传文件,指令参阅如下:
$ aws s3 mb s3:// –region us-east-1
$ aws s3 cp $CL_DIR/build/checkpoints/to_aws/*.Developer_CL.tar s3:////
接着咱们还需求为日志文件创立一个目录,其实在S3上没有目录的概念,整个文件途径和文件名便是这个文件的key,所以样例中创立目录的办法便是直接上传一个空文件到咱们需求的目录中,详细指令如下:
$ touch LOGS_FILES_GO_HERE.txt
$ aws s3 cp LOGS_FILES_GO_HERE.txt s3:////
由于咱们上传的tar文件最终会交由AWS对应账号完结构建作业,一起构建日志还需求由AWS对应账号写回到咱们的S3桶中,所以咱们需求为咱们的S3桶设置桶拜访战略,让AWS账号能够拜访这些文件和目录。详细的拜访战略样例如下,咱们需求把下面的战略装备复制到咱们的S3桶的“拜访战略”设置中。留意样例中的 和 等内容,要把它们修正成实在的桶名和对应途径。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Bucket level permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::365015490807:root"
},
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::"
},
{
"Sid": "Object read permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::365015490807:root"
},
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3::://"
},
{
"Sid": "Folder write permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::365015490807:root"
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3::://*"
}
]
}
设置完S3的桶拜访战略今后咱们需求验证一下战略写的对不对,不然战略写错了,AWS对应账号拿不到需求的tar文件,就不能成功构建FPGA image了,并且咱们剖析问题还不知道怎么下手。
验证S3桶战略的脚本在下面这个文件里:
`aws-fpga/hdk/common/scripts/check_s3_bucket_policy.py`
假如履行呈现INFO: Passed字样就标明战略设置正确。
不过在有些python环境下check_s3_bucket_policy.py运转会报下面这个过错:
AttributeError: PolicyStatement instance has no attribute 'principals_re'
发现这个过错的话需求手艺改一下check_s3_bucket_policy.py文件。
用你习气的编辑器翻开文件check_s3_bucket_policy.py,然后找到下面的代码:
class PolicyStatement:
def __init__(self, statement, principal=None):
self.statement = statement
self.process_policy_statement(statement, principal)
self.principals_re = []
self.actions_re = []
self.notactions_re = []
self.resources_re = []
然后把self.process_policy_statement(statement, principal)这句放到其它变量设置之后,像下面这样:
class PolicyStatement:
def __init__(self, statement, principal=None):
self.statement = statement
self.principals_re = []
self.actions_re = []
self.notactions_re = []
self.resources_re = []
self.process_policy_statement(statement, principal)
然后就不会报错了,详细运转check_s3_bucket_policy.py指令的参阅和对应输出如下:
$ check_s3_bucket_policy.py –dcp-bucket fpga.use1.damondeng.com –dcp-key fpgajarfile/17_04_21-025018.Developer_CL.tar
–logs-bucket fpga.use1.damondeng.com –logs-key logfile
INFO: Passed
全部预备好就能够开端运转 aws ec2 create-fpga-image 指令构建FPGA image了,指令参阅如下:
$ aws ec2 create-fpga-image –name DamonFPGAOne
–description "Testing FPGA Image" –input-storage-location Bucket=fpga.use1.damondeng.com,Key=fpgajarfile/17_04_21-025018.Developer_CL.tar
–logs-storage-location Bucket=fpga.use1.damondeng.com,Key=logfile
假如你发现AWS CLI指令报下面这个过错,则你的AWS CLI版别不行,需求运转pip install –upgrade –user awscli进行晋级:
Invalid choice: 'create-fpga-image', maybe you meant:
* create-image
*
运转正常的状况下你会取得相似这样的输出:
{
"FpgaImageId": "afi-046ead8eb3a0e3112",
"FpgaImageGlobalId": "agfi-06fdb0f3cea076195"
}
其间”FpgaImageId”是本区域仅有的image ID,”FpgaImageGlobalId”是全球仅有的image ID,后边咱们加载FPGA image时要运用过的是全球仅有的”FpgaImageGlobalId”,以agfi最初。
开端构建FPGA image后需求等候一段时刻,你能够查看你指定的保存日志的S3桶以了解发展。
假如你在日志目录里看到有个新目录发生,里边有个叫State的文件中呈现{State=available} 字样就标明构建成功了。接着就能够加载你的FPGA image了。
在加载新的FPGA image之前记住先铲除现有image:
sudo fpga-clear-local-image -S 0
接着经过以下指令加载FPGA image:
sudo fpga-load-local-image -S 0 -I agfi-06fdb0f3cea076195
如之前描绘的,这儿-S参数用于指定image slot,-I参数用于指定FPGA image的镜像ID,留意是全球仅有,以agfi最初的镜像ID。
为了查看FPGA image是否加载成功,能够运用fpga-describe-local-image指令,履行输出的样例如下:
$ sudo fpga-describe-local-image -S 0 -R -H
Type FpgaImageSlot FpgaImageId StatusName StatusCode ErrorName ErrorCode ShVersion
AFI 0 agfi-06fdb0f3cea076195 loaded 0 ok 0 0x04151701
Type FpgaImageSlot VendorId DeviceId DBDF
AFIDEV%&&&&&%E 0 0x1d0f 0xf000 0000:00:1d.0
其间能够看到镜像ID为agfi-06fdb0f3cea076195的状况是loaded,便是加载成功了。
最终咱们就需求运转宿主机上的软件端来测验了,进入cd $CL_DIR/software/runtime/目录,这儿有个写好的c的代码用于测验,运转以下指令编译软件测验端:
$ cd $CL_DIR/software/runtime/
$ make all
编译成功后经过./test_hello_world指令履行,以下是履行成果:
$ sudo ./test_hello_world
AFI PCI Vendor ID: 0x1d0f, Device ID 0xf000
===== Starting with peek_poke_example =====
register: 0xdeadbeef
Resulting value matched expected value 0xdeadbeef. It worked!
Developers are encourged to modify the Virtual DIP Switch by calling the linux shell
command to demonstrate how AWS FPGA Virtual DIP switches can be used to change a CustomLogic functionality:
$ fpga-set-virtual-dip-switch -S (slot-id) -D (16 digit setting)
In this example, setting a virtual DIP switch to zero clears the corresponding LED, even if the peek-poke example would set it to 1.
For instance:
# fpga-set-virtual-dip-switch -S 0 -D 1111111111111111
# fpga-get-virtual-led -S 0
FPGA slot id 0 have the following Virtual LED:
1010-1101-1101-1110
# fpga-set-virtual-dip-switch -S 0 -D 0000000000000000
# fpga-get-virtual-led -S 0
FPGA slot id 0 have the following Virtual LED:
0000-0000-0000-0000
这个样例有两部分,一部分是peek_poke部分,便是寄存器的读写。样例为了阐明FPGA寄存器的功用是否起作用,将输入的比特位做了交流。
如./test_hello_world.c中的代码所描绘的:
uint32_t value = 0xefbeadde;
uint32_t expected = 0xdeadbeef;
/* read it back and print it out; you should expect the byte order to be
* reversed (That's what this CL does) */
第二个部分是虚拟LED的运用,测验者能够经过FPGA管理东西设置virtual-dip开关,以相似掩码的方式影响虚拟LED的显现,比方,本来虚拟LED的输出是1010-1101-1101-1110我经过fpga-set-virtual-dip-switch 设置了 1111111100000000值, 虚拟LED的输出便是1010-1101-0000-0000:
[centos@ip-172-31-8-87 runtime]$ sudo fpga-set-virtual-dip-switch -S 0 -D 1111111100000000
[centos@ip-172-31-8-87 runtime]$ sudo fpga-get-virtual-led -S 0
FPGA slot id 0 have the following Virtual LED:
1010-1101-0000-0000
到这儿咱们的Hello World就成功啦,尽管比一搬的软件Hello World费事很多,但是要知道这儿但是直接控制硬件喔。
后续作业
在跑完Hello World样例今后或许会有不少人想了解这个开发环境的图形化拜访的问题。
如文中说到的,当你经过SSH登录到FPGA实例时,FPGA Developer AMI的欢迎文字中有说到GUI界面的设置。这儿说到的办法归纳起来便是在centos上发动xrdp,然后经过MS的长途桌面程序进行衔接。
在centos端的指令复制如下:
sudo yum install -y kernel-devel # Needed to re-build ENA driver
sudo yum groupinstall -y "Server with GUI"
sudo systemctl set-default graphical.target
sudo yum -y install epel-release
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.e…
sudo yum install -y xrdp tigervnc-server
sudo systemctl start xrdp
sudo systemctl enable xrdp
sudo systemctl disable firewalld
sudo systemctl stop firewalld
设置完记住给centos用户设置一个暗码,不然长途桌面登录不了:
sudo passwd centos
当你经过长途桌面登录centos后,就能够看到图形化界面了。更多能够参阅Jeff Bar的博客https://aws.amazon.com/blogs/aws/developer-preview-ec2-instances-f1-with-programmable-hardware/
以下是从该博客复制的长途图形界面截图:
最终期望咱们能够在FPGA的国际里找到自己的方向,开端创立自己的芯片体系真是一件让人振奋的工作。
作者介绍
AWS解决方案架构师;具有15年IT 范畴的作业经验,先后在IBM,RIM,Apple 等企业担任工程师、架构师等职位;现在上任于AWS,担任解决方案架构师一职。喜爱编程,喜爱各种编程言语,特别喜爱Lisp。喜爱新技能,喜爱各种技能应战,现在在集中精力学习分布式核算环境下的机器学习算法。