Fuse学习

FUSE是一个让用户在用户空间实现文件系统的框架,减少了内核编程的复杂性。Go-Fuse是其在Go语言中的实现,它提供了与内核交互的接口,允许开发者轻松创建自定义文件系统。FUSE的特点包括用户空间开发、无需重新编译内核以及支持多种编程语言。文章提到了FUSE的主要组成部分:内核模块、libfuse库和挂载工具fusermount。

GitHub - juicedata/go-fuse: FUSE bindings for Go

FUSE概述 FUSE(用户态文件系统)是一个实现在用户空间的文件系统框架,通过FUSE内核模块的支持,使用者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文件系统。 在fuse出现以前,Linux中的文件系统都是完全实现在内核态,编写一个特定功能的文件系统,不管是代码编写还是调试都不太方便,就算是仅仅在现有传统文件系统上添加一个小小的功能,因为是在内核中实现仍需要做很大的工作量。在用户态文件系统FUSE出现后(2.6内核以后都支持fuse),就会大大的减少工作量,也会很方便的进行调试。编写FUSE文件系统时,只需要内核加载了fuse内核模块即可,不需要重新编译内核。 FUSE 特点     用户空间文件系统——类Unix OS的框架     允许非超户在用户空间开发文件系统     内核的API接口,使用fs-type操作     支持多种编程语言( c、c++、perl、java 等)     普通用户也可以挂载FUSE     不用重新编译内核 FUSE组成 fuse主要由三部分组成:FUSE内核模块、用户空间库libfuse以及挂载工具fusermount。     fuse内核模块:实现了和VFS的对接,实现了一个能被用户空间进程打开的设备,当VFS发来文件操作请求之后,将请求转化为特定格式,并通过设备传递给用户空间进程,用户空间进程在处理完请求后,将结果返回给fuse内核模块,内核模块再将其还原为Linux kernel需要的格式,并返回给VFS;     fuse库libfuse:负责和内核空间通信,接收来自/dev/fuse的请求,并将其转化为一系列的函数调用,将结果写回到/dev/fuse;提供的函数可以对fuse文件系统进行挂载卸载、从linux内核读取请求以及发送响应到内核。libfuse提供了两个APIs:一个“high-level”同步API 和一个“low-level” 异步API 。这两种API 都从内核接收请求传递到主程序(fuse_main函数),主程序使用相应的回调函数进行处理。当使用high-level API时,回调函数使用文件名(file names)和路径(paths)工作,而不是索引节点inodes,回调函数返回时也就是一个请求处理的完成。使用low-level API 时,回调函数必须使用索引节点inode工作,响应发送必须显示的使用一套单独的API函数。     挂载工具:实现对用户态文件系统的挂载

### 深度学习 Fuse 模块的功能与作用 #### 1. Fuse 模块的核心功能 Fuse 模块的主要目的是通过融合多个卷积层的操作来优化模型性能和推理速度。具体来说,在 PyTorch 的实现中,`fused_module_class_map` 字典被用来定义不同类型的模块与其对应融合后的模块之间的映射关系[^1]。这种设计允许开发者快速替换原始模块为经过优化的版本。 例如,在 YOLOv5 中,C3 模块是一个典型的例子,它可以通过特定方式与其他组件(如 BatchNorm 和 Convolution 层)进行融合以减少计算开销并提升效率[^2]。 以下是 C3 模块的一个简化版代码示例: ```python import torch.nn as nn class Bottleneck(nn.Module): def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): super().__init__() c_ = int(c2 * e) # hidden channels self.cv1 = nn.Conv2d(c1, c_, 1, 1) self.bn1 = nn.BatchNorm2d(c_) self.act1 = nn.SiLU() self.cv2 = nn.Conv2d(c_, c2, 3, 1, padding=1, groups=g) self.bn2 = nn.BatchNorm2d(c2) self.act2 = nn.SiLU() self.add = shortcut and c1 == c2 def forward(self, x): y = self.act1(self.bn1(self.cv1(x))) y = self.act2(self.bn2(self.cv2(y))) return x + y if self.add else y class C3(nn.Module): def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): super().__init__() c_ = int(c2 * e) self.cv1 = nn.Conv2d(c1, c_, 1, 1) self.m = nn.Sequential(*[Bottleneck(c_, c_) for _ in range(n)]) self.cv2 = nn.Conv2d(c_, c2, 1, 1) def forward(self, x): return self.cv2(torch.cat((self.m(self.cv1(x)), self.cv1(x)), dim=1)) ``` 上述代码展示了如何构建一个基本的 `C3` 结构,并利用瓶颈结构 (Bottleneck) 来增强特征提取能力[^4]。 --- #### 2. Fuse 操作的作用 在实际应用中,fuse 操作通常涉及以下几个方面: - **Batch Normalization 融合**:将卷积层和紧随其后的批量归一化操作合并成单一矩阵运算,从而降低内存访问次数并提高运行效率。 - **通道维度调整**:通过对输入张量的不同部分执行加权求和或其他线性变换,使得最终输出能够更好地捕捉全局上下文信息。 - **加速推断过程**:当部署到边缘设备上时,预先完成这些静态转换可以显著缩短延迟时间。 对于像 YOLO 这样的目标检测算法而言,合理运用 fuse 技术不仅有助于改善精度表现,还能满足实时处理的需求[^3]。 --- #### 3. 查看模型参数量及相关指标的方法 为了评估所创建网络架构的效果,我们还需要掌握一些工具方法去统计总的可训练权重数量以及其他重要属性值。下面给出一段示范脚本供参考: ```python from thop import profile from prettytable import PrettyTable def count_parameters(model): table = PrettyTable(["Modules", "Parameters"]) total_params = 0 for name, parameter in model.named_parameters(): param_count = parameter.numel() table.add_row([name, param_count]) total_params += param_count print(table) print(f"Total Trainable Params: {total_params}") return total_params # Example usage with a dummy network instance 'net' input_tensor = torch.randn(1, 3, 640, 640).to(device='cuda') macs, params = profile(net.to('cuda'), inputs=(input_tensor,)) count_parameters(net) print(f"Flops: {macs / 1e9} G") ``` 此段程序片段借助第三方库 THOP 计算每秒浮点数运算次数(FLOPs),同时打印出各子模块内的独立变量数目详情表单。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值