我如何在 Ray 中使用 python 日志记录?

Han*_*eng 7 python logging ray

我在主函数/进程中使用了日志模块,它运行良好,但在 Actor 进程/子进程中似乎无法运行。如何使它工作?在下面的代码示例中,logging.info 在主进程中工作,但在工作进程中失败。谢谢。

import logging
import ray

@ray.remote
class Worker(object):
   ...

   def train(self):
       logging.info("fail print")


...

worker = Worker.remote()

ray.get(worker.train.remote())

logging.info("successful print")

Run Code Online (Sandbox Code Playgroud)

Rob*_*ara 9

有几件事需要小心。

  • 首先,您应该在工作器内部创建一个新的记录器,因为工作器运行在不同的 Python 进程上。如果您尝试使用在 worker 内部创建的 logger 之外的 logger,那么 Ray 将尝试 pickle logger 并将其发送到 worker 进程,并且 Python loggers 在 pickled 和 unpickled 时通常不会正确运行。
  • 其次,您必须确保正确设置日志记录级别。我使用logger.warning而不是logger.info因为 Python 日志记录级别默认设置为“警告”。

这是一个工作示例:

import logging
import ray

logger = logging.getLogger(__name__)

@ray.remote
class Worker(object):
    def __init__(self):
        self.logger = logging.getLogger(__name__)
    def train(self):
        self.logger.warning("print from inside worker")


ray.init()

worker = Worker.remote()

ray.get(worker.train.remote())

logger.warning("print from outside worker")
Run Code Online (Sandbox Code Playgroud)

  • 我正在射线远程函数内创建记录器,并要求它写入相同的日志文件,但它记录的主要信息不是来自远程函数。任何指示都会有所帮助。logger =logging.getLogger(log_name) logger.addHandler(logging.FileHandler(lfn, mode="a+")) (2认同)