EXP-00091: Exporting questionable statistics.问题解决!

本文解决了Oracle导出统计信息时出现的可疑统计问题。主要原因是数据库服务器与客户端的字符集设置不一致导致。通过调整Oracle用户的环境变量,使其与数据库服务器字符集保持一致来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从某帖子搬过来的:

Cause: Export was able to export statistics, but the statistics may not be useable. The statistics are questionable because one or more of the following happened during export: a row error occurred, client character set or NCHARSET does not match with the server, a query clause was specified on export, only certain partitions or subpartitions were exported, or a fatal error occurred while processing a table.

Action: To export non-questionable statistics, change the client character set or NCHARSET to match the server, export with no query clause, or export complete tables. If desired, import parameters can be supplied so that only non-questionable statistics will be imported, and all questionable statistics will be recalculated.

解决:
linux下的oracle用户的环境变量语言集和oralce数据库中的环境变量语言集不相同。
查看oracle的环境变量语言集:
数据库服务器字符集:
select * from nls_database_parameters
客户端字符集:
select * from nls_instance_parameters

将oracle用户的环境变量语言集改成和数据库服务器字符集一样。
export NLS_LANG=american_america.ZHS16GBK
(gguf-env-video) ubuntu@ubuntu-Lenovo-Product:~/llama.cpp$ python convert_hf_to_gguf.py /home/ubuntu/.cache/modelscope/hub/models/iic/QwenLong-L1-32B-AWQ --outtype f16 --outfile qwenlong-32b.f16.gguf INFO:hf-to-gguf:Loading model: QwenLong-L1-32B-AWQ INFO:hf-to-gguf:Model architecture: Qwen2ForCausalLM INFO:gguf.gguf_writer:gguf: This GGUF file is for Little Endian only INFO:hf-to-gguf:Exporting model... INFO:hf-to-gguf:gguf: loading model weight map from 'model.safetensors.index.json' INFO:hf-to-gguf:gguf: loading model part 'model-00001-of-00004.safetensors' INFO:hf-to-gguf:token_embd.weight, torch.float16 --> F16, shape = {5120, 152064} INFO:hf-to-gguf:blk.0.attn_norm.weight, torch.float16 --> F32, shape = {5120} Traceback (most recent call last): File "/home/ubuntu/llama.cpp/convert_hf_to_gguf.py", line 6560, in <module> main() File "/home/ubuntu/llama.cpp/convert_hf_to_gguf.py", line 6554, in main model_instance.write() File "/home/ubuntu/llama.cpp/convert_hf_to_gguf.py", line 403, in write self.prepare_tensors() File "/home/ubuntu/llama.cpp/convert_hf_to_gguf.py", line 277, in prepare_tensors for new_name, data_torch in (self.modify_tensors(data_torch, name, bid)): File "/home/ubuntu/llama.cpp/convert_hf_to_gguf.py", line 2730, in modify_tensors yield from super().modify_tensors(data_torch, name, bid) File "/home/ubuntu/llama.cpp/convert_hf_to_gguf.py", line 245, in modify_tensors return [(self.map_tensor_name(name), data_torch)] File "/home/ubuntu/llama.cpp/convert_hf_to_gguf.py", line 236, in map_tensor_name raise ValueError(f"Can not map tensor {name!r}") ValueError: Can not map tensor 'model.layers.0.mlp.down_proj.qweight'
最新发布
07-03
<think>我们遇到了一个在将HuggingFace模型转换为GGUF格式时的张量映射错误。具体错误信息是:ValueError: Cannot maptensor 'model.layers.0.mlp.down_proj.qweight'这个错误通常发生在使用`convert_hf_to_gguf.py`脚本转换量化模型(如AWQ、GPTQ)时,因为量化模型的权重名称与原始FP16模型的权重名称不同。脚本可能没有正确识别量化模型的权重名称。 ###问题分析1.**量化模型结构差异**:量化模型(如AWQ)的线性层权重名称通常包含`qweight`、`qzeros`、`scales`等后缀,而原始FP16模型则没有。转换脚本可能只支持原始FP16模型的权重名称映射。 2. **脚本支持不足**:`convert_hf_to_gguf.py`脚本可能未更新以支持特定的量化模型(如QwenLong的AWQ版本)。###解决方案根据引用[1]中提到的权重映射原理,我们需要修改转换脚本以支持量化模型的权重名称。以下是具体步骤:####步骤1:确认模型类型-如果模型是量化模型(如AWQ),则转换脚本需要特殊处理。QwenLong-L1-32B-AWQ显然是AWQ量化模型。 ####步骤2:修改转换脚本我们需要在`convert_hf_to_gguf.py`脚本中添加对量化权重名称的映射规则。具体修改如下: 1. **定位权重映射字典**:在脚本中找到`tensor_map`字典(或类似结构),它定义了HuggingFace模型权重名称到GGUF模型权重名称的映射。2.**添加量化权重映射**:为量化模型的权重(如`qweight`、`qzeros`、`scales`)添加映射规则。例如,对于`mlp.down_proj`层,原始FP16模型的权重名称为`model.layers.0.mlp.down_proj.weight`,而量化模型则可能是`model.layers.0.mlp.down_proj.qweight`。我们需要将其映射到GGUF中的对应名称。####修改示例假设原始`tensor_map`定义如下(在脚本中搜索`tensor_map`):```pythontensor_map= gguf.get_tensor_name_map(arch, block_count)``` 我们可以通过添加条件分支来处理量化权重。在脚本中找到处理每一层权重的循环(通常是在`load_weights`函数中),然后修改为: ```python#修改前(可能只处理weight) if"down_proj.weight" inname:new_name =gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.FFN_DOWN]+ "."+ name.split('.')[-2]data=torch.permute(data,(1,0))#注意:可能需要转置print(name, "=>",new_name)return new_name,data#修改后:支持量化权重if"down_proj" inname:if"qweight"in name:#处理量化权重qweightnew_name =gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.FFN_DOWN] +".qweight"#注意:量化权重可能不需要转置,具体取决于模型结构print(name, "=>",new_name)return new_name,dataelif"scales"in name:new_name= gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.FFN_DOWN]+ ".scales"print(name, "=>",new_name)return new_name,data#...其他量化权重如qzeros等else:#原始FP16权重new_name =gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.FFN_DOWN] +"." +name.split('.')[-2]data =torch.permute(data,(1,0))print(name,"=>", new_name)returnnew_name, data```####步骤3:使用社区解决方案如果手动修改复杂,可以尝试以下方法:1.**使用最新脚本**:确保`llama.cpp`仓库是最新的,因为开发者可能已添加支持。```bashcd llama.cppgitpull originmaster``` 2. **使用专用转换脚本**:对于AWQ模型,使用`convert.py`(注意:不是`convert_hf_to_gguf.py`):```bashpythonconvert.py /path/to/QwenLong-L1-32B-AWQ--outtype f16 --outfileqwenlong-32b.f16.gguf```注意:这个`convert.py`是专门用于转换量化模型的,位于`llama.cpp`根目录。###完整转换命令(针对AWQ模型)```bash#进入llama.cpp目录cdllama.cpp#安装依赖pip install-rrequirements.txt#转换AWQ模型(使用convert.py) pythonconvert.py/home/ubuntu/.cache/modelscope/hub/models/iic/QwenLong-L1-32B-AWQ --outtypef16--outfile qwenlong-32b.f16.gguf```###注意事项1. **权重转置**:有些模型(如LLaMA)的权重在转换时需要转置(`permute`),而量化模型可能不需要,具体取决于模型结构。 2. **量化参数**:除了`qweight`,还需要处理`qzeros`、`scales`等量化参数,否则转换后的模型无法正常工作。 3. **模型架构支持**:确保`llama.cpp`支持目标模型架构(如QwenLong)。如果不支持,可能需要修改`gguf`写入部分的代码。###验证转换完成后,使用`llama.cpp`的`main`可执行文件进行推理测试: ```bash./main-mqwenlong-32b.f16.gguf -p "你好"-n100``` 如果遇到其他张量映射错误,按照同样方法在脚本中添加对应映射规则。###替代方案如果以上方法无效,可以尝试:1.将AWQ模型先转换为FP16原始模型,再转换为GGUF(可能损失精度):```pythonfrom awq.quantize.pre_quantimport apply_awqapply_awq(model_path,output_path)#伪代码,具体参考AWQ官方文档```2.使用[AutoAWQ](https://github.com/casper-hansen/AutoAWQ)提供的转换工具。---###相关问题1.如何解决转换过程中的`unsupported tensortype`错误?2.转换GGUF模型时如何保留特殊token(如聊天模板)? 3.如何验证转换后的GGUF模型与原始Hugging Face模型输出一致?</think>### 解决 Hugging Face 模型转 GGUF 时的张量映射错误 您遇到的 `ValueError: Can not map tensor 'model.layers.0.mlp.down_proj.qweight'` 错误是由于模型量化权重与标准 GGUF 转换器不兼容导致的。以下是完整解决方案: --- ### 问题原因分析 1. **量化权重不兼容**(核心问题): - AWQ/GPTQ 量化模型包含特殊权重(如 `qweight`, `qzeros`)[^1] - 标准转换脚本 `convert_hf_to_gguf.py` 仅支持原始 FP16 权重结构 - QwenLong 的 AWQ 量化层 `mlp.down_proj.qweight` 未被标准映射表识别 2. **脚本版本过时**: - 旧版转换器缺少量化模型支持 - 新版 llama.cpp 已添加 AWQ 专用转换路径 3. **权重映射缺失**: - 自定义模型层未在转换脚本的 `tensor_map` 中注册[^1] --- ### 解决方案 #### 方法 1:使用专用 AWQ 转换器(推荐) ```bash # 确保使用最新版 llama.cpp git clone --depth 1 https://github.com/ggerganov/llama.cpp cd llama.cpp && make -j # 使用专用转换脚本 python convert.py /home/ubuntu/.cache/modelscope/hub/models/iic/QwenLong-L1-32B-AWQ \ --outtype f16 \ --outfile qwenlong-32b.f16.gguf ``` > **关键区别**:`convert.py` 而非 `convert_hf_to_gguf.py` 专门处理量化权重 #### 方法 2:手动添加权重映射(备用方案) 编辑 `llama.cpp/convert_hf_to_gguf.py`,在 `tensor_map` 中添加: ```python # 在 load_weights() 函数中找到 tensor_map 定义位置 tensor_map.update({ gguf.MODEL_TENSOR.FFN_DOWN: ( # 添加 AWQ 量化层映射 lambda name: re.match(r"model\.layers\.\d+\.mlp\.down_proj\.qweight", name), lambda name: name.replace("down_proj.qweight", "ffn_down") ), gguf.MODEL_TENSOR.FFN_GATE: ( lambda name: re.match(r"model\.layers\.\d+\.mlp\.gate_proj\.qweight", name), lambda name: name.replace("gate_proj.qweight", "ffn_gate") ) }) ``` 保存后重新运行转换命令。 #### 方法 3:先转换为原始格式再转 GGUF ```bash # 步骤 1: 移除量化层 (使用 AutoAWQ) python -m awq.quantization.quantize \ --model /path/to/QwenLong-L1-32B-AWQ \ --w_bit 16 \ --q_group_size 128 \ --zero_point \ --output ./dequantized_model # 步骤 2: 转换原始模型 python llama.cpp/convert_hf_to_gguf.py ./dequantized_model \ --outtype f16 \ --outfile qwenlong-32b.f16.gguf ``` --- ### 关键配置说明 1. **权重映射原理**: ```python # 转换器内部匹配逻辑示例 if name.endswith("mlp.down_proj.qweight"): gguf_name = f"blk.{bid}.ffn_down.weight" ``` 参考 OpenAI 权重匹配机制[^1] 2. **张量维度验证**: - 量化权重 `qweight` 应为二维张量 $(d_{in}, d_{out}/8)$ - 普通权重 `weight` 应为 $(d_{in}, d_{out})$ - 维度不匹配会引发 `shape` 错误[^3] 3. **位置编码处理**: - QwenLong 使用 RoPE 位置编码 - 转换时需确保保留 $\cos/\sin$ 矩阵[^3] ```python if "rotary_emb.inv_freq" in name: gguf.add_rotary_embedding(dim, seq_len) ``` --- ### 验证转换结果 ```bash # 检查 GGUF 元数据 gguf-dump qwenlong-32b.f16.gguf | grep -E 'ffn_down|tensor_count' # 预期输出应包含: # tensor_count = 423 # blk.0.ffn_down.weight ``` ### 常见错误处理 | 错误类型 | 解决方案 | |---------|----------| | `Unsupported tensor type` | 在 `tensor_map` 添加映射规则 | | `Dimension mismatch` | 使用 `--pad-vocab` 参数 | | `Missing tokenizer.json` | 复制原模型 tokenizer 文件到目录 | --- ### 相关问题 1. 如何解决 GGUF 转换中的 `unsupported tensor type` 错误? 2. 转换 AWQ 模型时如何保持量化精度? 3. 如何验证转换后 GGUF 模型与原始 Hugging Face 模型输出一致性?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值