Skip to content

Commit 84e99ad

Browse files
authored
fix p2p update error when disable_h2d_buffer is true (#76)
* fix p2p update error when disable_h2d_buffer is true * fix format error
1 parent 09c543a commit 84e99ad

1 file changed

Lines changed: 18 additions & 8 deletions

File tree

checkpoint_engine/ps.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,7 @@ def _update_per_bucket(
731731
assert len(self._current_global_parameter_metas) != 0, "parameter metas is empty"
732732
assert dist.is_initialized(), "process group is not initialized"
733733

734+
p2p_update = False
734735
# if both ranks is None or [], it will use fully broadcast to update to all ranks
735736
if not ranks:
736737
logger.info(f"[rank{self._rank}] update checkpoint {checkpoint_name}")
@@ -739,6 +740,7 @@ def _update_per_bucket(
739740
assert self._p2p_store is not None, "p2p store is not initialized"
740741
assert ranks, "ranks should be set"
741742

743+
p2p_update = True
742744
need_update = self._rank in ranks
743745
logger.info(
744746
f"[rank{self._rank}] update checkpoint {checkpoint_name} p2p, {need_update=} with {ranks=}, "
@@ -764,11 +766,6 @@ def _update_per_bucket(
764766
if disable_h2d_buffer
765767
else torch.empty(bucket_size, dtype=torch.uint8, device=self.device_manager.device_type)
766768
)
767-
# p2p store need to register h2d_buffer to let other ranks read
768-
if ranks:
769-
h2d_buffer_name = "__h2d_buffer__"
770-
if h2d_buffer is not None and self._p2p_store is not None:
771-
self._p2p_store.register_named_tensors({h2d_buffer_name: h2d_buffer})
772769
receiver_rank_buckets: list[tuple[int, H2DBucket]] = []
773770
for receiver_rank, owner_rank, bucket in buckets:
774771
if receiver_rank != self._rank:
@@ -778,6 +775,12 @@ def _update_per_bucket(
778775
buffer = torch.empty(
779776
bucket_size * 2, dtype=torch.uint8, device=self.device_manager.device_type
780777
)
778+
if p2p_update:
779+
# p2p store need to register buffer to let other ranks read
780+
p2p_ipc_buffer_name = "__ipc_buffer__"
781+
self._p2p_store.register_named_tensors(
782+
{p2p_ipc_buffer_name: buffer if disable_h2d_buffer else h2d_buffer}
783+
)
781784
handle = reduce_tensor(buffer)
782785

783786
buckets_by_receiver_rank: dict[int, list[H2DBucket]] = defaultdict(list)
@@ -823,7 +826,14 @@ def _update_per_bucket(
823826
buffer_b: torch.Tensor = buffer[start : start + bucket.size]
824827
if receiver_rank == self._rank:
825828
if disable_h2d_buffer:
826-
self._copy_to_buffer(checkpoint_name, bucket, buffer_b)
829+
if p2p_update:
830+
assert bucket == receiver_rank_buckets[i][1]
831+
self._copy_to_buffer(
832+
checkpoint_name,
833+
bucket,
834+
buffer_b,
835+
receiver_rank_buckets[i][0] if p2p_update else None,
836+
)
827837
else:
828838
buffer_b.data.copy_(h2d_buffer[: bucket.size])
829839
dist.broadcast(buffer_b, src=receiver_rank, group=ranks_group)
@@ -850,8 +860,8 @@ def _update_per_bucket(
850860
req_thread.join()
851861
dist.barrier(group=ranks_group)
852862
socket.close()
853-
if ranks and h2d_buffer is not None:
854-
self._p2p_store.unregister_named_tensors([h2d_buffer_name])
863+
if p2p_update:
864+
self._p2p_store.unregister_named_tensors([p2p_ipc_buffer_name])
855865

856866
self.device_manager.device_module.empty_cache()
857867

0 commit comments

Comments
 (0)