How to fix Metric Collection Errors in OEM 11g running on OEL-5/RHEL-5

本文详细介绍了如何解决Oracle Enterprise Manager 11g在OEL-5或RHEL-5上运行时遇到的Metric Collection错误问题,包括修改POSIX相关命令、更新代码中单位名称和重启OEM等步骤。
How to fix Metric Collection Errors in OEM 11g running on OEL-5/RHEL-5
2010-01-22 02:08
This report applies to the Oracle Enterprise Manager 11g Database Control installed as a part of the 11g database installation on OEL-5 or RHEL-5. The 11g "Release Notes for Linux" document states:

"If Oracle Enterprise Manager Database Control is running on Oracle Enterprise Linux 5 or Red Hat Enterprise Linux 5, Metric Collection Error is displayed for the CPU Usage metric. Due to this issue, the CPU usage information for the host is not displayed. Therefore, you cannot set alert threshold on the host CPU usage. This issue is tracked with Oracle bug 6316367."

Really, when we click the Host link in General section of OEM to go to the Host Home page, we can see:

1. Metric Collection Errors for the CPU Usage metric:
"tail: cannot open `+2' for reading: No such file or directory grep: write error: Broken pipe Failed to

run grep at /opt/oracle/product/11.1.0/db_1/sysman/admin/scripts/osCpuUsage.pl line 51."
and, going to the Configuration Page, we can see

2. Hardware Collection Warnings:
"/usr/bin/tail: cannot open `+2' for reading: No such file or directory /bin/df -lk -x tmpfs -x none |

/usr/bin/tail +2 | /bin/sort -u failed. FREQUENCY_IN_MHZ <PERR- is not numeric. FREQUENCY_IN_MHZ <PERR- is

not numeric. FREQUENCY_IN_MHZ <PERR- is not numeric. FREQUENCY_IN_MHZ <PERR- is not numeric. FREQUENCY_IN_MHZ

<PERR- is not numeric. FREQUENCY_IN_MHZ <PERR- is not numeric. FREQUENCY_IN_MHZ <PERR- is not numeric.

FREQUENCY_IN_MHZ <PERR- is not numeric. FREQUENCY_IN_MHZ <PERR- is not numeric. FREQUENCY_IN_MHZ <PERR- is

not numeric. FREQUENCY_IN_MHZ <PERR- is not numeric. FREQUENCY_IN_MHZ <PERR- is not numeric. FREQUENCY_IN_MHZ

<PERR- is not numeric.
and many of Hardware Details are not displayed.

Fortunatelly, both problems can be easily fixed.

