LWN: iproute2和libbpf如何打包!

Ubuntu20.04配置eBPF环境(升级内核5.15.153+LLVM16.0.0源码安装+bpftool7.4.0源码安装) 阅读详情

关注了就能看到更多这么棒的文章哦~

iproute2 and libbpf: vendoring on the small scale

By Jonathan Corbet
November 12, 2020
DeepL assisted translation
https://lwn.net/Articles/836911/

LWN 最近关于 Debian 中的 Kubernetes 的文章中(https://lwn.net/Articles/835599/),介绍了要把一个有数百个依赖包的大型项目打包发布,是一件多么有挑战的事情。然而,其中出现的许多问题并不局限于这类大规模的项目。本文讨论的问题,就是是否在发布网络工具 iproute2 工具集的同时,是否应该附带 libbpf library 的一份副本。可以看出,这些快速发展的项目,似乎仍然觉得受到了 Linux 分发方式的限制。

iproute2, 是一个几乎在任何 Linux 系统上都能找到的网络配置工具集合。它包括 arpd、ip(老前辈们在输入 ifconfig 时其实应该要用 ip 命令了)、ss 和 tc 等实用工具。特别是最后一个命令,是用来配置流量控制子系统(traffic-control subsystem)的,供系统管理员来管理、优先处理流经其系统的网络数据。流量控制这个子系统,在几年前就已经具备了加载和运行 BPF program 的能力,用 BPF,既可以对数据包进行分类,也可以决策应该放到哪个队列里。这种机制使管理员在管理网络流量方面拥有很大的灵活性。

不过,在 iproute2 中处理 BPF program 的代码已经很老了,而且缺乏对过去几年中添加到 BPF 中的许多新功能的支持。自从这里这段老代码被写出来后,BPF 社区又开发出了 libbpf(合入了 kernel source tree),这是处理 BPF program 并将它们加载到内核中的首选方法。这个工作可不是一个小任务,libbpf 必须对 BPF program 可执行程序中写在一个特殊 ELF p 的指令代码进行解释执行,并在需要时调用功能繁杂的 bpf() 系统调用。这部分工作还包括创建 BPF maps,"relocating " structure offset 从而匹配当前运行的 kernel 里真实的偏移量,还有包括加载 program,并将其挂载到内核中适当的钩子上。Libbpf 和其他的 BPF 生态系统一起经历了迅速地成长。

要在 iproute2 中添加对最新的 BPF 特性的支持的话,显然,最直接的方法是抛弃它使用的旧代码,转而使用 libbpf;从 10 月底开始,Hangbin Liu 已经提出了这方面的 patch。此后不久,iproute2 的维护者之一 David Ahern 指出,发布的补丁无法在 Ubuntu 20.10 系统上成功编译,刘航斌的回应是:Ahern 需要更新到较新版本的 libbpf。libbpf 开发者 Andrii Nakryiko 建议将 libbpf 作为 iproute2 的一个子模块(submodule)。麻烦就开始了:Ahern 认为 libbpf 是由 Linux 发行版提供的,iproute2 需要和现有的版本能配合一起工作。Nakryiko 则认为,libbpf 是 "现在正在经历快速变化的函数库",将其与 iproute2 打包在一起是 "更加实际的做法"。不用说,这种观点并没有得到广泛认同。当我们发布新版本的 libbpf 时,它会经过严格的测试。bpftool 也会有很多测试覆盖率。iproute2 与共享的 libbpf 将一无所获。这就像随机掷骰子一样。新的 libbpf 可能会破坏 iproute2,也可能不会。这真是可怕的用户体验。之前已经有很多次提出反对意见,不支持像这样来发布函数库(类似这次的 libbpf),这次 libbpf 也碰到了同样的问题。Jesper Dangaard Brouer 重复了人们通常使用的安全这个角度的论点:藏在其他软件包中的 library 文件副本很难被人们注意到,如果出现了问题也很难更新。Jiri Benc 补充说,这个过程的最终结果将是导致大量的依赖库被捆绑发布,这 "对发行版和用户来说都是噩梦"。发行版长期以来一直反对以这种方式捆绑依赖关系,而 iproute2 开发者认为没有任何理由在 libbpf 上违背这一政策。

BPF 的开发者们却有不同的看法,毫不羞涩地把自己的观点大声说了出来。Alexei Starovoitov 称 Ahern "对技术争论充耳不闻",并提出了把 iproute2 拉个 branch 出来管理的想法作为回应。后来他说,使用发行版提供的 libbpf 会比完全不用 libbpf 更糟糕,如果他能从 iproute2 中删除现有的 bpf 支持,他会很愿意这么做。事情到了 Toke Høiland-Jørgensen 要求他 "停止这种类似'不走我的路就去走高速公路'的敲诈行径",否则讨论就无法取得任何进展。

将 libbpf 与 iproute2 捆绑在一起的争论,似乎主要来源于人们对发行版提供商发布的 libbpf 的不信任。这里其实有两个方面,一个是 iproute2 可能最终会链接执行一个带有 bug 的 libbpf 版本,正如 Starovoitov 所说:

当我们发布新版本的 libbpf 时,它会经过严格的测试。bpftool 也会有很多测试覆盖。iproute2 使用公共的 libbpf 并没有什么好处。这就像随机掷骰子一样。新的 libbpf 可能会破坏 iproute2,也可能不会。这真是可怕的用户体验。

Benc 不同意这个观点:

只有在 libbpf 在保持向后兼容性方面做得非常糟糕的情况下才能算是“随机掷筛子”。根据我的经验来看,libbpf 向后兼容性方面做得很不错。

在讨论的另一封邮件中,Starovoitov 赞扬了 libbpf 版本的兼容性,说 "用户可以随时升级和降级 libbpf 版本"。其他人也认为,libbpf 版本管理得很好,不会产生兼容性问题。所以,其实并不清楚这里有什么好担忧的。

不过这里还是有个相关的问题,也就是担心使用发行版提供的 libbpf 会导致各系统之间的缺乏一致性,用户无法通过查看他们正在运行的 iproute2 版本就知道它支持哪些功能。除此之外,bpf 开发者还担心发行版提供商会坚持使用旧的 libbpf,使用户即使拥有最新版本的 iproute2 也无法使用最新的功能。Nakryiko 表示,用户确实希望得到 libbpf 支持的新功能,但 bpf 维护者 Daniel Borkman 一再声称,发行商不可能跟上 libbpf 的发布。有人认为,这将导致 iproute2 用户体验不佳。将一个特定版本的 libbpf 与每个 iproute2 版本绑定,反而会让使用体验更加一致。

不过 Ahern 并不完全相信这种说法:

用户体验一直被提及,但我也一直读到这样的观点:BPF 的用户不能期望有一致的体验,除非他们一直追着使用与 BPF 相关的所有软件的最新最好版本。这对用户来说不现实。发行版的存在是有其价值的,它们解决了打包问题让其变得可行。

这引出了一些其他开发者,他们抱怨需要保持多个依赖软件都要在最新的版本才能正常工作起来。例如,Edward Cree 就抱怨这个互操作性问题一直缺乏重视:

bpf 的开发者似乎认为既然他们控制了 clang, libbpf 和 kernel, 他们就可以在这三个软件中随意修改,而根本不管那些能让其他工具可以互相配合操作的规范。

Starovoitov 实际上也同意这种情况总有一天需要改善。"BPF 生态系统最终会形成固定的文件格式、linker 规范和 1000 页 psABI 文档。" 不过,他补充说,现在事情发展得太快了。

最后,Nakryiko 建议说,如果发行商们注意更新 libbpf,并将 iproute2 的依赖关系设置为需要进行更新的版本,那么就可以解决大多数问题了。Benc 回答说,至少 Red Hat 现在是这样做的,因此 Nakryiko 回答说,这 "实际上已经足够了"。Starovoitov 仍然认为 iproute2 需要在每个发布版本中列明所依赖的 libbpf 最少需要哪个版本 ,随着新版本的发布而持续更新,这样 iproute2 和 libbpf 版本之间至少会有一些关联。Stephen Hemminger,也是 iproute2 的维护者,则不愿意强加这样的要求。

最后,似乎 iproute2 将会像所有其他 Linux 工具一样被打包,将会使用发行版所提供的 libbpf 版本,而不是提供自己的版本。发行商只需要确保 libbpf 与其他内核衍生的工具保持一致,这是他们早就知道了的。

不过,围绕着快速发展的 bpf 子系统的紧张关系似乎不太可能消失。有一群用户已经在依赖基于 bpf 的工具,而开发者则继续匆忙地发展整个生态系统。Ahern 这样描述这种情况。"相关的软件在发布 2-3 个月后就过时的趋势,可以看出 bpf 还不稳定、尚未准备好让发行版来开始使用和支持"。不过,这也应该是一个容易解决的问题,毕竟近 30 年来,Linux 作为一个整体,一直在支持用户,同时也在不断地进行修改。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

iproute2 and libbpf: vendoring on the small scale 摘要:Linux社区近期围绕是否将libbpf库与iproute2网络工具集捆绑发布展开激烈讨论。BPF开发者主张捆绑以跟上快速发展的BPF生态,认为发行版提供的libbpf版本滞后且不可靠;而发行版维护者则坚持传统依赖管理模式,反对重复打包可能引发的安全和管理问题。双方争论焦点在于:1)版本控制与兼容性,2)用户体验一致性,3)发行版更新节奏与开发者迭代速度的冲突。最终iproute2将采用发行版提供的libbpf,但这场争论揭示了Linux发行模式与快速演进技术(如BPF)之间的持续张力。(149字) 阅读详情

