发现 liboauth 的一个 bug:FUSE 下 oauth_gen_nonce() 结果异常

本文详细记录了在使用liboauth时遇到的一个异常情况,并深入探讨了其与openssl的关系,通过实例代码展示了问题所在及解决方法。

转载时请注明出处和作者联系方式:http://blog.youkuaiyun.com/mimepp
作者联系方式:YU TAO <yut616 at sohu dot com>

关键字: linux,fuse, liboauth,oauth_gen_nonce,oauth_sign_hmac_sha1

这里记录一下遇到的一个 liboauth 结果异常的情况。

例子代码:

http://www.kuaipan.com.cn/file/id_12177787062321391.htm

Error log:
=========================
open_src/fuse_oauth$ make
Compiling hello.c
Building  hello
test/fuse_oauth$ mkdir /tmp/aaa
test/fuse_oauth$ ./hello /tmp/aaa/
test/fuse_oauth$ cat /tmp/aaa/hello
5555555555555555555555
test/fuse_oauth$
test/fuse_oauth$ cat /tmp/aaa/hello
5555555555555555555555
test/fuse_oauth$
test/fuse_oauth$
=========================

but if I remark line 138 (hello.c), which is a call in main function, the result will be correct:
    //oauth_nonce = oauth_gen_nonce();
=========================
test/fuse_oauth$ fusermount -u /tmp/aaa
test/fuse_oauth$ ./hello /tmp/aaa/
test/fuse_oauth$ cat /tmp/aaa/hello
e3BJGRSUFWBXeRF
test/fuse_oauth$
test/fuse_oauth$
test/fuse_oauth$
test/fuse_oauth$ cat /tmp/aaa/hello
EFJuwuxEvWNlJvO4f5nxBTg
=========================

PC: ubuntu 11.10
liboauth-0.9.4
liboauth-dev is installed by apt-get.
It will depends on libcurl4-nss-dev.
I do not compile liboauth by myself.

It seems liboauth is using openssl:
src/config.h:
#define HAVE_OPENSSL_HMAC_H 1
and the USE_NSS is not defined.
Then it will enter line 538:
src/oauth.c
=========================
#  include <openssl/rand.h>
#  define MY_RAND RAND_bytes
#  define MY_SRAND ;
=========================

BTW, auth_signature is NULL too.
http://openapi.kuaipan.cn/1/metadata/kuaipan/UML?oauth_consumer_key=xc8D2NfL9c53vkrP&oauth_nonce=aaaaaaaaaaaaaaa&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1332589513&oauth_token=32a7d5efb0d5442e8e32c6d7518e8239&oauth_version=1.0&oauth_signature=%28null%29

It seems nonce and signature are related to openssl.

