Spaces:
Build error
Build error
File size: 1,308 Bytes
e7d3e35 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import builtins
import fcntl
def printflock(*args, **kwargs):
"""
This is a wrapper around the built-in Python `print` which calls `flock` before calling
`print` and unlocks it immediately after. This wrapper is useful for when each rank needs to
print a message without getting it interleaved with prints from other ranks.
The lock file is the file this wrapper is defined in.
The output order will be random per rank.
Example:
>>> # assuming 4 GPUs
>>> world_size = dist.get_world_size()
>>> rank = dist.get_rank()
>>> printflock(f"This is a very long message from rank {rank}/{world_size}")
This is a very long message from rank 0/4
This is a very long message from rank 2/4
This is a very long message from rank 3/4
This is a very long message from rank 1/4
It can also be used to override normal `print` for an easier multi-gpu debug:
from m4.utils.debug import printflock as print
and then you don't need to change anything in your code, the normal `print` calls will all be non-interleaved
"""
with open(__file__, "r") as fh:
fcntl.flock(fh, fcntl.LOCK_EX)
try:
builtins.print(*args, **kwargs)
finally:
fcntl.flock(fh, fcntl.LOCK_UN)
|