相关推荐

在Ubuntu 24.04上搭建eBPF/XDP开发环境

在Ubuntu 24.04上搭建eBPF/XDP开发环境,首先确保系统满足要求,如内核版本5.15或更高。接着,通过命令行安装必要的开发工具和依赖,包括BPF工具链和BCC工具。验证内核配置,确保BPF和XDP支持已启用。如果需要,可以手动安装最新版本的libbpf和bpftool。设置环境变量后,通过编写和加载一个简单的XDP程序来测试环境。此外,还可以安装XDP工具和perf工具以增强开发体验。最后,建议使用支持BPF的IDE插件和libxdp库来简化开发过程。完成这些步骤后,系统即可进行eBPF/XD

深山技术宅的博客 1280

net-tools 要被 iproute2 取代了

net-tools 是基于IOCTL 开发出来的 iproute 是基于NETLINK 开发出来的,后者的功能和性能要优于前者,ubuntu和centous,都不会在自带net-tools 工具包了,如果需要自行安装 libnl libmnl iptables 都是基于NetLink 开发出来的,实用的小工具 ...

HongDaYu的搬砖之路 467

iproute2路由配置(ip rule、ip route、traceroute)

一、Iproute2简介 Iproute2是一个在Linux下的高级网络管理工具软件。实际上,它是通过rtnetlink sockets方式动态配置内核的一些小工具组成的,从Linux2.2内核开始,Alexey Kuznetsov 实现了通过rtnetlink sockets用来配置网络协议栈,它是一个现代的强大的接口。 centos安装iproute2命令: yum install -y iproute ip -V 二、iproute2常用命令 net-tools和iproute2的大致对比:

