-
Notifications
You must be signed in to change notification settings - Fork 39
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
puck::PuckIndex::train: free(): invalid next size (normal) #33
Comments
Hi dqxcj, |
参数如下: |
在puck assign也偶尔会出现core
|
Hi dqxcj, We apologize for not being able to reproduce the issue with the parameters you provided. However, we have identified a potential memory corruption issue in the file As a result, we have pushed a new branch named |
好的,感谢,我试试 |
还是会core:
|
Hi dqxcj, We have noticed that your log shows: If the nsq parameter is set to 32 and the dataset dimension is 32, there should not be such output for reporting the sub-dimension 32 clustering error. Please provide the complete log information and executed command line, double-check the train/build parameters as well as the dataset to ensure they are valid. This will help us further diagnose the issue. The relevant code context is located at lines 849 and 867 in the file |
明白了,这里我的nsq确实设置的不是32,而是33,谢谢。 |
我尝试将聚类中心个缩小为100,发现还是报错,而且从偶发性变成了必发性,可能确实数据规模太小了或者这个数据集不适合kmeans,或者我的配置有其它错误吗?
日志:
数据格式:参考的ann-benchmarks. num + dimension + data |
nsq设置为32仍会报错(index_conf.show()中nsq是33是因为ip2cos=1)
|
puck支持3种距离计算,分别配置如下: 你的配置,看着是期望ip距离。ip2cos,对数据集做了一个转换,用到的是 这个转换在训练之前要做,转换后的数据默认存储在puck_index/all_data.feat.bin,这个时候文件的长度得 = 样本总数 * (sizeof(float) * (32 + 1)维度 + sizeof(int)) 。
这个数据集的向量模不满足需求(<1.0),所以没办法直接计算ip距离。只能用cos距离作为近似距离计算,我测试cos是ok的,可以试试修改下参数(设置whether_norm: true,去掉ip2cos: 1) 。 我试着把数据集先按比例缩小,再用ip2cos。filter_nsq = 8 会出core,filter_nsq=6是ok的。应该是一些边界条件没做检查,需要定位一下问题&修复一下bug。 |
这里我用的确实有点迷糊,有些问题想请教一下:
static int IP2L2Convert(const std::vector<float>& org, std::vector<float>& convert, const ConvertParam& param) {
convert = org;
if (param.query_flag) { // query向量处理
convert.emplace_back(0.0);
} else { // item向量处理
convert.emplace_back(sqrt(param.max_phi_square - Square(org)));
}
return 0;
} |
|
提前做转换,对于puck来说,他处理的是转换后的32+1维的数据集,不知道32维数据集的存在。 32维数据集的暴力搜索结果与32+1暴力结果有diff,是Theorem 1导致的。puck的理想召回结果是32+1的暴力。 |
好嘞,我消化一下,非常感谢两位大佬的帮忙 |
已修,推在分支 在@nk2014yj 麻烦请重新测试代码以验证问题是否解决,谢谢。 |
这边加个判断就好了,while(lsq * (nsq - 1) > dim){nsq --;} |
bug表现
在测试puck过程中发现一个偶发性bug,表现如下面两张图
gdb调试发现是puck::PuckIndex::train: 795的
std::unique_ptr<float[]> kmeans_train_vocab(new float[train_vocab_len]);
在释放时报的错:怀疑是往kmeans_train_vocab填充数据时内存越界了,导致train结束释放kmeans_train_vocab时出现问题。
在复现时发现,召回率不理想的小数据集(80k行,32维,top300召回率10%)出现这个bug的概率较高(大数据集跑起来太慢,没咋测试)
环境信息
The text was updated successfully, but these errors were encountered: