イベントロギングで分散トレーニングジョブを可視化:PyTorch Distributed Elasticの`torch.distributed.elastic.events.get_logging_handler()`
イベントロギングの重要性
分散トレーニングジョブは複雑で、多くの並行処理タスクが絡み合います。こうしたジョブをデバッグするには、ジョブの実行中に発生するイベントに関する詳細な情報が必要です。イベントロギングは、ジョブのパフォーマンス、エラー、および全体的な健全性を監視するために不可欠な情報を提供します。
torch.distributed.elastic.events.get_logging_handler() の機能
torch.distributed.elastic.events.get_logging_handler()
関数は、以下の機能を提供します。
- イベント情報の記録
ハンドラを使用して、ジョブ中に発生するイベントに関する情報を記録できます。記録される情報には、イベントタイプ、タイムスタンプ、イベントデータなどが含まれます。 - ロガーの設定
ハンドラオブジェクトには、ログメッセージのフォーマット、出力先、ログレベルを設定するためのメソッドが用意されています。 - イベントロギングハンドラの取得
この関数は、イベントロギング用のハンドラオブジェクトを返します。このハンドラを使用して、イベント情報を記録するロガーを設定できます。
torch.distributed.elastic.events.get_logging_handler()
関数を呼び出して、イベントロギングハンドラを取得します。- ハンドラを使用して、ログメッセージのフォーマット、出力先、ログレベルを設定します。
- ハンドラを使用して、ジョブ中に発生するイベントに関する情報を記録します。
import torch.distributed.elastic.events as events
# イベントロギングハンドラを取得
handler = events.get_logging_handler()
# ログメッセージのフォーマットを設定
handler.set_format("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
# ログ出力先を標準出力に設定
handler.set_stream(sys.stdout)
# ログレベルを INFO に設定
handler.setLevel(logging.INFO)
# ジョブ中に発生するイベントを記録
events.record(events.EventType.WORKER_EXIT, worker_id=0, exit_code=0)
この例では、get_logging_handler()
関数を使用してイベントロギングハンドラを取得し、ログメッセージのフォーマット、出力先、ログレベルを設定しています。その後、record()
関数を使用して、ワーカープロセスが終了したことを示すイベントを記録しています。
基本的な例
import torch.distributed.elastic.events as events
import logging
# イベントロギングハンドラを取得
handler = events.get_logging_handler()
# ログメッセージのフォーマットを設定
handler.set_format("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
# ログ出力先を標準出力に設定
handler.set_stream(sys.stdout)
# ログレベルを INFO に設定
handler.setLevel(logging.INFO)
# ジョブ中に発生するイベントを記録
events.record(events.EventType.WORKER_EXIT, worker_id=0, exit_code=0)
この例では、以下の処理が行われます。
get_logging_handler()
関数を使用してイベントロギングハンドラを取得します。- ハンドラを使用して、ログメッセージのフォーマット、出力先、ログレベルを設定します。
record()
関数を使用して、ワーカープロセスが終了したことを示すイベントを記録します。
ログメッセージのカスタマイズ
ログメッセージの内容をより詳細に制御するには、record()
関数の data
パラメータを使用して追加情報を提供できます。
import torch.distributed.elastic.events as events
import logging
# イベントロギングハンドラを取得
handler = events.get_logging_handler()
# ログメッセージのフォーマットを設定
handler.set_format("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
# ログ出力先を標準出力に設定
handler.set_stream(sys.stdout)
# ログレベルを INFO に設定
handler.setLevel(logging.INFO)
# ジョブ中に発生するイベントを記録
events.record(
events.EventType.WORKER_EXIT,
worker_id=0,
exit_code=0,
data={"epoch": 10, "loss": 0.01},
)
この例では、record()
関数の data
パラメータを使用して、イベントに関する追加情報を提供しています。この情報には、現在のエポックと損失値が含まれています。
カスタムロガーの使用
独自のロガーを使用したい場合は、handler.set_logger()
メソッドを使用して設定できます。
import torch.distributed.elastic.events as events
import logging
# カスタムロガーを作成
logger = logging.getLogger(__name__)
# イベントロギングハンドラを取得
handler = events.get_logging_handler()
# カスタムロガーを設定
handler.set_logger(logger)
# ログメッセージのフォーマットを設定
logger.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setFormatter(formatter)
# ジョブ中に発生するイベントを記録
events.record(events.EventType.WORKER_EXIT, worker_id=0, exit_code=0)
この例では、独自のロガーを作成し、set_logger()
メソッドを使用してイベントロギングハンドラに設定しています。その後、ロガーのログレベル、フォーマット、および出力先を設定しています。
import logging
# カスタムロガーを作成
logger = logging.getLogger(__name__)
# ログメッセージのフォーマットを設定
logger.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setFormatter(formatter)
# ジョブ中に発生するイベントを記録
logger.info("Worker exit: worker_id=%d, exit_code=%d", 0, 0)
この例では、独自のロガーを作成し、ログメッセージのフォーマットと出力先を設定しています。その後、logger.info()
メソッドを使用して、ワーカープロセスが終了したことを示すイベントを記録しています。
イベントパブリッシャーの使用
torch.distributed.elastic.events.get_logging_handler()
関数は、イベントをロガーに記録するだけでなく、イベントパブリッシャーにパブリッシュすることもできます。イベントパブリッシャーを使用すると、イベントを他のコンポーネントで処理したり、外部システムに送信したりすることができます。
import torch.distributed.elastic.events as events
import torch.distributed.elastic.utils.publisher as publisher
# イベントパブリッシャーを作成
event_publisher = publisher.get_default_event_publisher()
# ジョブ中に発生するイベントをパブリッシュ
events.record(
events.EventType.WORKER_EXIT,
worker_id=0,
exit_code=0,
data={"epoch": 10, "loss": 0.01},
)
# イベントパブリッシャーからイベントを購読
event_publisher.subscribe(events.EventType.WORKER_EXIT, on_event=on_worker_exit)
この例では、イベントパブリッシャーを作成し、record()
関数を使用してワーカープロセスが終了したことを示すイベントをパブリッシュしています。その後、subscribe()
メソッドを使用して、イベントパブリッシャーからイベントを購読し、on_worker_exit()
関数でイベントを処理しています。
サードパーティのライブラリの使用
PyTorch Distributed Elastic 以外にも、イベントロギング機能を提供するサードパーティのライブラリがいくつかあります。これらのライブラリを使用すると、独自のロギング要件に合わせたより高度な機能を利用できる場合があります。
torch.distributed.elastic.events.get_logging_handler()
関数は、イベントロギングを始めるための簡単な方法を提供します。しかし、より高度なロギング要件がある場合は、カスタムロガー、イベントパブリッシャー、またはサードパーティのライブラリの使用を検討する必要があります。