×

AXU2CGB Zynq UltraScale板上的GNU Radio工具包 第4部分

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-14

h1654155273.0656

分享资料个

描述

这是如何为 Alinx 制造的AXU2CGA/B Zynq UltraScale+ FPGA 开发板创建硬件加速器平台的分步教程,该平台 用于在 Xilinx Vitis 工具集下运行具有加速功能的 GNU Radio 应用程序。

添加 EA4GPZ 开发的gr-satellites并构建您自己的 OOT 模块也包含在这套教程中。

这是第 4/4 部分:在 Colab 和 Vitis-AI 中构建 AI 模型

如果你正在寻找这组教程的其他部分,你可以直接去那里:

获取射频数据集

RF 数据集可以从RF Datasets For Machine Learning网站免费下载。选择RADIOML 2018.01A数据集并下载2018.01.OSC.0001_1024x2M.h5.tar.gz文件。

您应该提供您的联系信息以供下载,但该数据集是免费的。您需要大约 20 GB 的磁盘可用空间来下载。

还有另一个选项可以将数据集的大小减少到仅约 6%。这足以开始。本教程使用精简的数据集(仅约 1.2 GB),可以从随附的 Jupyter Notebook 脚本中提供的链接下载。

这是用于减少原始大型数据集的脚本:

reduce_dataset.ipynb

您可以跳过此下载步骤并直接跳到下一步,以防万一您不想下载和使用整个数据集。

否则,如果您想将原始数据集作为一个整体使用,请跳转到Xilinx 教程 - RF 调制识别GitHub 页面并使用他们的原始脚本来构建模型。在这种情况下,您可以跳过本教程的剩余部分。

获取 Jupyter Notebook Scrips

本教程中提供了两个 Jupyter 脚本。第一个将在Google Colab上运行,第二个将在Xilinx Vitis-AI Docker 映像上运行。

克隆s59mz/test-dpu GitHub 存储库并记下 Jupyter 子目录中的两个 Jupyter 笔记本脚本。我们稍后会需要它。

  • rf_classification-Colab.ipynb
  • rf_classification-Vitis-AI.ipynb
$ git clone http://github.com/s59mz/test-dpu
$ cd test-dpu/
$ ls jupyter/

rf_classification-Vitis-AI.ipynb
rf_classification-Colab.ipynb
reduce_dataset.ipynb

注意reduce_dataset.ipynb可用于手动减少原始数据集,如上一节所述。

获取 arch.json 文件

这是为 DPU 编译模型的非常重要的文件。该文件位于模型目录中:

