LWN:对比 SystemTap 和 bpftrace!

5060TI显卡深度学习环境搭建:CUDA12.8与CUDNN9.8.0的完美搭配 本文详细介绍了在Win10系统下为5060TI显卡搭建深度学习环境的最佳实践,重点配置CUDA12.8与CUDNN9.8.0的完美组合。通过优化OpenCV编译选项和YOLOv5环境设置,显著提升模型训练和推理效率,帮助开发者充分发挥5060TI显卡的性能潜力。 阅读详情

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

Comparing SystemTap and bpftrace

April 13, 2021
This article was contributed by Emanuele Rocca
DeepL assisted translation
https://lwn.net/Articles/852112/

有时候开发者和系统管理员需要分析正在运行中的代码里的问题。被检查的程序可能是用户空间进程,也可能是内核,或者两者都要同时分析。在 Linux 上有两个主流工具可以进行这种分析,就是 SystemTap 和 bpftrace。SystemTap 从 2005 年就出现了,而 bpftrace 则是最近才出现的,但对一些人来说,它似乎已经可以替代 SystemTap 了。然而,SystemTap 仍然是一些实际案例中的首选分析工具。

尽管早在 2004 年,Linux 就以 KProbes 的形式加入了动态注入(dynamic instrumentation)功能,但该功能很难使用,知道的人也不多。在一年后 Sun 发布了 DTrace,很快就成为 Solaris 的亮点之一。Linux 用户自然也开始要求有类似的功能,于是在这种情况下 SystemTap 很快就成为了最靠谱的方案。但是 SystemTap 一直被人们批评,感到很难运行起来,而 Solaris 上的 DTrace 基本上就是开箱即用,非常简单。

虽然 DTrace 的 tracing 功能既支持 kernel 也支持 user-space,但直到 2012 年,Linux 才实现了 Uprobes 来支持对 user-space 的 tracing 功能。2019 年左右,bpftrace 得到了巨大关注,部分原因是人们开始普遍关注 BPF 的各种使用实例。最近,甲骨文公司(Oracle)一直在为 Linux 来重新实现 DTrace,希望能基于内核中最新的 tracing 功能。不过,目前来说,考虑到这个领域已经有了现有的方案,DTrace 可能来得太晚了。

SystemTap 和 bpftrace 所使用的底层内核基础功能基本相同,都是用 KProbes 来对 kernel 函数进行动态 tracing,使用 tracepoints 来进行 static kernel instrumentation(静态内核注入),使用 Uprobes 来对 user-level 的函数进行动态 tracing,使用 user-level statically defined tracing(USDT)来进行 user-space 的静态注入。这两个方案都允许通过更高级语言 "脚本(script)" 来对内核和用户空间程序进行控制,用脚本来指定需要探测(probe)的内容和方式。

两者之间最重要的设计上的区别在于,SystemTap 会将用户提供的脚本翻译成 C 代码,然后作为 module 编译并加载到所运行的 Linux 内核中。bpftrace 则相反,会将脚本转换为 LLVM 中间表示(intermediate representation,类似于伪代码),然后再编译为 BPF 程序。使用 BPF 有几个优点:创建和运行一个 BPF 程序比编译并加载一个内核 module 要快很多。对由键值对(key/value pair)组成的数据结构,可以通过使用 BPF maps 来轻松支持。BPF verifier 确保了 BPF 程序不会导致系统崩溃,而 SystemTap 使用的内核 module 的方法意味着需要在运行时添加各种安全检查(safety check)。另一方面,使用 BPF 会使得某些功能比较难以实现,例如比较难以实现 custom stack walker(自定义的堆栈遍历),我们将在本后后半部分介绍这一点。

下面的例子从用户的角度展示了这两个系统的相似方面。下面是一个简单的 SystemTap 程序,用来注入分析内核里的 icmp_echo() 函数,看起来是这个样子的:

probe kernel.function("icmp_echo") {
    println("icmp_echo was called")
}

实现相同功能的 bpftrace 程序是这样的:

kprobe:icmp_echo {
    print("icmp_echo was called")
}

