LWN: QEMU中的数据变动跟踪与差分备份!

qemu之差分盘(差异磁盘) http://smilejay.com/2012/08/qemu-img-details/一、安装qemu-kvm 这没什么说的,zypper in kvm后根据提示完成即可; 二、新建虚拟磁盘 qemu-img create -f [fmt] filename size 比如: qemu-img create -f qcow2 xp.img 8G 将在当前目录新建一个名为xp.img 阅读详情

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

Changed-block tracking and differential backups in QEMU

November 17, 2020
This article was contributed by Kashyap Chamarthy
KVM Forum
DeepL assisted translation
https://lwn.net/Articles/837053/

存储虚拟化(storage virtualization)方面,有许多功能:QEMU Copy-On-Write (QCOW2) disk-image file format,disk image chain,point-in-time snapshot,backup,等等。这些功能主要是由开源的仿真器和模拟器(emulator and virtualizer) QEMU 中的 block layer 来实现的。在最近结束的 2020 KVM 论坛在线会议上,Eric Blake 就 QEMU 和 libvirt 目前在做的改进差分备份的功能进行了介绍。顾名思义,"差分备份(differential backup)" 解决了全盘备份方式的效率问题,既减少了空间占用,也加快了备份速度。

还有一个听起来类似的词,"增量备份(incremental backups)"。区别在于,差分备份主要是根据任选的某一次备份,来检测后来发生的变化。而增量备份只关注最后一次备份之后出现的变化。增量备份是差分备份的一个子集,但两者经常都被称为 "incremental backup" 。本文会使用 "差分备份" ,因为它的含义更加广泛。

建立差分备份的时候,两个版本中总有一个是当前的版本。换句话说,它不像 Git。Git 环境中,如果一个文件的最新版本比如说是 v4,那么你仍然可以在 v2 和 v3 之间进行差分比较。而在差分备份这种应用场景中,两个差分点中一定有一个是 v4,也就是当前的时间点。

QEMU 的 block layer 代码很早以前已经支持完整备份了。这个功能主要用于进行虚拟机整个存储的实时迁移,或者用于实时快照(point-in-time snapshot)。但是在过去的几年里,QEMU 和 libvirt 加快了让差分备份默认启用的开发步伐。

QCOW2 "backing chains"

QCOW2 的设计理念,是将稀疏映像文件(sparse image file)与其他作为 overlay 的文件映像结合起来,这就是所谓的 "backing chains"了。如果在 overlay 中找不到的数据,就会自动去另一个映像文件 image 中查找,也就是所谓的 "backing file"。每个 QCOW2 文件都被默认分割成 64KB 的数据 cluster,如果某个 cluster 不在 overlay 中,那么就需要去 backing file 中获取。下面是一个简单的 backing chain 的例子:

base.raw
    Overlay1.qcow2 (live QEMU)

base.raw 是 overlay1.qcow2 这个文件的 backing file。如果某个数据块是在 overlay 中分配的,那么 QEMU 将从 overlay 读取,否则的话就会从 backing file 中读取。但所有的写入都会发生在 overlay 中,所以叫 "COW(copy on write)":写入时仅使用副本(即 overlay)。注意,base image 可以是 raw 格式的,也可以是 QCOW2 格式的;而 overlay 文件则必须是 QCOW2 格式。也可以使用多个 overlay 叠加起来,称为 a chain of overlays:

base.raw
    overlay1.qcow2
  overlay2.qcow2
      overlay3.qcow2 (live QEMU)

在这种情况下,guest 发起的任何写入操作都发生在最后一个 overlay 里,也就是 overlay3.qcow2。这种 backing chain 的一个常见用法,就是基于某个 "完美的" 磁盘映像文件生成许多个副本来分别执行。还可以用在 thin provisioning(瘦配置)、point-in-time snapshot(时间点快照),以及 disk image backup(磁盘映像备份)。

Bitmaps to track "dirty" blocks