匠人精神,持之以恒! 1万+

关于ip route 线路负载均衡的一些总结

问题一:关于包的原路返回的问题: ################################################################################# 举个例子,比如如果一个linux服务器有三个口接三个不同的网络,假设对应的网络信息是如此 eth0是电信,ip地址为1.1.1.1/24,电信网关为1.1.1.254 eth1是

void* ptr = NULL; 5610

Ubuntu下bpf纯c程序的编写与运行

1. 前言 2. 搭建bpf程序运行环境 2.1 下载源码 3. bpf代码分析及运行 4. 总结

金荣的个人技术博客 7462

手把手推导APM的 sqrt_controller控制器

前言 玩过无人机的朋友对APM应该都不会陌生,如果是搞过多旋翼飞控且读过代码,肯定遇到过sqrt_controller控制器,它频繁的在位置、姿态控制中出现,所以非常有必要搞清楚这个控制原理。 下面以高度控制器为例来分析。 高度控制 APM的高度控制采用PID串级3环控制,即外环位置控制,中间速度控制,内环速度控制,如下图所示。 今天要讨论的sqrt_controller就是应用于位置控制器中。位置控制器的输出是速度控制器的参考reference输入,如果采用单P控制,其输出vel_ref = pos_e

周小逗的博客 3027

Ubuntu 安装 libbpf 教程

5.开启BTF特性,以下两种方式均可。有了 eBPF 程序,就可以使用 clang 和 bpftool 将其编译成 BPF 字节码,然后再生成其头文件编译内核态文件(此处以execsnoop为例)。这时查看bcc/libbpf-tools/bpftool和bcc/src/cc/libbpf,发现也已经下载好了需要使用的源码。可选的 .h 是具有常见类型定义的头文件,并且由应用程序的BPF和用户空间代码共享。.c 是用户空间C代码,它在应用程序的整个生命周期中加载BPF代码并与其交互;

qq_43472789的博客 4581

全桥LLC谐振变换器变频控制工作原理与仿真

全桥LLC谐振变换器以其效率高、全范围软开关、器件电应力小等优点,越来越多地应用于大功率场合。电力电子技术的发展日益追求高频化,所带来的问题是半导体开关器件高频运行时的开关损耗急剧增加。各种软开关电路随之出现。可以有效减小开关损耗,使进一步提高开关频率成为可能。谐振式开关因其可在电流自然过零点开通半导体器件,实现零电压开关,特别适合采用MOSFET作开关的装置。最简单的谐振电路有串联谐振(SRC)和并联谐振(PRC)。SRC只能工作于降压状态,应用受限;