接下来我们来看一下 SystemTap 和 bpftrace 在安装过程、程序结构(program structure)和功能上的区别。

Installation

SystemTap 和 bpftrace 在所有主流 Linux 发行版中都已经缺省包含了,可以用各位熟悉的软件包管理器来轻松地完成安装。SystemTap 需要安装 Linux kernel header 头文件才能正常工作,而 bpftrace 则不需要,只要内核启用了 BPF 类型格式(BTF,BPF Type Format)支持就好。根据用户想分析的是用户空间程序还是内核,还会有一些额外要求。在分析用户空间软件时,SystemTap 和 bpftrace 都需要被分析的软件的调试符号(debugging symbol)。如何安装这些 symbol 数据,需要根据各位所用的发行版上的特有方式来安装了。

在使用 elfutils 0.178 版本或更高版本的系统上,SystemTap 可以使用远程的 debuginfod 服务器,从而使得寻找和安装正确的 debugging symbol 的过程完全自动化。例如,在 Debian 系统上可以这样做:

$ export DEBUGINFOD_URLS=https://debuginfod.debian.net
$ export DEBUGINFOD_PROGRESS=1
$ stap -ve 'probe process("/bin/ls").function("format_user_or_group") { println(pp()) }'
Downloading from https://debuginfod.debian.net/
[...]

bpftrace 还没有类似的功能。

要对内核进行注入分析的话,SystemTap 还需要 kernel debugging symbol(内核调试 symbol)文件,这样才可以使用一些高级的调试功能,比如说查找出函数调用时的具体参数或者某个局部变量,针对函数体中的具体某行代码进行注入分析等。这种情况下也可以使用远程的 debuginfod 服务器来自动完成符号表文件的加载。

Program structure

这两个方案都提供了一种类似 AWK 的语言,灵感均来自于 DTrace 的 D 脚本语言,用来要做什么动作。bpftrace 的脚本语言与 D 基本相同,并遵循如下这个通常的结构:

probe-descriptions
/predicate/
{
    action-statements
}

也就是说:当这个 probe 被触发时,如果指定的(可选)predicate 信息匹配上了,就执行指定的 action-statements。

SystemTap 程序的结构略有不同:

probe PROBEPOINT [, PROBEPOINT] {
[STMT …]
}

在 SystemTap 中,语言本身并没支持设置特定的 predicate,但可以用条件判断语句来达到同样的目的。

例如,下面的 bpftrace 程序打印了 PID 为 31316 的进程发起的所有 mmap() 函数调用:

uprobe:/lib/x86_64-linux-gnu/libc.so.6:mmap
/pid == 31316/
{
    print("mmap by 31316")
}

SystemTap 中的对应实现是:

probe process("/lib/x86_64-linux-gnu/libc.so.6").function("mmap") {
    if (pid() == 31316) {
        println("mmap by 31316")
    }
}

bpftrace 中的数据聚合和报告的方式与 DTrace 中的完全相同。例如,下面的程序对内核中 tcp_sendmsg()函数发送的字节数进行了按 PID 的汇总、聚合:

$ sudo bpftrace -e 'kprobe:tcp_sendmsg { @bytes[pid] = sum(arg2); }'
Attaching 1 probe...
^C

@bytes[58832]: 75
@bytes[58847]: 77
@bytes[58852]: 857

和 DTrace 一样,bpftrace 在程序退出时默认会自动打印汇总结果,因此不需要写代码来按上面的 PID 来分类在进行打印输出。这种缺省行为也有缺点,为了避免自动打印所有的数据结构,用户必须明确显式调用 clear() 来清除掉那些不应该被打印的数据。例如,可以改变上面的脚本,只打印最多的 5 个进程,bytes map 就必须要在程序结束时被 clear 掉:

kprobe:tcp_sendmsg {
    @bytes[pid] = sum(arg2);
}

END {
    print(@bytes, 5);
    clear(@bytes);
}

此外还有其他一些强大功能,比如生成直方图(histogram),从而可以写出非常简洁的脚本,比如下面的例子就对 vfs_read() 调用所读取的字节数进行了展示:

$ sudo bpftrace -e 'kretprobe:vfs_read { @bytes = hist(retval); }'
Attaching 1 probe...
^C