$ ls models/*.json
models/arch_b1152.json

$ cat models/arch_b1152.json
{"fingerprint":"0x100002062010103"}

注意:指纹可以通过在 FPGA 板上运行以下命令直接从目标板上读取:

$ export XLNX_VART_FIRMWARE=/media/sd-mmcblk1p1/dpu.xclbin
$ xdputil query

注意:编辑arch.json文件并手动更新指纹参数,以防您更改 DPU 构建配置(dpu_conf.vh 文件)

构建和训练 AI 模型

我们将构建的 AI 模型使用TensorFlow框架。我们使用Google Colab服务来训练模型,因为我们可以免费使用他们非常强大的显卡进行计算,但仅限于有限的时间(几个小时)。

在 Colab 断开您与他们的服务之间的连接之前,请务必将您训练的模型下载并保存到您的计算机上。您可以在第二天重复整个过程,任意多次,但每次都必须从头开始。

  • 打开您的网络浏览器(推荐使用 Google Chrome 或 Firefox)并打开Google Colab网页。
  • 将第一个脚本rf_classification-Colab.ipynb上传到 Colab(文件 > 上传笔记本)。如果您还没有登录,您应该使用您的 Google 帐户登录。
  • 展开窗口左侧的文件图标,这样您就可以在那里看到一些新创建的文件 (sample_data)。
poYBAGNYgsaAQOYQAAFyW6Cjs8g374.png
 
  • 将 Runtime 设置为 GPU:Runtime > Change Runtime type > GPU并保存,如果可用,否则使用 CPU,但训练时间会更长。
  • 启动脚本:Runtime > Run all并等待大约半小时。

刚刚发生了什么?

  • 该脚本首先从我的 Google Drive 下载缩减的数据集。您可以更改 Cell #2 (!wget...) 中的路径以使用您自己的数据集。您应该会看到一个新文件reduce_rf_dataset_XYZ.hdf5出现在左侧。
  • 经过一些数据处理和准备后,模型将被训练,您可以在检查点文件夹中看到一些保存的检查点状态。
pYYBAGNYgsmAKI6zAAJQk0zXer8789.png
 
  • 脚本完成后,您会注意到另一个新文件:保存的最佳训练模型,名为rf-model-best.h5
poYBAGNYgsuAOFedAABQMFTacoU529.png
训练模型位置
 
  • 将经过训练的模型rf-model-best.h5 下载到您的计算机,然后 Colab 会因不活动而断开您与服务的连接。
  • 训练后的模型也可以在GitHub存储库中找到(使用不同的名称):rfClassification_fp_model.h5
  • 探索结果。这是一个混淆矩阵,我们仅使用数据集中 6% 的样本得到了 10 个 epoch 的训练。
poYBAGNYgs2AZnVrAACBeFEPCnk157.png
 
  • 不完美,但足以作为在真实 FPGA 上测试模型的起点。
  • 随意使用来自数据集的更多数据样本或更长的训练时间(epochs)再次重复整个过程,甚至可以根据需要改进模型以获得更准确的结果。
  • 但是,请记住:您每天使用 Google Colab 的时间是有限的(大概 2 小时左右)。因此,每次下载模型后都要关闭会话(连接 > 管理会话 > 终止)。

在 Vitis-AI 上编译模型

现在,由于我们有一个名为rf-model-best.h5的浮点模型我们需要对其进行量化、校准和编译,以便在真实 FPGA 的 DPU 单元上使用它。

此过程的详细信息超出了本教程的范围。随意地:

以下是主要步骤:

  • 如果您还没有 Docker,请在您的主机上安装Docker 。
  • 使用以下命令下载最新的 Vitis AI Docker 映像:
docker pull xilinx/vitis-ai-cpu:latest
  • Vitis-AI GitHub 存储库克隆到您的主机。
git clone --recurse-submodules https://github.com/Xilinx/Vitis-AI
  • 将先前克隆的rf_classification-Vitis-AI.ipynb脚本复制到 Vitis-AI 存储库以及上一节中训练好的模型rf-model-best.h5 您可以创建一个新的my_model目录和一个子目录fp_model来复制您的训练模型。
  • 还将arch_b1152.json文件复制到同一目录,除非您也更新 Jupyter 脚本,否则不要更改文件名。
$ cd Vitis-AI
$ mkdir -p my_model/fp_model
$ cp ~/test-dpu/jupyter/rf_classification-Vitis-AI.ipynb my_model
$ cp ~/Downloads/rf-model-best.h5 my_model/fp_model
$ cp ~/test-dpu/models/arch_b1152.json my_model
$ cd my_model

$ ls
arch_b1152.json  fp_model  rf_classification-Vitis-AI.ipynb
  • 使用 bash 脚本从my_model目录启动 Docker 映像。
$ ../docker_run.sh xilinx/vitis-ai
  • 当 Docker 启动时,通过执行conda activate命令切换到 TensorFlow2。
pYYBAGNYgs-AFm-WAAA_biAH58o272.png
 
  • 通过运行以下命令(在 Docker 内部)启动Jupyter Notebook :
$ jupyter notebook --no-browser --ip=0.0.0.0 --NotebookApp.token='' --NotebookApp.password=''
poYBAGNYgtGANEcTAABez-6GFF8344.png
 
  • 点击之前复制的脚本rf_classification-Vitis-AI.ipynb
poYBAGNYgtSAJtHAAAFetC3nmGY479.png
 
  • 运行脚本:Kernel > Restart & Run All并等待几分钟得到编译好的模型。
  • 注意:校准所需的缩减数据集(1.2 GB) 将从我的 Google Drive 下载到您的计算机。您可以修改脚本并使用自己的数据集进行校准。
  • 然后,将创建一个新的量化模型,该模型由先前下载的校准数据集进行优化。它位于quantize_results/quantized_model.h5目录中。
  • 最后,将创建一个新目录vai_c_output 。
  • 里面是我们的rfClassification.xmodel文件,准备上传到我们的目标板。

在目标板上测试模型

现在,我们准备在真实硬件上测试模型。

  • 将SD 卡上的原始rfClassification.xmodel文件复制或替换为新文件。它位于 test-dpu/models 目录的引导分区中。
$ pwd
/media/sd-mmcblk1p1/test-dpu/models
  • 如果您更改模型的名称,您还应该更新测试脚本以及 RF Claasification GNU Radio 模块。否则,只需将原始文件替换为新文件即可。
  • 第 3 部分运行准确性测试
$ pwd
/media/sd-mmcblk1p1/test-dpu

$ ./run_test_accuracy.sh

Number of RF Samples Tested is  998
Batch Size is  1
Top1 accuracy =  0.53

最后...

再次在 GNU Radio 上启动RF 调制分类应用程序。

$ pwd
/media/sd-mmcblk1p1/test-dpu

$ ./run_rf_classification.sh
pYYBAGNYgteAUblXAAJ5sX-nq24654.png
这个项目的最终结果
 

就这样 !

如果您成功通过所有四个部分来到这里,恭喜!

随时在此博客上发表评论。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'AXU2CGB Zynq UltraScale板上的GNU Radio工具包 第4部分',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);