<think>我们正在解决一个NameError:name 'fuse_conv_and_bn'is notdefined错误。根据用户提供的引用,我们可以推测类似错误的解决思路。虽然引用中是关于'selective_scan_fn'未定义的错误,但解决思路有相似之处:可能是函数未正确导入或未定义。根据引用[2]和[4]的提示,我们可以检查:1.是否导入了包含该函数的模块?2.导入的模块中是否确实存在该函数?3.是否因为环境问题导致导入失败?对于'fuse_conv_and_bn',它通常是一个用于融合卷积层和批量归一化层的函数。在Ultralytics YOLO的旧版本中,这个函数可能位于`utils.torch_utils`模块中。但是,在较新的版本中,这个函数可能被移除或者重命名了。因此,我们可以尝试以下解决方案:方法1:检查导入语句确保你正确导入了该函数:```pythonfrom ultralytics.utils.torch_utils importfuse_conv_and_bn```方法2:检查版本如果导入语句正确,但函数不存在,可能是版本问题。尝试升级或降级`ultralytics`库:```bash#升级pip install--upgrade ultralytics#或者降级到已知包含该函数的版本(例如8.0.x)pip installultralytics==8.0.20```方法3:自定义函数如果函数在新版本中被移除,我们可以自己实现一个`fuse_conv_and_bn`函数。以下是参考实现:```pythonimport torchimport torch.nn asnndeffuse_conv_and_bn(conv, bn):#初始化融合卷积层fusedconv= nn.Conv2d(conv.in_channels,conv.out_channels,kernel_size=conv.kernel_size,stride=conv.stride,padding=conv.padding,dilation=conv.dilation,groups=conv.groups,bias=True)#准备卷积核权重w_conv =conv.weight.clone().view(conv.out_channels,-1)w_bn =torch.diag(bn.weight.div(torch.sqrt(bn.eps +bn.running_var)))fusedconv.weight.data= torch.mm(w_bn,w_conv).view(fusedconv.weight.size())#准备偏置ifconv.bias isnot None:b_conv =conv.biaselse:b_conv =torch.zeros(conv.weight.size(0))b_conv =torch.mm(w_bn, b_conv.reshape(-1,1)).reshape(-1)b_bn =bn.bias -bn.weight.mul(bn.running_mean).div(torch.sqrt(bn.running_var +bn.eps))fusedconv.bias.data= b_conv+ b_bnreturn fusedconv```然后在代码中使用自定义的函数代替导入。方法4:检查环境确保没有其他环境问题,例如文件损坏。可以尝试重新安装torch和ultralytics。验证步骤:1.检查当前ultralytics版本:`import ultralytics; print(ultralytics.__version__)`2.在代码中尝试导入`fuse_conv_and_bn`,如果导入失败,则使用自定义函数。根本原因:在Ultralytics库的更新中,一些辅助函数可能会被移除或重构。`fuse_conv_and_bn`函数在旧版本中存在,但在新版本中可能被移除或整合到其他函数中。相关问题:1.如何融合卷积层和批量归一化层以加速推理?2.在PyTorch中如何自定义权重融合操作?3.如何解决Ultralytics库升级后的函数缺失问题?4.模型优化中还有哪些常用的操作融合技术?5.如何检查一个Python模块中是否包含特定函数?</think>### 解决 `NameError: name 'fuse_conv_and_bn' is not defined` 错误 #### 问题分析 该错误表明代码中尝试使用 `fuse_conv_and_bn` 函数,但 Python 解释器找不到它的定义。可能原因包括: 1. **缺少导入**:未正确导入包含该函数的模块 2. **版本兼容性**:库版本更新导致函数被移除或重命名 3. **路径问题**:模块不在 Python 搜索路径中 4. **函数未实现**:代码依赖的库未完整安装 --- #### 解决方案 ##### 方法 1:检查并修复导入语句 在代码中添加正确的导入语句: ```python # 尝试从常见位置导入 from ultralytics.utils.torch_utils import fuse_conv_and_bn # Ultralytics 位置 from torch.nn.utils import fuse_conv_and_bn # PyTorch 原生位置 from mmcv.cnn import fuse_conv_and_bn # MMCV 框架位置 ``` ##### 方法 2:自定义实现函数 如果库中不存在该函数,可手动实现卷积-BN融合: ```python import torch import torch.nn as nn def fuse_conv_and_bn(conv, bn): """ 融合卷积层和BN层 参考: https://github.com/ultralytics/yolov5/blob/master/utils/torch_utils.py """ fusedconv = nn.Conv2d( conv.in_channels, conv.out_channels, kernel_size=conv.kernel_size, stride=conv.stride, padding=conv.padding, groups=conv.groups, bias=True ).requires_grad_(False) # 融合权重 w_conv = conv.weight.clone().view(conv.out_channels, -1) w_bn = torch.diag(bn.weight.div(torch.sqrt(bn.eps + bn.running_var))) fusedconv.weight.data = torch.mm(w_bn, w_conv).view(fusedconv.weight.shape) # 融合偏置 if conv.bias is not None: b_conv = conv.bias else: b_conv = torch.zeros(conv.weight.size(0)) b_bn = bn.bias - bn.weight * bn.running_mean / torch.sqrt(bn.running_var + bn.eps) fusedconv.bias.data = (torch.mm(w_bn, b_conv.reshape(-1, 1)).reshape(-1) + b_bn return fusedconv ``` ##### 方法 3:检查库版本与安装 1. **验证库安装**: ```bash pip list | grep -E "ultralytics|torch|mmcv" ``` 2. **更新/重装库**: ```bash pip install --upgrade --force-reinstall torch ultralytics ``` 3. **检查函数存在性**: ```python import inspect from ultralytics.utils import torch_utils print(inspect.getmembers(torch_utils)) # 查看所有可用函数 ``` ##### 方法 4:添加路径搜索 若使用自定义模块: ```python import sys sys.path.append("/path/to/your/module") # 添加模块所在路径 from your_module import fuse_conv_and_bn ``` --- #### 验证步骤 1. 在代码开头添加测试: ```python try: from ultralytics.utils.torch_utils import fuse_conv_and_bn print("函数导入成功") except ImportError: print("使用自定义实现") # 添加自定义函数实现 ``` 2. 检查函数文档: ```python help(fuse_conv_and_bn) # 查看函数文档 ``` --- #### 技术背景 `fuse_conv_and_bn` 用于优化神经网络推理速度,通过将卷积层(Conv)和批量归一化层(BN)合并为单一卷积层: 1. **数学原理**:合并操作基于线性变换性质 设卷积输出 $Y = W*X + b$,BN输出 $Z = \gamma\frac{Y-\mu}{\sqrt{\sigma^2+\epsilon}} + \beta$ 合并后:$Z = W'*X + b'$,其中: $$ W' = \frac{\gamma}{\sqrt{\sigma^2+\epsilon}}W, \quad b' = \frac{\gamma(b-\mu)}{\sqrt{\sigma^2+\epsilon}} + \beta $$ 2. **优势**:减少40%层计算量,提升推理速度[^1] 3. **应用场景**:模型部署前优化、移动端推理加速 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值