@bytes: 
(..., 0)             169 |@@                                                  |
[0]                  206 |@@@                                                 |
[1]                 1579 |@@@@@@@@@@@@@@@@@@@@@@@@@@@                         |
[2, 4)                13 |                                                    |
[4, 8)                 9 |                                                    |
[8, 16)             2970 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[16, 32)              45 |                                                    |
[32, 64)              91 |@                                                   |
[64, 128)            108 |@                                                   |
[128, 256)            10 |                                                    |
[256, 512)             8 |                                                    |
[512, 1K)             69 |@                                                   |
[1K, 2K)              97 |@                                                   |
[2K, 4K)              37 |                                                    |
[4K, 8K)              64 |@                                                   |
[8K, 16K)             24 |                                                    |
[16K, 32K)            29 |                                                    |
[32K, 64K)            80 |@                                                   |
[64K, 128K)           18 |                                                    |
[128K, 256K)           0 |                                                    |
[256K, 512K)           2 |                                                    |
[512K, 1M)             1 |                                                    |

SystemTap 中也提供了统计数据的汇总。<<< 操作符就是用来向统计数据汇总中添加数据的。SystemTap 在程序退出时不会自动打印汇总结果,所以需要显式地打印:

global bytes
probe kernel.function("vfs_read").return {
    bytes <<< $return
}

probe end {
    print(@hist_log(bytes))
}

Features

这些 DTrace 的类似系统有一个非常有用的功能,就是能够取得 stack trace,从而可以查看哪个函数调用流程触发了某个具体的 probe 位置。kernel stack trace 在 bpftrace 中可以按如下方式获取:

kprobe:icmp_echo {
    print(kstack);
    exit()
}

用 SystemTap 的话,相同的功能是这么写的:

probe kernel.function("icmp_echo") {
    print_backtrace();
    exit()
}

bpftrace 有一个重要局限,就是不能生成用户空间的 stack trace,除非被分析的目标程序在编译时启用了 frame pointer(帧指针)。绝大多数情况下,这都意味着用户必须重新编译目标程序之后才能对其进行注入分析。

而 SystemTap 的用户空间堆栈回溯机制(user-space stack backtrace mechanism),则是利用调试信息来遍历堆栈,从而提供完整的 stack trace。这意味着不需要重新编译了:

probe process("/bin/ls").function("format_user_or_group") {
    print_ubacktrace();
    exit()
}

上面的脚本就会生成一个完整的 backtrace,下面只节选了几项来展示:

0x55767a467f60 : format_user_or_group+0x0/0xc0 [/bin/ls]
0x55767a46d26a : print_long_format+0x58a/0x9f0 [/bin/ls]
0x55767a46d840 : print_current_files+0x170/0x3e0 [/bin/ls]
0x55767a465d8d : main+0x62d/0x1a00 [/bin/ls]

这不太可能在 bpftrace 中实现,因为需要在内核或 BPF bytecode 字节码中来实现这个功能才行。

Real world uses

下面举个在真实生产环境中调查的例子,由于 backtrace 的限制,bpftrace 无法进行更进一步的分析了,所以需要用 SystemTap 来继续调查。Wikimedia 使用 LuaJIT 的时候遇到了一个有趣的问题,可以看到 Apache Traffic Server 会产生很高的 CPU 使用率,我们可以通过如下命令来确认出这是由于 mmap()被调用得过于频繁了:

$ sudo bpftrace -e 'kprobe:do_mmap /pid == 31316/ { @[arg2]=count(); } interval:s:1 { exit(); }'
Attaching 2 probes...
@[65536]: 64988

如果不能用 SystemTap 生成 user-space backtrace 的话,调查只能到此为止了。请注意,这个例子中的问题牵涉到了 Lua JIT 组件,也就是说就算打开 frame pointer 来重新编译 Apache Traffic Server 从而使得 bpftrace 可以生成 stack trace 也仍然是不够的,我们还必须重新编译 LuaJIT。

