promptflow [BUG] 可能与mlflow>=2.13.1不兼容

7eumitmz  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(57)

描述bug

在mlflow>=2.13.1中,mlflow支持在某些操作中强制重置全局跟踪器提供程序(相关PR:mlflow/mlflow#12137),这可能会破坏/禁用prompt flow中的跟踪功能。

如何复现bug

在prompt flow设置mlflow后执行将导致此问题。以下代码片段可以演示这一点:

from mlflow.tracing.provider import reset_tracer_setup
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter, SpanExportResult
from promptflow.tracing import trace as pf_trace

class StdoutSpanExporter(SpanExporter):
    def export(self, spans):
        for span in spans:
            print("trace id:", span.context.trace_id)
            print("span id:", span.context.span_id)
        return SpanExportResult.SUCCESS

    def shutdown(self):
        pass

@pf_trace
def do_something():
    print("Doing something")

def setup_exporter():
    trace.set_tracer_provider(TracerProvider())
    tracer_provider: TracerProvider = trace.get_tracer_provider()
    stdout_span_exporter = StdoutSpanExporter()
    tracer_provider.add_span_processor(BatchSpanProcessor(stdout_span_exporter))

def main():
    setup_exporter()
    reset_tracer_setup()  # this line will force reset tracer provider to NoOpTracerProvider
    do_something()

if __name__ == "__main__":
    main()

reset_tracer_setup执行时,所有已注册的导出器都将被重置,因此在关闭跟踪时没有stdout。我们不确定mlflow何时调用此函数,但似乎它会通过重置导出器来破坏/禁用prompt flow中的跟踪功能。

预期行为

mlflow中的操作不应修改全局跟踪器提供程序,这应该破坏OpenTelemetry标准。看起来prompt flow对此无能为力,这个问题暂时作为参考。

附加上下文

旧版本可能会遇到AttributeError抱怨“NoOpTracerProvider没有add_span_processor”,有一个PR正在处理这个问题,以跳过设置并记录警告:#3407

px9o7tmv

px9o7tmv1#

在mlflow仓库中打开了一个问题:mlflow/mlflow#12341

n3ipq98p

n3ipq98p2#

mlflow已在mlflow/mlflow#12457中修复了这个问题,在mlflow/mlflow#12457中,mlflow只会运行其OTel组件,而不是全局的。问题应该得到缓解;在发布补丁并验证后将关闭此问题。

相关问题