晞子的技术札记 3066

ubuntu 来安装libbpf

然后cd libbpf-bootstrap/libbpf/src,make && make install 安装库文件到本地。libbpf.so.1 安装到本地成功,libbpf安装成功。

qq_41914904的博客 1395

Zabbix监控网络设备讲解

Zabbix监控网络设备讲解 本人在研究学习zabbix的时候,网上找过很多如何监控路由,交换,或者是防火墙的文章,但很多都比较散,这里我出一个大概的整合,方便大家参考和学习。本章就拿华三的交换机来做文章。 监控网络设备首先我们需要开启snmp协议,华三怎么开启snmp协议在我的博客里有写到,其次就是找到版本对应的OID,zabbix就是通过抓取设备的OID来做到监控网络设备的,当然zabbix也不仅仅只有通过snmp来监控设备,还有很多别的功能,这些功能我会在以后的博客里面一一更新 文章目录Zab

太阳了文哥的博客 3381

Spring AI + RAG 构建电商智能客服:从 PDF 文档解析到精准问答的全链路实战

核心框架:向量数据库:- PostgreSQL + pgvector (生产推荐)- Redis Stack (轻量级方案)- ChromaDB (快速原型)文档解析:- Apache PDFBox: PDF 文本提取- Spring AI Document Readers: 结构化解析大模型:- 阿里云百炼 (DashScope)- 本地部署:Qwen/ChatGLM/*** 电商领域实体*/@Data@Builder@ToString/*** 商品类型。

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 381

ebpf的快速开发工具--libbpf-bootstrap

libbpf-bootstrap是一个开源项目,旨在帮助开发者快速启动和开发使用eBPF(Extended Berkeley Packet Filter)和libbpf的程序。eBPF是一种可以在Linux内核中运行的程序,提供了强大的网络过滤、系统调用监控和性能分析等功能。libbpf是一个库,用于加载和管理eBPF程序和map。libbpf-bootstrap提供了一些样例程序和模板,帮助开发者理解如何使用libbpf创建、加载、管理eBPF程序,并与这些程序进行交互。

Rice开发经验分享 570

库存优化技术提升电商效率

第一部分:库存优化技术基础 第1章:库存优化的基本概念 库存优化是现代电商运营中至关重要的一个环节。简单来说,库存优化指的是通过一系列的策略和技术手段,使得库存管理更加高效、准确,从而降低运营成本,提高销售额。 1.1 库存优化的定义与重要性

AI天才研究院 1248

BPF学习笔记(六)-- 使用bpf实现xdp的例子

本篇文章参考《Linux Observability with BPF》中第7章的例子,主要功能是借助于ip命令作为前端,对其他主机访问tcp的8000端口进行限制,这里需要使用较新版本的iproute2软件工具包.使用下面的命令进行编译:clang -g -c -O2 -target bpf -c program.c -o program.o。再次使用nmap扫描。本bpf程序对于访问本机的tcp的协议的8000端口进行限制,通过上面的命令加载后,在接口上出现加载的xdp的类型和ID,表明加载成功。

frankzfz的专栏 1463

seurat v5更新及样本整合方法

1 Seurat 对象和 Assay 类发生了变化:支持更多种类的检测和数据类型,包括磁盘上的矩阵。引入了分层结构来存储数据,例如原始计数、标准化数据和 z 得分/方差稳定数据。可以使用 $ 访问器或 LayerData 函数来访问数据。现有的 Seurat v4 函数和工作流程仍可在 v5 中使用。2 整合工作流程发生了变化:简化了整合流程,提高了速度和内存效率。整合结果与 v4 工作流程略有不同,但用户仍可在 v5 中运行 v4 整合工作流程。

hx2024的博客 2684

【2026OD新机考】【哈希表】20260422-文章特征提取【Py/Java/C++/C/JS/Go六种语言OD真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

90+天陪伴式学习,100+直播课时,300+动画图解视频,500+LeetCode经典题,500+华为OD真题/大厂真题,还有简历修改、模拟面试、陪伴小群、资深HR对接将为你解锁。这道题的本质是多集合交集问题的变形,属于非常典型的哈希表应用题。,储存全局的每个片段中,各个字符最少出现的次数。表示该字母并非所有片段的公共字母。,按照顺序构建答案即可。没有字母在所有三个字符串中都出现。每个字母在各字符串中都至少出现。次,所以结果中每个字母出现一次。这样,当上述循环结束后,最终。显然在上述代码中,如果字母。

weixin_48157259的博客 66

bpf,ebpf,libbpf,在ubuntu22中ebpf工具的安装和介绍(libbpf_bootstarp,eunomia-bpf,bpftiime),关系总结,ebpf程序执行流程

bpf,ebpf,libbpf,ebpf工具的安装和介绍(libbpf_bootstarp,eunomia-bpf,bpftiime),关系总结,ebpf程序执行流程

m0_74206992的博客 2132

【安全设备篇】HVV面试专题

还有就是这个可能是被访问的这个内网系统,本身业务系统存在业务逻辑问题,因为内网所布置的很多业务系统往往不会考虑一些安全性问题,比如在正常的业务逻辑请求中直接带了sql语句,就会触发设备规则产生告警,这一类是属于误报,然后会将此告警上报给研判人员,需要研判组专家和甲方客户确认下是否是该系统存在此业务逻辑问题,并且需要确认告警的源ip在此告警的时间段附近有没有进行操作过。天眼日志分析主要基于系统和应用程序的日志数据来识别安全威胁,而威胁感知则通过收集和分析多种来源的情报信息。理解威胁的性质和威胁背后的原理。

大河之犬的博客 7923

BPF介绍

Thank Zhihao Tao for your hard work. The document spent countless nights and weekends, using his hard work to make it convenient for everyone. If you have any questions, please send a email to zhihao.tao@outlook.com 文章目录1. 概述1.1 发展1.2 优势1.3 限制1.4 基于eBPF.

Phantasm的博客 2540

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

keil:fatal error:“xxxx.h“ file not found解决方法

我在移植lwip的过程中,出现了头文件不包含的问题,按理这些年经验,不至于范这种低级错误,该添加的添加了,该配置的都配置了。为什么始终会报这个fatal error呢?折腾了一下,后面发现一个小细节,在lwip的xxx.c文件中,很多头文件引用是#include "lwip/xxxx.h"格式的,说明在相对路径下的一个绝对路径,那在options->c/c++下面设置头文件路径的时候,针对lwip应该怎么设置呢? 先来看下lwip文件的架构: 可以看到,在Include路径下面,包含了4个子文件,

weixin_47733174的博客 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Ubuntu20.04安装eBPF BCC

首先去GitHub上下载bcc,我下载的是bcc-0.21.0.zip; 然后再GitHub上下载libbpf,我下载的是libbpf-0.4.0.zip; 分别将上面的压缩文件解压得到: bcc-0.21.0 libbpf-0.4.0 将libbpf-0.4.0放入bcc-0.21.0/src/cc目录下,并重命名为libbpf。然后就是常规的cmake安装步骤了。 可以以参考:《Ubuntu安装BCC》 git clone https://github.com/iovisor/bcc

RToax 2719

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux Kernel 4.2 正式发布

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34267123的博客 175

Ubuntu安装包时出现unable to locate libbpf解决方法

在安装包时提示了unable to locate xxxx 的情况,这里记录一下 上网查找了资料,说是因为更换了源的原因,更换源后没有更新,所以会出现无法找到包的情况,但是实际上我是更新了,关于更换ubuntu的源的方法可以参考我另外一篇文章: Ubuntu 20.04 更换阿里源_木可木可❀的博客-优快云博客 实际上在最后我已经执行了sudo apt-get update进行更新,但是还是提示了这个错误,gcc等的下载又没有任何问题,,所以我重启了一下,依旧不行,说明肯定不是更新的问题,应该是这个

weixin_44260459的博客 1630

Git Submodule的坑

http://blog.devtang.com/blog/2013/05/08/git-submodule-issues/ Git Submodule的坑 MAY 8TH, 2013 前言 随着近几年的发展,Git已经成为开源界的标准的版本控制工具。开源界的重量级项目,如Linux, Android, Eclipse, Gnome, KDE, Qt, ROR

呆萌院长 3743

XDP类型的BPF程序

经过上一节的内容,bpf程序和map已经加载到内核当中了。什么时候bpf程序才能发挥它的作用呢? 这就需要bpf的应用系统把其挂载到适当的钩子上,当钩子所在点的路径被执行,钩子被触发,BPF程序得以执行。 目前应用bpf的子系统分为两大类: tracing:kprobe、tracepoint、perf_event filter:sk_filter、sched_cls、sched_act、xdp、cg_skb 接下来分析XDP类型的bpf程序的绑定和触发过程 1.Loading via iprou..

魏言华的博客 1498
上一篇: LWN:realtime开发者的清单!
下一篇: LWN: QEMU中的数据变动跟踪与差分备份!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值