与 bpftrace 相比,SystemTap 的另一个重要优势是允许通过变量名来访问函数的参数和局部变量。在 bpftrace 中,只有在调试内核时才能用名字访问到参数,还需要是使用 static kernel tracepoint 或者最近版本 kernel 中的实验性的 kfunc 功能才行。kfunc 功能是基于 BPF trampolines 的,看起来前景很不错。当使用常规的 kprobes 时,或者在对用户空间的软件进行检测时,bpftrace 只能通过位置信息(arg0, arg1, … argN)来访问到参数。

SystemTap 还能按源代码文件来列出可用的 probe 点,在定义 probe 的时候也能按文件名来进行匹配。这个功能可以用来只针对代码库的特定领域来进行分析的情况。例如,下面的命令可以用来列出(-L 参数的效果)Apache Traffic Server 中的 iocore/cache/Cache.cc 中定义的所有函数:

$ stap -L 'process("/usr/bin/traffic_server").function("*@./iocore/cache/Cache.cc")

经常有必要在函数内部的某个地方设置一个 probe 点,而不是每次都只分析函数入口点或返回语句位置的。在 SystemTap 中,这可以使用 statement probe 来实现。下面的代码会列出每个可用的 probe 点,以及每个位置下可用的变量:

$ stap -L 'process("/bin/ls").statement("format_user_or_group@src/ls.c:*")'
process("/bin/ls").statement("format_user_or_group@src/ls.c:4110") \
    $name:char const* $id:long unsigned int $width:int
process("/bin/ls").statement("format_user_or_group@src/ls.c:4115") \
    $name:char const* $id:long unsigned int $width:int
process("/bin/ls").statement("format_user_or_group@src/ls.c:4116") \
    $width_gap:int $name:char const* $id:long unsigned int $width:int 
process("/bin/ls").statement("format_user_or_group@src/ls.c:4118") \
    $pad:int $name:char const* $id:long unsigned int $width:int
[...]
process("/bin/ls").statement("format_user_or_group@src/ls.c:4131") \
    $name:char const* $id:long unsigned int $width:int $len:size_t

从完整的输出内容中可以看到,在函数 format_user_or_group()中,有 10 个不同的位置可以添加 probe,还有其他可以看到的各种变量。通过查看源代码,我们可以看到到底需要对哪一行进行 probe,相应地撰写 SystemTap 程序。

如果想用 bpftrace 来实现同样的效果,那么我们需要对函数进行反汇编,然后根据汇编指令位置来提供正确的偏移量给 Uprobe,这还是很麻烦的。此外,bpftrace 需要在编译时打开 Binary File Descriptor(BFD),这样此功能才可以生效。

虽然所有的软件基本都会有 bug,但那些会影响到调试工具的问题就特别棘手。有一个问题会影响到使用了某些特定 LLVM 版本的系统中的 bpftrace,这个问题值得一提。由于 LLVM 中的一个 bug 导致 IR(intermediate representation)中的 load/store 指令在不应该被 reorder 的时候发生了 reorder,导致一些原本有效的 bpftrace 脚本会产生无法预料的结果。只要添加或删除一些无关代码就可能会导致行为变化,不一定能触发这个错误了。这个底层 LLVM 错误同样导致其他一些的 bpftrace 脚本也失败。这个问题最近在 LLVM 12 中得到了修复,因此 bpftrace 用户应该确保他们运行的是不受这个问题影响的最新版本 LLVM。

Conclusions

SystemTap 和 bpftrace 提供了类似的功能,但在设计方案上有很大区别,一个在底层使用了可加载的内核 module,另一个使用了 BPF。基于内核 module 的方法提供了更大的灵活性,并允许实现使用 BPF 很难甚至不可能实现的功能。另一方面,BPF 显然是一个理想的 tracing 工具,因为它提供了一个快速而安全的环境来来实现对系统的可观察性。

对于许多应用场景来说,bpftrace 开箱即用,而 SystemTap 通常需要安装额外的依赖关系才能充分利用其所有功能。Bpftrace 的速度一般比较快,而且提供了各种快速汇总和报告的功能,可以说比 SystemTap 提供的类似功能更简单易用。另一方面,SystemTap 提供了一些与众不同的功能,比如:生成用户空间 backtrace 而不需要 frame pointer、通过变量名来访问函数参数和局部变量、以及对任意语句进行 probe 的能力。在今天的 Linux 系统诊断问题时,两者似乎都有其价值。

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

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

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

