在modelscope-funasr使用flask调用设置asr,为什么会导致其它的日志设置无效?

pipeline(
task=Tasks.auto_speech_recognition,
model=current_app.config['VIDEO_MODEL'],
model_revision="v1.2.4",
vad_model=current_app.config['VAD_MODEL'],
vad_model_revision="v1.2.0",
punc_model=current_app.config['PUNC_MODEL'],
punc_model_revision="v1.1.7")
在modelscope-funasr使用flask调用设置了这个asr,会导致别的地方的日志设置无效,怎么回事?

展开
收起
三分钟热度的鱼 2024-01-17 18:34:46 106 分享 版权
阿里云 AI 助理回答

在使用 modelscope-funasr 的自动语音识别(ASR)功能时,通过 Flask 调用设置了以下 pipeline 配置:

pipeline(
    task=Tasks.auto_speech_recognition,
    model=current_app.config['VIDEO_MODEL'],
    model_revision="v1.2.4",
    vad_model=current_app.config['VAD_MODEL'],
    vad_model_revision="v1.2.0",
    punc_model=current_app.config['PUNC_MODEL'],
    punc_model_revision="v1.1.7"
)

如果发现其他地方的日志设置无效,可能是由于以下原因导致的:


1. 日志配置冲突

modelscope-funasr 内部可能对日志系统进行了全局配置,覆盖了您在 Flask 应用中设置的日志配置。这种问题通常发生在以下场景: - modelscope-funasr 使用了 Python 的 logging 模块,并调用了 logging.basicConfig() 或类似方法重新初始化日志系统。 - 日志处理器(Handler)被清空或替换,导致原有日志配置失效。

解决方法: - 在 Flask 应用启动时,确保您的日志配置在 modelscope-funasr 初始化之后执行。例如:

import logging

# Flask 应用日志配置
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

# 初始化 modelscope-funasr pipeline
asr_pipeline = pipeline(
    task=Tasks.auto_speech_recognition,
    model=current_app.config['VIDEO_MODEL'],
    model_revision="v1.2.4",
    vad_model=current_app.config['VAD_MODEL'],
    vad_model_revision="v1.2.0",
    punc_model=current_app.config['PUNC_MODEL'],
    punc_model_revision="v1.1.7"
)

# 重新应用 Flask 的日志配置
logger = logging.getLogger()
for handler in logger.handlers:
    logger.removeHandler(handler)
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
  • 如果 modelscope-funasr 提供了自定义日志配置选项,建议查阅其文档并调整日志级别或禁用其日志初始化逻辑。

2. 多线程/异步环境下的日志问题

Flask 应用通常运行在多线程或异步环境中,而 modelscope-funasr 的日志系统可能未正确处理线程安全或上下文隔离,导致日志输出混乱或配置被覆盖。

解决方法: - 确保每个线程或协程的日志配置独立。可以通过为每个线程设置独立的 logging.Logger 实例来实现:

import threading
import logging

# 创建线程本地存储
thread_local = threading.local()

def get_logger():
    if not hasattr(thread_local, "logger"):
        logger = logging.getLogger(f"thread-{threading.get_ident()}")
        handler = logging.StreamHandler()
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.setLevel(logging.INFO)
        thread_local.logger = logger
    return thread_local.logger

# 在需要记录日志的地方调用
logger = get_logger()
logger.info("This is a thread-safe log message.")

3. 第三方库的日志行为

某些第三方库(如 modelscope-funasr)可能会默认启用调试日志,导致日志输出过多或覆盖您的配置。

解决方法: - 显式设置 modelscope-funasr 的日志级别为 WARNING 或更高,避免其干扰您的日志系统:

logging.getLogger("modelscope").setLevel(logging.WARNING)
  • 如果 modelscope-funasr 提供了日志级别配置参数,建议在初始化时显式指定日志级别。

4. Flask 日志与模型服务日志分离

为了彻底避免日志冲突,可以将 Flask 应用的日志和 modelscope-funasr 的日志输出到不同的文件或流中。

解决方法: - 配置独立的日志处理器:

import logging

# Flask 应用日志
flask_logger = logging.getLogger("flask")
flask_handler = logging.FileHandler("flask.log")
flask_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
flask_logger.addHandler(flask_handler)
flask_logger.setLevel(logging.INFO)

# modelscope-funasr 日志
funasr_logger = logging.getLogger("modelscope")
funasr_handler = logging.FileHandler("funasr.log")
funasr_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
funasr_logger.addHandler(funasr_handler)
funasr_logger.setLevel(logging.WARNING)

总结

上述问题的根本原因在于 modelscope-funasr 的日志系统可能覆盖了 Flask 应用的日志配置。通过以下措施可以有效解决: 1. 调整日志初始化顺序,确保 Flask 的日志配置优先。 2. 隔离日志配置,避免多线程或异步环境中的冲突。 3. 限制第三方库的日志输出,避免其干扰主应用。 4. 分离日志输出目标,将不同模块的日志写入独立文件。

如果问题仍未解决,建议检查 modelscope-funasr 的具体日志实现细节,或联系其技术支持团队获取进一步帮助。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!欢迎加入技术交流群:微信公众号:魔搭ModelScope社区,钉钉群号:44837352

还有其他疑问?
咨询AI助理