1. There is a posix issue in OEL-5 and RHEL-5 regarding `tail' command. For example, insted of "tail +2", "tail +3" etc, that don't work anymore, we must write "tail -n +2", "tail -n +3" etc. Go to ${ORACLE_HOME}/sysman/admin/scripts directory and find out any files containing "tail +" command, eg:

# grep "tail +" * | less
My result is 8 files. So, change all occurrences of "tail +" to "tail -n +" in the following files:

allprocs.sh

emdprocstats.pl

executestack.pl

ifconfig.sh

osCpuUsage.pl

pmapinfo.ksh

swapList.sh

topprocs.sh
Also, change all occurrences of "TAIL +" to "TAIL -n +" in the following files:

Ptdpm0.pm

hostGenFunctions.pm

2. In file

Ptdpm1.pm
in line 428:

@iodat1    = split ("Mhz", $iobuf$n + 2);
change "Mhz" to "MHz". Namely, in OEL-5/RHEL-5 the output of "/sbin/lspci -vv" command is in "MHz", not in "Mhz", so that the agent cannot grab "Mhz" anymore.

3. Restart OEM

N.J.
 
 
<think>我们遇到了一个错误:在尝试加载评估指标"accuracy"时,程序无法在本地路径`/data/coding/transformers_from_scratch-main/accuracy/accuracy.py`找到模块,并且在Hugging FaceHub上也没有找到名为'accuracy'的模块。实际上,在Hugging Face的`evaluate`库中,我们通常使用预定义的指标名称,如"accuracy"应该是一个内置的指标。但是这里报错说找不到,可能是因为:1.环境问题:`evaluate`库没有正确安装或版本问题。2.路径问题:程序试图从当前工作目录下的`accuracy`子目录中加载模块,但该目录不存在。根据错误信息,程序首先在本地路径`/data/coding/transformers_from_scratch-main/accuracy/accuracy.py`中寻找,然后去Hugging FaceHub上寻找,都没有找到。正确的做法是使用`evaluate`库内置的指标。通常,我们使用`evaluate.load('accuracy')`来加载准确率指标,但这里报错,可能是因为`evaluate`库的版本或安装问题。解决方案:1.确保`evaluate`库已经正确安装,并且版本较新。2.尝试使用绝对路径加载指标(如果知道指标在库中的路径)通常不是这样做的。3.或者,我们可以使用`datasets`库中的`load_metric`函数(如果之前是这样用的,但注意`evaluate`是`datasets`中指标模块的独立库)。实际上,Hugging Face将评估指标从`datasets`库中分离出来,放到了`evaluate`库。所以,如果之前使用`datasets.load_metric`,现在应该使用`evaluate.load`。但是,这里报错找不到模块,可能是因为`evaluate`库没有正确安装或配置。我们可以尝试以下步骤:步骤1:检查`evaluate`库是否安装,以及版本。步骤2:如果安装,尝试重新安装最新版。步骤3:如果问题依旧,我们可以尝试使用`datasets`库中的`load_metric`(如果同时安装了`datasets`,并且版本兼容)。但是,错误信息中显示的是`evaluate.load`,所以我们需要确保`evaluate`库可以正确加载指标。另外,注意指标名称的大小写?在HuggingFace中,通常指标名称是区分大小写的吗?实际上,内置指标如'accuracy'应该是不区分大小写的,但这里我们使用的是小写。还有一种可能是网络问题,因为如果本地没有缓存,它会去Hub下载。但错误信息说在Hub上也没有,这不太可能,因为'accuracy'是内置的。经过查阅文档,`evaluate`库的内置指标包括'accuracy',所以应该可以直接加载。因此,我怀疑是环境问题。但如果我们不能重新安装,我们可以尝试另一种方法:使用`evaluate`库的备用加载方式,即指定完整的模块路径。实际上,`evaluate`库的指标存储在`evaluate/metrics`下,我们可以尝试直接导入:from evaluateimportloadmetric= load('accuracy')但是,错误信息显示它首先在本地路径`/data/coding/transformers_from_scratch-main/accuracy`下寻找,这是因为`evaluate`库在加载指标时,会首先检查当前工作目录下是否有同名的指标模块。这可能是由于当前工作目录下有一个名为`accuracy`的目录,或者是因为`evaluate`库的搜索路径设置?我们可以尝试改变工作目录,或者明确指定加载内置指标。根据`evaluate`库的文档,我们可以通过指定`path`参数为`evaluate`库内置的指标路径来加载,例如:metric =evaluate.load(path="accuracy",module_type="metric")但是,在`evaluate.load`函数中,默认的`module_type`就是`'metric'`,所以这样写和之前一样。另一种方法是,我们可以使用绝对模块名:`evaluate.load('evaluate/metrics/accuracy')`,但这样可能不符合API。实际上,我们可以尝试使用:metric= evaluate.load('evaluate/metrics/accuracy')但根据文档,直接使用`'accuracy'`即可。经过思考,问题可能出在当前目录下有一个名为`accuracy`的目录(或文件),导致`evaluate`库误以为我们要加载本地模块。我们可以尝试改变当前工作目录,或者将本地目录重命名。但是,错误信息中给出的路径是`/data/coding/transformers_from_scratch-main/accuracy/accuracy.py`,说明当前工作目录是`/data/coding/transformers_from_scratch-main`,并且该目录下有一个`accuracy`文件夹(但没有`accuracy.py`文件),所以导致加载失败。因此,解决方案之一:删除或重命名当前工作目录下的`accuracy`文件夹(如果不需要的话),以避免与内置指标名称冲突。解决方案之二:在加载指标时,明确指定这是来自Hub的,而不是本地的。我们可以通过添加`trust_remote_code=True`参数?但`evaluate.load`中并没有这个参数。或者,我们可以使用绝对指标名称:`"evaluate-metric/accuracy"`,但通常不需要。解决方案之三:临时改变工作目录,加载指标后再改回来。但是,改变工作目录可能会影响其他文件操作。我建议先检查当前目录下是否有`accuracy`文件夹,如果有,重命名它(比如改为`local_accuracy`)然后尝试运行。如果不想改变目录结构,我们可以尝试修改代码:根据`evaluate`库的源码,它首先尝试从本地路径加载,然后尝试从Hub加载。我们可以通过设置环境变量`HF_EVALUATE_OFFLINE=1`来强制使用本地缓存(如果之前下载过),但这里本地没有缓存,所以可能没用。或者,我们可以使用`evaluate`库的另一种加载方式:通过`module_name`参数指定为内置的,但文档中并没有这个参数。实际上,我们可以尝试直接使用`datasets`库中的`load_metric`函数(如果安装了`datasets`):from datasetsimport load_metricmetric =load_metric('accuracy')注意:`datasets`库中的`load_metric`函数现在已经被标记为弃用,推荐使用`evaluate`库。但是,如果`evaluate`库无法正常工作,可以暂时使用`datasets`中的方法。总结,我们可以尝试以下方法:方法1:确保当前工作目录下没有名为`accuracy`的文件夹(或文件),然后使用`evaluate.load('accuracy')`。方法2:使用`datasets`库的`load_metric`(如果允许):fromdatasets importload_metricmetric= load_metric('accuracy')方法3:重新安装`evaluate`库,并检查网络连接,确保可以下载指标。方法4:使用完整的模块路径(但需要查看`evaluate`库的源码结构):metric= evaluate.load(path='evaluate/metrics/accuracy')但根据`evaluate`库的文档,内置指标可以通过名称直接加载,所以方法4可能无效。我建议先尝试方法1,如果不行再尝试方法2。如果使用`datasets`库,需要安装`datasets`,并且注意版本。根据错误信息,我们是在运行`pretrain.py`的第28行,即`metric= evaluate.load("accuracy")`。修改代码为使用`datasets`库(如果可行):fromdatasets importload_metricmetric= load_metric('accuracy')但是,注意`load_metric`返回的对象和`evaluate.load`返回的可能有差异,但通常使用方式类似。如果使用`evaluate`库,我们可以尝试指定完整的Hub路径:`metric =evaluate.load('evaluate-metric/accuracy')`,因为HuggingFace Hub上的指标通常存储在`evaluate-metric`组织下。实际上,在Hub上,准确率指标的地址是:https://huggingface.co/evaluate-metric/accuracy所以,我们可以尝试:metric =evaluate.load('evaluate-metric/accuracy')这样应该可以明确指定从Hub加载,而不会去本地目录查找。因此,我推荐使用这种方法。所以,修改代码为:metric =evaluate.load('evaluate-metric/accuracy')这样,程序就不会去本地目录`accuracy`下查找,而是直接去Hub下载(如果本地没有缓存)或使用缓存。总结解决方案:方案一(推荐):将代码`metric =evaluate.load("accuracy")`改为:metric= evaluate.load('evaluate-metric/accuracy')方案二:使用`datasets`库(如果已安装):from datasetsimport load_metricmetric =load_metric('accuracy')方案三:移除当前工作目录下的`accuracy`文件夹(如果存在且不需要的话),然后继续使用`evaluate.load("accuracy")`。我们选择方案一,因为这样不需要改变目录结构,也不需要使用另一个库。代码修改如下:原代码:metric= evaluate.load("accuracy")修改为:metric= evaluate.load('evaluate-metric/accuracy')这样修改后,应该可以正确加载。如果问题仍然存在,请检查网络连接,确保可以访问Hugging FaceHub。现在,我们修改代码并重新运行。但是,如果不想修改代码,也可以设置环境变量`HF_DATASETS_OFFLINE=1`来强制使用离线模式?但这里我们不是离线,而是需要下载,所以不行。因此,我们采用方案一修改代码。注意:如果使用方案一,需要确保网络连接正常,因为首次加载需要下载。如果环境完全离线,则需要提前下载并缓存指标。但在有网络的情况下,方案一是可行的。修改后的代码行:metric =evaluate.load('evaluate-metric/accuracy')这样修改后,应该可以避免本地目录的干扰,直接从Hub加载。如果成功,问题解决。如果仍然遇到问题,请提供更多环境信息。由于我们无法直接运行,所以请根据实际情况选择。但是,根据错误信息,问题在于本地路径存在一个`accuracy`目录,而`evaluate`库误以为要加载本地模块。使用完整的Hub路径可以避免这个问题。因此,我们修改代码。另外,注意:如果使用`evaluate`库的0.4.0及以上版本,可以直接使用`evaluate.load("accuracy")`,但如果有本地目录冲突,使用完整Hub路径是更好的选择。所以,请修改代码,然后重新运行。如果修改后仍然报错,请检查`evaluate`库的版本,并尝试升级。升级命令:pip install-Uevaluate同时,确保`evaluate`库的版本至少为0.4.0(因为`evaluate`库是在这个版本之后才独立出来的)。最后,如果所有方法都失败,可以考虑自己实现准确率计算,因为准确率计算相对简单。自己实现准确率计算的方法:我们可以不使用`evaluate`库,而是手动计算。例如:accuracy= (preds== labels).float().mean()但是,原代码中可能使用了`metric`对象来累积批次,然后计算整个数据集上的准确率。所以我们需要模拟这个过程。我们可以自己写一个简单的类:classAccuracy:def__init__(self):self.correct =0self.total =0def update(self,preds, labels):#假设preds和labels都是torch.Tensor,且preds是logits或预测的类别索引#如果preds是logits(未归一化的分数),则需要取argmaxifpreds.ndim >1:preds= preds.argmax(dim=-1)preds= preds.cpu().numpy()labels =labels.cpu().numpy()self.correct +=(preds ==labels).sum()self.total +=labels.shape[0]defcompute(self):return self.correct/ self.total然后在训练循环中使用这个类。但是,原代码可能是这样使用`metric`的:metric =evaluate.load("accuracy")forbatch indataloader:#...模型前向logits =model(inputs)preds =logits.argmax(dim=-1)metric.add_batch(predictions=preds,references=labels)accuracy= metric.compute()我们可以替换成自己写的Accuracy类:metric= Accuracy()forbatch indataloader:# ...模型前向logits= model(inputs)preds =logits.argmax(dim=-1)metric.update(preds, labels)accuracy= metric.compute()这样就不需要`evaluate`库了。如果以上方法都不行,自己实现准确率计算也是一个可行的备选方案。综上所述,我们提供了多种解决方案,请根据实际情况选择。现在,我们假设采用方案一(修改为加载'evaluate-metric/accuracy')来解决。修改后的代码行:metric= evaluate.load('evaluate-metric/accuracy')重新运行程序。如果问题解决,则结束;如果仍然报错,请尝试其他方案。</think>### 解决 Hugging Face `evaluate` 加载 `accuracy` 指标失败的问题 #### 错误原因分析 这个错误表明 `evaluate.load("accuracy")` 尝试从以下两个位置加载指标失败: 1. **本地路径**:`/data/coding/transformers_from_scratch-main/accuracy/accuracy.py`(文件不存在) 2. **Hugging Face Hub**:名为 `accuracy` 的公共模块(不存在) 根本原因是: - `evaluate` 库在加载指标时会优先检查**当前工作目录** - 你的项目目录中存在名为 `accuracy` 的文件夹(但缺少 `accuracy.py` 文件) - Hugging Face Hub 上不存在名为 `accuracy` 的独立模块(标准指标在 `evaluate-metric` 组织下) --- ### 解决方案(任选其一) #### 方案 1:使用标准指标路径(推荐) 修改代码,使用 Hugging Face 官方的指标路径 `evaluate-metric/accuracy`: ```python # 修改前(错误) # metric = evaluate.load("accuracy") # 修改后(正确) metric = evaluate.load("evaluate-metric/accuracy") ``` **解释**: - Hugging Face 的标准指标存储在 `evaluate-metric` 组织下 - 使用完整路径 `evaluate-metric/accuracy` 明确指定官方指标 - 首次运行时会自动从 Hub 下载并缓存 --- #### 方案 2:移除本地干扰文件夹 如果项目中的 `accuracy` 文件夹是误创建的,直接删除它: ```bash # 进入项目目录 cd /data/coding/transformers_from_scratch-main # 删除干扰文件夹 rm -rf accuracy ``` 之后保持原始代码不变: ```python metric = evaluate.load("accuracy") # 现在可以正常加载 ``` --- #### 方案 3:使用绝对导入(高级) 显式导入 `evaluate` 内置的 accuracy 模块: ```python from evaluate.metrics import accuracy # 直接使用模块 metric = accuracy.compute(predictions=preds, references=labels) ``` --- #### 方案 4:自定义实现(无需依赖) 如果网络环境受限,可直接实现 accuracy 计算: ```python class SimpleAccuracy: def __init__(self): self.correct = 0 self.total = 0 def add_batch(self, predictions, references): self.correct += (predictions == references).sum().item() self.total += len(references) def compute(self): return {"accuracy": self.correct / self.total} # 使用自定义指标 metric = SimpleAccuracy() ``` --- ### 如何验证解决 在代码中打印指标信息验证是否加载成功: ```python metric = evaluate.load("evaluate-metric/accuracy") print(metric) # 应显示 <evaluate.Metric object at ...> print(metric.inputs_description) # 应显示指标说明 ``` --- ### 根本原因总结 | 问题类型 | 原因 | 修复方式 | |---------|------|---------| | **本地路径冲突** | 项目中的 `accuracy` 文件夹干扰加载 | 删除本地文件夹或使用方案1 | | **指标路径误解** | `accuracy` 不是 Hub 上的独立模块 | 使用 `evaluate-metric/accuracy` 完整路径 | | **网络/缓存问题** | 首次使用未自动下载 | 确保网络畅通或手动缓存 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值