差分备份的核心,是要能在磁盘映像文件的生命周期内持续追踪哪些数据块被修改过,也称为 changed-block tracking(CBT)。我们在 QCOW2 这种块设备文件中会使用 bitmap 或者 bit array 来跟踪记录这些被修改过的部分。QEMU 在进行差分备份的时候,会利用 bitmap 来决定需要从这个虚拟磁盘映像文件(virtual disk image)中复制出来哪些部分。它提供了一组 API 来管理这个 bitmap 的生命周期,这组 API 就是 QEMU Monitor Protocol (QMP) 命令。

Blake 指出,在 QEMU 中使用 in-memory bitmap 并不是什么新鲜事:早在 2012 年,QEMU 内部首次使用 bitmap 来实现 QEMU 的一个已经用了很久的块设备的功能:block-stream。这个功能,是在 guest 运行起来之后,通过把 QCOW2 disk image chain 动态合并起来,从而提高 I/O 性能。QEMU 还扩展了 QCOW2 format specification,定义了一种“persistent bitmap”,可以存放在 QCOW2 disk image 中。当 guest OS 被关闭时,内存中的 bitmap 就会被写入到磁盘上,并在 guest 下次启动时重新加载起来,因此,这些改动的差分记录,可以不受限于 guest 的一次开机时间。

虽然 bitmap 提供了很多灵活性,但 libvirt 开发者意识到管理 bitmap 可能会变得非常困难,尤其是在涉及很长的 backing chain 的时候。人们必须小心翼翼地管理 bitmap,在合适的时机来 enable、disable 或进行合并。正是由于跟踪 bitmap 很复杂,导致他们管理 bitmap 的思路也发生了多次变化。

"checkpoint" 是 libvirt 的术语,指的是一个时间点,创建备份的时候可以针对这个时间点来创建差分备份。而 bitmap 则是跟踪一段时间内的变化。两者都是同时创建出来的,但 checkpoint 是不可以改动的,而 bitmap 将随着 guest 系统的后续操作来不断改变。最初的 libvirt 实现方案(当时涉及了多个 bitmap)试图规定无论有多少个 checkpoint,任意时刻只能有一个 bitmap 生效,从而来减少 bitmap 引入的写入开销。但 libvirt 开发者最终达成一致,认为所有的 checkpoint 都有自己的 active bitmap,这样一来,优化多个并发的 bitmap write 操作的麻烦工作就交给了 QEMU,但 libvirt 这边就不再需要花费太多精力来管理 bitmap 了。

Revitalized NBD

