[BUG]评估器在使用promptflow-eval 0.3.1版本时持续失败,但在0.3.0版本中可以正常工作,

iq0todco  于 2个月前  发布在  其他
关注(0)|答案(3)|浏览(37)

描述bug

在将promptflow-eval从0.3.0切换到0.3.1后,对于相同的代码,它仍然给我错误:

2024-07-15 06:52:21 +0000     377 execution.bulk     ERROR    Error occurred while executing batch run. Exception: The input for batch run is incorrect. Input from key 'data' is an empty list, which means we cannot generate a single line input for the flow run. Please rectify the input and try again.

======= Run Summary =======

Run name: "promptflow_evals_evaluators_content_safety_content_safety_contentsafetyevaluator_k3ldgeeq_20240715_065220_068989"
Run status: "Failed"
Start time: "2024-07-15 06:52:20.066987+00:00"
Duration: "0:00:01.488330"
Output path: "/root/.promptflow/.runs/promptflow_evals_evaluators_content_safety_content_safety_contentsafetyevaluator_k3ldgeeq_20240715_065220_068989"

Traceback (most recent call last):
...
    _ = evaluate(
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/evals/evaluate/_telemetry/__init__.py", line 111, in wrapper
    result = func(*args, **kwargs)
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/evals/evaluate/_evaluate.py", line 365, in evaluate
    raise e
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/evals/evaluate/_evaluate.py", line 340, in evaluate
    return _evaluate(
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/evals/evaluate/_evaluate.py", line 447, in _evaluate
    evaluator_info["result"] = batch_run_client.get_details(evaluator_info["run"], all_results=True)
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/evals/evaluate/_batch_run_client/proxy_client.py", line 33, in get_details
    run = proxy_run.run.result(timeout=BATCH_RUN_TIMEOUT)
  File "/usr/local/miniconda/lib/python3.9/concurrent/futures/_base.py", line 446, in result
    return self.__get_result()
  File "/usr/local/miniconda/lib/python3.9/concurrent/futures/_base.py", line 391, in __get_result
    raise self._exception
  File "/usr/local/miniconda/lib/python3.9/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/_sdk/_pf_client.py", line 301, in run
    return self._run(
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/_sdk/_pf_client.py", line 226, in _run
    return self.runs.create_or_update(run=run, **kwargs)
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/_sdk/_telemetry/activity.py", line 265, in wrapper
    return f(self, *args, **kwargs)
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/_sdk/operations/_run_operations.py", line 137, in create_or_update
    self.stream(created_run)
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/_sdk/_telemetry/activity.py", line 265, in wrapper
    return f(self, *args, **kwargs)
  File "/usr/local/miniconda/lib/python3.9/site-packages/promptflow/_sdk/operations/_run_operations.py", line 228, in stream
    raise InvalidRunStatusError(error_message)
promptflow._sdk._errors.InvalidRunStatusError: First error message is: The input for batch run is incorrect. Input from key 'data' is an empty list, which means we cannot generate a single line input for the flow run. Please rectify the input and try again.

我注意到0.3.0和0.3.1之间与性能/并行化相关的一些更改。例如: 32115d3

  1. 对于evaluate API,我看到它从
use_thread_pool = kwargs.get("_use_thread_pool", True)
    batch_run_client = CodeClient() if use_thread_pool else pf_client

更改为

use_pf_client = kwargs.get("_use_pf_client", True)
    batch_run_client = ProxyClient(pf_client) if use_pf_client else CodeClient()

因此,相应的,batch_run_client从CodeClient更改为ProxyClient,使用默认输入(既不传递_use_thread_pool也不传递_use_pf_client)
这是否与失败有关?推荐使用哪种客户端进行并行化?

如何重现bug

重现行为所需的步骤,您多久会遇到一次bug:
1.

预期行为

对您期望发生的事情进行清晰简洁的描述。

截图

如果适用,请添加屏幕截图以帮助解释您的问题。

运行信息(请完成以下信息):

  • 使用 pf -v 的Promptflow包版本:[例如0.0.102309906]
  • 操作系统:[例如Ubuntu 20.04,Windows 11]
  • 使用 python --version 的Python版本:[例如python==3.10.12]

{
"promptflow": "1.13.0",
"promptflow-azure": "1.13.0",
"promptflow-core": "1.13.0",
"promptflow-devkit": "1.13.0",
"promptflow-evals": "0.3.1"或与比较的0.3.0,
"promptflow-tracing": "1.13.0"
}

其他上下文

在此问题中添加有关问题的任何其他上下文。

iibxawm4

iibxawm41#

一个观察是,当我在构造函数中创建目标用户调用(与评估器具有相同的类,提供initcall方法)时,如果我明确将加载的数据(约100行jsonl数据)作为参数传递:TargetCallClass(config, input_data),那么它会得到这个错误。如果我将这些加载的数据传递给config.input_data:TargetCallClass(config),似乎更好,更好的意思是在一台机器上可以成功,但在另一台机器上仍然失败。不确定这是否相关,但只是给出这个观察。你对此有什么想法吗?另外,如果我将_use_pf_client设置为false(与0.3.1评估器一起使用),它运行正常(就像0.3.0一样,因为它们都使用CodeClient而不是ProxyClient)。

oxcyiej7

oxcyiej72#

你好,@ninghu ,我认为我已经找到了根本原因。
问题在于,当调用evaluate api时,数据路径应该是绝对路径,而不是相对于工作目录的相对路径。

_ = evaluate(
        evaluation_name=evaluation_name,
        data=data_path,
        target=custom_user_call,
        evaluators=evaluators_set,
        evaluator_config=evaluators_config,

        )

当使用CodeClient时,从data_path读取的 Dataframe 被使用。当使用ProxyClient时,数据(数据路径)用于pfclient运行。然而,这仍然让我感到困惑,因为对于目标调用,它也是一个pf客户端运行,数据是相对路径,它仍然可以正常工作。但是在使用ProxyClient时会有所不同。
另一个观察是,如果我们使用一个评估器(无论是内置的还是自定义的),即使使用ProxyClient + 相对路径,它仍然可以正常工作。
但是当使用两个评估器时,ProxyClient + 相对路径无法正常工作。我们必须使用绝对路径。

o2gm4chl

o2gm4chl3#

这些发现非常棒!你描述的行为很有趣,似乎只在使用多个评估器时发生。我们会尝试重现这个问题并回复你。

相关问题