Fuse 学习

本文深入探讨了Fuse文件系统的核心工作流程,包括用户态与内核态的交互机制、基本工作流程及如何通过配置与操作实现文件系统管理。
1. enable debug
     a. 修改 lib/Makefile, 添加 -O0, -g2 在 CC后面
     b. root@ub1:/home/shawn/src/fuse-2.9.0/example# gcc -g2 -O0 -Wall -c hello.c -o hello.o -D_FILE_OFFSET_BITS=64
     c.  root@ub1:/home/shawn/src/fuse-2.9.0/example# gcc -g2 -O0 -o hello hello.o ../lib/.libs/*.o -lpthread -ldl -lrt
     d. gdb hello
2. fuse 内核态通知用户态的机制, 可以参见
  其准备好了之后, 调用queue_request, 然后呢 这个里面调用这个kill_fasync 来做到。

3. fuse的基本工作流程
1. 在用户态只用 fuse程序,执行之后,
     a. 该进程会打开 /dev/fuse文件,得到fd
     b. 会自动挂载一个fuse类型的问题系统。并将fd作为mount option,传递给内核文件系统。
     c. 然后,程序会变成一个用户态的daemon进程,不停的读取(read)fd里面的内容。
     d. fd里面的内容呢, 当然就封装了要操作的方法,以及内容,参数等信息。
     e. 得到上述的信息之后呢,就可以进行操作了, 相当于rpc调用一样哦。
2. 内核模块
     上面提到了 fuse文件系统,以及字符设备 /dev/fuse, 这两个东西,是需要内核来支持的。
     a. 这两个东西,都是在内核模块fuse里面来实现的。
     b. 模块启动的时候,注册了fuse类型的文件系统,并且初始化了/dev/fuse设备。
3. 对文件系统的操作。
     例如,对mkdir操作。
     a. 对文件系统进行mkdir操作的话,会调用fuse的mkdir操作。
     b. fuse文件系统里面,会将该操作的op, arg等封装好了,然后发给 fuse_session, 并唤醒wait_queue,
     c. 而用户态进程呢,即刚刚那个fuse程序,不停的read,其实最后会调用内核态的fuse_dev_read函数。
     d. 而此函数呢,通过file结构,得到fuse session结构,然后就在该结构上面等带咯。
        直到c步骤中写入数据,并唤醒。
4. 重要:
     1. 这个里面,fuse程序是一直在run的,一旦不run了,文件系统就不能访问了。
     2. 这里除了fuse程序作为rpc server外,还有个很重要的。
     3. 在fuse程序里面,打开了/dev/fuse文件,
     4. 然后呢,在调用mount函数来mount fuse文件系统, 在fuse文件系统的fillsuper里面呢,
        得到上面的/dev/fuse文件结构struct file,并将fuse文件系统的session存储到struct file中。
     5. 而fuse_dev_read中,就是根据struct file来得到fuse session的,并进行wait的。
     6. 从上面可以看到,fuse文件系统和fuse_dev_read里面必须使用同一个struct file结构,
     7. 而struct file是属于进程的,即这两个东西,都是属于fuse程序的,因为他们都是被fuse程序调用而创造出来的,
          当然最后,fuse进行被daemon化了,所以strut file是一直存在的。
### 深度学习 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),同时打印出各子模块内的独立变量数目详情表单。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值