创建XCP的CanApe工程 阅读详情

相关推荐

扩散模型在工业缺陷检测中的应用与优化

扩散模型作为生成式AI的重要分支,通过逐步去噪的逆向过程实现高质量数据生成。其核心U-Net架构结合残差连接和时间步嵌入,特别适合处理工业场景中的细微缺陷检测。在计算机视觉领域,这种技术突破了传统深度学习模型对小样本数据的限制,通过域自适应预训练和小样本微调两阶段框架,显著提升金属表面、纺织品等复杂场景的检测准确率。关键技术实现涉及噪声调度优化、多任务损失设计等工程实践,最终在MVTec AD等工业数据集上达到90%以上的检测精度,为智能制造提供可靠的自动化质检方案。

weixin_30512043的博客 497

浅谈动态追踪:从SystemTap到bpfTrace

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录引言介绍工具30秒排查问题Top/Uptimedmesg -T | tail -n xvmstatmpstatpidstatiostatsar细化排错动态追踪SystemTapkprobes/uprobes原理kprobes特点与使用限制tapsets种类安全与保护措施有趣的命令行参数bpfTrace总结 引言 这篇文章的内容是Xiyo

李兆龙的博客 2313

【大模型】一图看懂3D因果卷积!

本文将系统性地介绍从1D到3D的因果卷积原理,通过直观的动图演示帮助读者理解其工作机制,并重点探讨3D因果卷积在大规模视频生成中的独特价值和应用前景。

xian0710830114的专栏 2198

BPF学习笔记(五)--Systemtap BPF/BCC bpftrace 实践对比

本篇文章通过一个案例,对systemtap、BPF/BCC、bpftrace三种不同类型的内核探测工具进行剖析和对比。这个程序就是简单对icmp_rcv函数,收到icmp报文,打印出对应的源IP地址和目的IP地址。

frankzfz的专栏 1234

YOLO创新点改进点的消融实验设计规范

