@@ -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