network block device,也就是网络块设备(NBD)。这个协议最早是在 二十三年前推出的 (Linux 2.1.55,即 1997 年 4 月),作为通过网络来访问块设备(block device)的一种方式。该协议一开始只有两个简单的命令。一个用于读取 block,另一个用于写入。但是,在过去的几年里,NBD 协议凭借新的虚拟化使用场景得到了很大发展。例如,可以通过 NBD 查询 dirty block,从而能够进行更细粒度的差分备份,特别是我们后面要进一步讨论的 "pull-based" 工作模式。有关 NBD 的更多信息,请参考 Blake 和 Richard W.M. Jones 在 2019 年 KVM 论坛上的 "Making the Most of NBD "演讲(https://www.youtube.com/watch?v=PMa6KFX9AxM)。

早在 2008 年,QEMU 就支持作为 NBD 的客户端,以便能够连接到独立的 NBD 服务器,如 qemu-nbd(或更强大的 nbdkit 服务器)并访问远程 block device。后来,QEMU 也提供了内置的 NBD server,这样一来它就可以把 disk image 以 NBD 磁盘的形式暴露出去。QEMU 内置 NBD 服务器最常见的用途之一是允许在 non-shared storage 环境中,实时迁移 VM 的磁盘。当虚拟机运行时,数据来源这一端的 QEMU 准备传输磁盘内容。同时,数据接收方的 QEMU 启动一个 NBD 服务器来提供一个空白的网络可写入的 NBD 设备。这时,数据来源端的 QEMU 将作为 NBD 客户端,连接到这里,将 guest 的 disk image 复制过来。一旦完成数据传输,内存就完全迁移过来了,这时接收方的 QEMU 就会停止 NBD 服务,接下来就可以在这里恢复虚拟机了。

Copying out the dirty blocks: "push" vs. "pull"

QEMU 将 bitmap 和 NBD 结合起来,就可以把修改过的 data block 复制出来。这里又分为两种方法。第一种是"push mode(推送模式)",QEMU 在内部跟踪修改过的数据块(按 QCOW2 的定义就是 "dirty clusters"),当用户提出备份请求时,QEMU 会在外界某个地方来创建差分备份或完整备份,也就是说,QEMU 是将数据 "推送" 给目的地。对于某些使用场景来说,QEMU 在这里可能是一个瓶颈,因为需要它来控制整个备份创建机制。

在另一种 "pull mode" 中,QEMU 将需要写出去的数据暴露出来,这是通过 QEMU 内置的 NBD 服务器实现的,把修改后的 block 暴露出来,这样就允许第三方工具可以可靠地复制出去(即数据从 QEMU 中被 "拉" 出来)。因此,pull mode 是让外部工具在它认为合适的情况下获取修改的数据,而不是等待 QEMU 将完整的备份推送到目标位置,从而避免了上面提到的性能瓶颈。

Blake 的演讲中展示了好几个使用场景。其中一个例子是如何跟踪 QCOW2 文件的 "dirty" block。这里涉及到创建一个 bitmap(使用新近添加的 qemu-img 这个 bitmap 命令),并将其添加到一个运行着 Fedora guest 的 QCOW2 映像上。现在,bitmap 就可以跟踪 guest 发起的任意写入操作了。然后,他对 disk image 进行了一些写入操作(使用 libguestfs 的 guestfish 工具),并把这些 bitmap 通过独立的 QEMU NBD 服务器 qemu-nbd 暴露出来。最后,他使用了 nbdinfo –map(一个新的命令,是 libnbd NBD 客户端库的一部分),检查暴露出来的 dirty map,看看 QCOW2 镜像的哪些区域是脏的。这使得客户端工具可以有选择地只复制出被修改的数据块。其他的演示包括如何把 bitmap 和 overlay 结合起来,以及 push 和 pull 的备份流程。

"只要 guest 数据没有被破坏,那么完整备份总是不会错的。这里介绍的跟踪变动过的 block 只是一种优化手段。"Blake 在演讲初期就强调。如果有一天出了问题,(例如,如果你丢失了一个 bitmap),那么备选方案就是是进行完整备份。这样一来,guest 数据并没有丢失,只是在处理 guest 数据的时候损失了一些效率。

用户对 QEMU 的备份功能感到放心的话(包括如何备份、以及是否选择 QCOW2 格式),那么可以使用 push 方式的备份。但是,pull 方式的备份就使得我们可以利用任何其他备份框架了,只要允许这些备份框架来控制如何以及何时准确地复制出 dirty block 就好。

Conclusion

截至本文撰写时,支持差分备份的主要功能都合入 QEMU 5.2(2020 年 12 月到期)中了。QEMU 6.0(将于 2021 年初发布)的一个改进目标就是可以动态控制打开 backing chain,允许 libvirt 把那些过长的 QCOW2 disk-image chain 给缩短(这个动作名为"block commit"),这样就可以在 backing chain 里面依旧保持 bitmap 的语义不变。

差分备份现在仍然是 libvirt 的一个 "opt-in" 功能。要想默认开启,还需要等待最终的 QEMU 接口被标记为 stable 才行。大家还在努力争取推送到 upstream。

早在 2015 年的 KVM 论坛上,差分备份的初始设计就被首次提出(John Snow 和 Vladimir Sementsov-Ogievskiy 撰写的 "Incremental Backups - Good things come in small packages"),2016 年(Max Reitz 撰写的 Backups (and snapshots) with QEMU)和 2018 年(Blake 撰写的 "Facilitating Incremental Backup")的文章都是相应的后续工作。从那时起,QEMU 和 libvirt 的 block layer 进行了许多改动,包括对 block device 的配置方式进行了重大的重新设计。所有这些,加上最近在 QEMU 中改进 bitmap 处理和 NBD 支持的工作,开辟了与备份相关的新的使用场景。这包括可以让第三方的备份客户端采取 pull 方式进行备份,并在 QEMU 和 libvirt 软件栈之上提供 changed-block tracking 方案。现在,只需要一个能够读取 bitmap 的 NBD 客户端,然后就可以用自己喜欢的方式来处理数据了。最近的项目,比如 libnbd(2019 年开始),会让编写这样的 NBD 客户端的工作变得更加容易。

[我要感谢 Eric Blake 对本文的严格审查] 。

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

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

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

QEMU的块设备动态迁移(live block migration) QEMU的动态块设备迁移分为几种情形: migrate -b : 这是最原始的 块设备迁移 的实现方式.  这种方式将块设备的内容作为live migaration stream的一部分. 使用dirty bitmap,并且采用了pre-copy的方法.不过这种方法慢慢的被灵活性更好的方法替代了.block-stream: 可以用作 pre-copy 和post-copy两种迁移. 它将产生 阅读详情

相关推荐

QEMU monitor控制台使用详解

为什么要使用 QEMU monitor命令? 在前面学习ubuntu启动第一个虚拟机时,发现我们在使用启动QEMU之后,我们的终端会卡住。而现在我们在启动QEMU时使用了monitor,终端会进入monitor的控制台,通过这个控制台,我们可以与QEMU或者运行状态的虚拟机进行交互。 现在有很多图形界面的虚拟机管理工具,如virt-manager等。在monitor的控制台窗口输入命令似乎更符合Linux程序员的开发习惯,而且还能完成一些图形化管理工具所不具备的功能。 在monitor控制台中,可以完成很多

太阳以西?的博客 2万+

PVE世界常见的存储格式,qcow2/raw/vmdk

pve 之上的虚拟机,需要依托硬盘使用。虚拟机的硬盘实际上是分配在宿主机的一个块文件,然后由 pve 核心转换使用。其中,pve 常用的有两种格式,qcow2 跟 raw。vmware 有自己的格式 vmdk。这三种格式的虚拟硬盘文件都有工具相对应转换。

weixin_42445065的博客 1万+

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 276

Qemu 增量备份功能当前的问题及解决方案

Qemu 中提供了一种增量的backup机制,其核心的思想是写时复制,这里的写表示的是guest的写操作,其主要的工作原理是backup的工作线程会根据qemu中维护的block dirty bitmap 将新写入的数据块写到备份的存储设备当中,如果在备份的工作中block dirty bitmap中对应的某个数据块被guest写入,qemu会优先将img 中的该数据块复制到备份存储设备中,然后在...

liliang365的专栏 1056

virtnbdbackup:通过NBD进行Libvirt Qemu增量备份

virtnbdbackup libvirt的备份实用程序,使用最新的CBT功能。 创建虚拟机的完整备份和增量备份。 工作正在进行中 .. 先决条件 显然,libvirt / qemu版本支持增量备份功能。 (centos8高级虚拟化流中的libvirt 6.x确实具有必需的功能)。 要从流中安装libvirt,请使用: yum install centos-release-advanced-virtualization yum update yum module install virt 虚拟机必须通过包括功能声明并在其配置中使用扩展模式来启用增量备份功能,如下所示: <domain type='kvm' id='1' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> [..] <qemu>

BCIC IV 2a数据集:从下载到实战应用全解析

本文全面解析了BCI Competition IV 2a(BCIC IV 2a)数据集的应用流程。从官方渠道下载数据、解析其结构,到在MATLAB和Python环境中进行数据导入、预处理(包括处理特殊受试者A04T),并详细演示了从特征提取(如CSP)到分类(如LDA、SVM)的完整实战步骤,为脑机接口研究者提供了从入门到实践的清晰指南。

weixin_28235513的博客 972

QEMU-KVM磁盘在线备份

QEMU/KVM磁盘的在线完整及增量备份,是“打包”方案的一种具体实现,可实现基于时间点的备份,同时支持本地与远程2种备份方式,并可指定备份文件进行恢复。 1. 本文缘由 在虚拟化底层技术中,存储是重中之重,没有人愿意丢数据。因此备份就显得尤为重要 根据备份的实现方案可分为2类: ▷ 副本:可以单纯从后端存储上直接实现,而无需计算层面的帮助,比如Ceph可以做多副本,本地盘文件形式可以通过DRBD技术做实时同步。副本方案提高了存储的整体可靠性 ▷ 打包:表示对磁盘数据进行定期打包导出,当需要恢复的时候,可以

rayylee 2144

Geant4学习一:写一个简单程序

1、 基本介绍

ccwwNUAA的博客 7697

完全备份 、差异备份、增量备份的区别和特点

您必须具有上一次全备份和所有增量备份磁带(一旦丢失或损坏其中的一盘磁带,就会造成恢复的失败),并且它们必须沿着从全备份到依次增量备份的时间顺序逐个反推恢复,因此这就极大地延长了恢复时间。增量备份过程中,只备份有标记的选中的文件和文件夹,它清除标记,既备份后标记文件,换言之,清除存档属性。差异备份过程中,只备份有标记的那些选中的文件和文件夹。通过上面的概念分析可以知道,差异备份与增量备份的区别在于它们备份的参考点不同前者的参考点是上一次完全备份、差异备份或增量备份,后者的参考点是上一次完全备份。...

guokeeiron的博客 2万+

STM32中断实战:用ITR9606红外传感器DIY转速计数器(附完整代码)

本文详细介绍了如何使用STM32中断机制和ITR9606红外传感器DIY高精度转速计数器。从传感器选型、中断配置到抗干扰设计,提供完整的实战指南和优化代码,特别适合嵌入式开发者和硬件工程师快速实现工业级转速检测系统。

weixin_29159613的博客 288

即插即用系列(代码实践) | CVPR 2025 WPFormer:小波与原型增强Transformer——表面缺陷检测SOTA,专治弱缺陷与杂乱背景

摘要:本文提出了一种基于小波变换和原型增强的Transformer模型(WPFormer),用于像素级表面缺陷检测。该模型针对工业场景中微弱缺陷难以识别和杂乱背景干扰严重的问题,创新性地将小波变换引入Transformer的注意力机制,通过频域信息分离噪声与边缘特征,同时利用原型向量引导查询,实现了更精准的缺陷定位。核心模块包括小波增强交叉注意力(WCA)和原型引导交叉注意力(PCA),适用于工业缺陷检测、伪装目标检测和医学图像分割等任务。代码已开源,支持即插即用集成到现有框架中。

分享顶会顶刊论文即插即用模块 299

Qemu 中 Bitmap 的应用

Bitmap(位图)是一种常用的结构,通过使用 bit 位来记录一些逻辑状态。在 Qemu 中,Bitmap 用来记录 block 块设备的 sectors 是否为脏块,并被应用于多种常用的 block 操作中。一、Qemu 中 Bitmap 结构简介通常,一个 unsigned long 类型变量或数组即可作为 Bitmap 来记录状态,但当 Bitmap 比较大的时候,它的操作效率很低。Qem...

didi_cloud的博客 716

STM32实现简单的智能电梯控制

上述代码实现了一个简单的智能电梯控制器。电梯的状态包括IDLE(停止)、UP(向上移动)和DOWN(向下移动)三种状态。通过向上和向下按钮的按下,可以控制电梯移动到指定的楼层。在主循环中,不断读取当前楼层的按钮状态,并根据电梯状态决定执行的动作。具体的楼层数量和按钮的GPIO引脚可以根据实际情况进行调整。要实现简单的智能电梯控制,我们可以使用STM32微控制器来实现。

2401_85258012的博客 336

QEMU-img工具

QEMU-img工具

一起coding,一起嗨。 2377

基于Transformer的股票市场多因子量化选股模型,深度解析:基于Transformer的股票市场多因子量化选股模型

传统多因子模型通常采用线性回归、岭回归或Lasso回归来估计因子权重,其核心假设是因子与未来收益之间存在线性关系。然而,现实中的股票市场具有典型的非线性、非平稳和高噪声特征。卷积神经网络(CNN)擅长提取局部特征,但难以捕捉全市场股票之间的全局依赖关系;循环神经网络(RNN)及其变体LSTM虽然能处理时间序列,但存在梯度消失问题且难以并行计算。Transformer的self-attention机制能够:直接建模任意两只股票之间的相关性动态计算因子权重而非静态线性组合。

YOLO 250

SPI 总线信号完整性与时序一致性测试

SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性

硬核科技 328

一文弄懂什么是差异备份和增量备份

一文弄懂什么是差异备份和增量备份 文章目录一文弄懂什么是差异备份和增量备份前言1.概念1.差异备份概念2.增量备份概念2.差异备份和增量备份的区别总结 前言 有很多人分不清什么是差异备份和增量备份,我就来简单的阐述一下我的看法。 1.概念 1.差异备份概念 差异备份较小,还原比完整备份更快且对性能影响最小。 备份自上一次完全备份之后有变化的数据。差异备份过程中,只备份有标记的那些选中的文件和文件夹...

double_happy111的博客 6506

STM32 IIC电量计LTC2944

LTC2944是一款电池电量计,设计用于端电压为3.6V至60V的多节电池。它测量电池充电和放电、电池电压、电流和自身温度。精密模拟库仑计数器通过电池正极端子与负载或充电器之间的检测电阻器对电流进行积分。电池电压、电池电流和硅温度由内部ADC测量。

baidu_34971492的博客 3161

Ubuntu 22.04上构建libvirt源码错误解决

Ubuntu 22.04上构建libvirt源码错误解决

一起coding,一起嗨。 1739

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

06、KVM虚拟化qemu-img命令详解

qemu-img命令详解 qemu-img是QEMU的磁盘管理工具,在qemu-kvm源码编译后就会默认编译好qemu-img这个二进制文件。 qemu-img也是QEMU/KVM使用过程中一个比较重要的工具,本节对其用法和实践使用方法进行介绍。 qemu-img工具的命令行基本用法如下: qemu-img command [command options] 它支持的命令分为如下几种: (1)check [-f fmt] filename 对磁盘镜像文件进行一致性检查,查找镜像文件中的错误,目前仅支持对“

迷逝 3234

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

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

qemu中的Hbitmap数据结构

尽管unsigned long已经能够胜任bitmap的实现,但是这样实现的bitmap,当bitmap比较大的时候,它的操作效率很低。典型的,像为BlockDriver维持bitmap,磁盘文件的每个块都对应一个bit位,那么这张bitmap表是很大的。如果在热迁移过程中,需要将镜像文件热迁移到目标宿主机,每次查询bitmap的效率很低。因此,QEMU针对磁盘镜像文件设计了HBitmap数据结构。

简单博客All In 1457

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

一文搞懂增量备份和差异备份的区别

增量备份指的是从上一次备份以来,所有发生变化的数据都会被备份。换句话说,它只备份自上一次备份(无论是完整备份还是增量备份)后发生变化或新增的文件。

m0_75005064的博客 2711

KVM之使用libvirt做QEMU/KVM、Nova实例的快照

学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分配和 SR-IOV (5)libvirt 介绍 (6)Nova 通过 libvirt 管理 QEMU/KVM 虚机 (7)快照 (snapshot) (8)迁移 (migration) 本文将梳理 QEMU/KVM 快照相关的知识,以及在 OpenStack Nova 中使

Yonx 1155

KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]...

 学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分配和 SR-IOV (5)libvirt 介绍 (6)Nova 通过 libvirt 管理 QEMU/KVM 虚机 (7)快照 (snapshot) (8)迁移 (migrati...

weixin_34111819的博客 534

ovirt增量备份

增量备份 摘要 通过仅备份已更改的块并避免临时快照,此功能可简化,加速并提高鲁棒性。通过支持原始来宾数据的备份和还原,而与基础磁盘格式无关,可以改善与备份应用程序的集成。 所有者 尼尔·索弗(Nir Soffer)(nsoffer@redhat.com) 丹尼尔·埃雷兹(Daniel Erez)(derez@redhat.com) Eyal Shenitzky(eshenitz@re...

allway2的博客 1525

四路 CAN 转 4G 网关

SG‑CAN‑4G‑410 为**四路隔离 CAN 转 4G 工业网关**,把 CAN2.0A/B 报文封装成 TCP/UDP 报文,通过 4G 无线网络实现 CAN 总线远程监控、远程控制。四路 CAN 相互独立;以太网仅用于本地配置,不做业务数据传输;支持移动 / 联通 / 电信 4G 网络。

S2003120416的博客 160
上一篇: LWN: iproute2和libbpf如何打包!
下一篇: LWN: systemd代为受过,增加bind事件支持!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值