YOLO改进的消融实验是一种重要的方法,用于评估和验证模型中不同组件的影响。在进行YOLO改进的消融实验时,我们可以选择一些可能的改进点,比如Backbone网络、Anchor框设计和损失函数设计,然后通过实验来分析它们对模型性能的影响。首先,我们需要确定实验设计。对于每个改进点,我们将设计多个实验组,并针对每个实验组训练模型并进行性能评估。这里以三个改进点为例进行说明:改进点1:Backbone网络 (改进点2:Anchor框设计 (改进点3:损失函数设计 (

crasher123的博客 2909

157、飞控中的鲁棒自适应控制

本文总结了飞控系统中鲁棒自适应控制的实践经验。作者通过炸机案例引出传统PID控制的局限性,分析了鲁棒性与自适应性的本质矛盾,提出"用鲁棒性兜底,用自适应性提性能"的设计原则。重点介绍了模型参考自适应控制(MRAC)的实现方法,包括参考模型设计、自适应律调参技巧(建议初始增益设为0.01)、直接/间接自适应的应用场景差异,以及防止参数漂移的鲁棒修正方法。文章还分享了实际调试中的三大关键问题(初始值设定、激励条件、执行器饱和)及解决方案,并推荐了"鲁棒PID+自适应前馈"的混合架构。最后强调调试顺序应为先保证鲁

2401_88858637的博客 27

SystemTap使用技巧【三】

1、代码执行路径      在分析代码的时候,能清晰地观察代码执行路径对Debug效率很有帮助,比如,最近在分析内核tcp回复ack的代码执行路径的时候就用到这个技巧 2、调试内核模块 参考: http://blog.chinaunix.net/uid-14528823-id-4726046.html

金九 的技术博客 3151

高空抛物监控系统:基于YOLOv8的轨迹追踪与可视化系统

本文详细介绍了一种基于YOLOv8深度学习模型的高空抛物监控系统,该系统能够实时检测并追踪高层建筑抛掷物的运动轨迹。文章包含完整的系统设计思路、算法实现细节、数据集构建方法以及基于PyQt5的可视化界面开发过程。我们提供了完整的Python实现代码,并讨论了系统的性能优化策略和实际部署考量。此外,我们还推荐了几个公开可用的高空抛物数据集,并详细分析了系统的应用前景和技术挑战。

YOLO 446

systemtap使用指导二

3 分析 使用systemtap,可以分析数据,进行过滤,聚集,求和。不同的探针可以一起处理对共享数据。在处理函数中可以使用非常丰富的C-style 语法。 3.1 基本构成 if/else statemen while(EXPR)STATEMENT for(A;B;C)STATEMENT systemtap中可以像C语言那样使用break/continue。探针处理函数中可以

Kelvin17的专栏 2458

RK3566/RK3568 Android 11添加系统服务

【代码】RK3566/RK3568 Android 11添加系统服务。

qq_23921815的博客 641

C语言试题四之计算并输出3到n之间所有素数的平方根之和

1、题目 请编写函数function,它的功能是:计算并输出3到n之间所有素数的平方根之和 例子:若我们main函数从键盘给n输入5之后,我们需要输出结果为3.968119 输入值n的要求:正整数n, 要求小于100。 2、部分函数说明 C 库函数 double sqrt(double x) 返回 x 的平方根 3、源代码实现 #include <stdio.h> #...

码莎拉蒂 7232

systemtap-快速入门指南

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

weixin_34327761的博客 1334

【异常】插入Milvus时出现无法插入的情况提示io.milvus.exception.ParamException: The field: meta is not provided.

在使用 Milvus 进行向量搜索时遇到 io.milvus.exception.ParamException: The field: meta is not provided 错误通常意味着在创建集合(Collection)或者插入数据(Insert)时,某些必需的元数据字段没有被正确提供。检查集合创建,确保在创建集合时,你已经定义了所有必需的字段,并且正确地使用了 SchemaField 来定义这些字段。例如,如果你在创建集合时没有正确设置元数据字段,就会出现这个错误。请严格按照这个表结构创建。

奶爸的编程之路,也就一周冷个三天 923

SystemTap使用技巧【一】

SystemTap是一个强大的调试工具,确切的说应该是一门调试语言,因为它有自己的语法,也有解析、编译、运行等过程(准确的说有五个阶段),但它主要解决的问题是收集Linux内核或者用户进程的信息,主要目的是调试。我一直以为gdb、kgdb是Linux最强大的调试器,曾经爱不释手,自从发现了SystemTap之后,又有了当初喜欢gdb的那种感觉了,真的是相见恨晚啊。gdb和SystemTap不是竞争

金九 的技术博客 1万+

深度学习工具包 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")

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ebpf study (by quqi99)

作者:张华 发表于:2020-01-13 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 bcc-tools test #install hwe kernel sudo add-apt-repository ppa:canonical-kernel-team/ppa sudo apt-get update sudo apt install linux-ima...

技术并艺术着 1951

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

如何精准定位:在操作系统中揪出发送Ping数据包的“元凶”程序

本文针对不同操作系统提供了精准定位发送ICMP ping包的进程的技术方案。由于ICMP协议不涉及端口号,传统网络工具无法直接追踪。文章详细介绍了在Linux上使用auditd和bpftrace进行内核级监控,在Windows上利用Wireshark/Npcap组合和ETW事件追踪,以及在macOS上运用dtrace工具的方法。这些方案超越了常规网络工具的限制,帮助系统管理员和安全分析师从内核层面识别发送ping包的进程,适用于网络故障排查和安全事件分析等场景。

专注于网络安全攻防技术与安全运营(SecOps)实践。 1767

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

动态追踪技术(中) - Dtrace、SystemTap、火焰图

动态追踪技术中篇,关于 DTrace、SystemTap 和 火焰图的那点事。 DTrace 与 SystemTap 说到动态追踪就不能不提到 DTrace(1) 。DTrace 算是现代动态追踪技术的鼻祖了,它于 21 世纪初诞生于 Solaris 操作系统,是由原来的 Sun Microsystems 公司的工程师编写的。可能很多同学都听说过 Solaris 系统和 Sun 公司...

ronon77的专栏 1105

LWN:自动对kernel进行调优!

关注了就能看到更多这么棒的文章哦~Auto-tuning the kernelBy Daroc AldenDecember 11, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/998576/Linux 内核(Linux kernel)拥有许多可调参数(tunable parameters)。尽管网络上充斥着大量关于如何设置这些参...

Linux News搬运工 1470

三大调试工具gdb,*trace,systemTap使用指南

总体而言三者各有千秋,gdb可动态调试,ftrace主打系统函数追踪,而systemtap功能很强大,个人感觉基本覆盖了ftrace,且能动态捕获系统函数或应用函数的执行时间,项目工作中很实用。

千墨 的优快云《断剑情雪》《月颜牌》,本人文章全部免费,仅供学习。 2991

linux systemtap java,linux里好用的性能分析工具:perf,oprofile,gprof,systemtap

1. [perf](Perf Wiki)应该是最全面最方便的一个性能检测工具。由linux内核携带并且同步更新,基本能满足日常使用。**推荐大家使用**。2. oprofile,我觉得是一个较过时的性能检测工具了,基本被perf取代,命令使用起来也不太方便。比如opcontrol --no-vmlinux , opcontrol --init等命令启动,然后是opcontrol --start, ...

weixin_29322049的博客 605

Oracle 数据库中的多种SCN汇总

SCN: 简单介绍SCN可称为系统改变号或者系统提交号,是Oracle内部的一种时间机制。 SCN的作用: (1)一致性读,比如Oracle在读取数据时会比较读开始的SCN值和数据块的SCN值,从而判断哪些数据块需要从业务数据文件中读取,哪些块需要从undo数据文件中读取 (2)事务的唯一性:Oracle会给每一个事务都分配一个唯一的SCN,按SCN进行严格排序. (3)介质恢复起点判断:在数据库异常宕机之后,Oracle后台进程可以根据数据文件头的SCN值判断出哪些数据文件需要恢复,并从控制文件的SCN值

dbhang的博客 1766

systemtap 语法简谈

To knowwhichvariables are likely to be available, you will need to be familiar withthekernel source you are probing.   标识符 标识符用于表示变量名和函数名,一般由字母数字序列构成,也包括下划线(_)和美元符号($)除了$也是合法的语法之外,它们与C语言标识符的语法一样。标识

yunluoxingE的专栏 1758

SystemTap使用技巧【二】

1、跟踪进程执行流程。      当我在学习新代码时,首先想要了解的是代码的处理流程,比如在学haproxy和nginx的时候,首先想看看它们是从main函数开始后怎么从内核收发数据,这个是我学习这两款软件的切入点,在还没学会SystemTap之前,硬是看了好几遍代码啊,而且很多地方有条件编译或者函数指针就比较难分析了,后来用gdb设断点分析总算大体流程能分析明白了,但还是不太理想。最近才发现S

金九 的技术博客 6494

bpftrace简单使用

linux工具bpftrace的简单使用

aolitianya的博客 935

SystemTap基本用法介绍

文章目录可探查的事件可打印的内容打印搜索路径嵌入c语言 可探查的事件 名称 说明 begin systemtap 会话打开 end systemtap会话结束 kernel.function(“sys_open”) kernel 的sys_open函数 syscall.close.return close被系统调用 module(“ext3”).statement(0xdeadbeef) ext3文件系统驱动中的地址 timer.ms(200) 每200毫秒触发一次的计时

编程随手记 1860

使用systemtap进行内核跟踪

如果想要添加一个systemtap内核桩位,但是又不知道该插入到哪里,可以通过如下命令查看systemtap支持的所有的打点位置: stap -L '*.*' 如果想查看这些位置点一共分为哪些类别,可以对输出记过做一下归纳处理: stap -L '*.*' > list.txt awk -F '.' '{print $1}' list.txt | uniq -c | sort -rn ...

程序猿Ricky的日常干货 1621
上一篇: LWN: 秘钥扫描!
下一篇: LWN:对NUMA更加优化的qspinlock!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值