1+ from dataclasses import asdict
2+
13import ray
24import torch .distributed as dist
35from deepspeed .runtime .zero import GatheredParameters
@@ -29,9 +31,22 @@ def _gather_weights(is_zero3, named_params):
2931 return [(n , p .data ) for n , p in named_params ]
3032
3133
32- def gather_deepspeed_weights (model , ds_config , buffer_size ):
34+ def _get_deepspeed_named_params (model , ds_config , is_lora = False ):
35+ if not is_lora :
36+ return [(name , param ) for name , param in model .named_parameters ()]
37+
38+ if not ds_config .is_zero3 ():
39+ return [(name , param ) for name , param in get_peft_model_state_dict (model ).items ()]
40+
41+ adapter_name = "default"
42+ state_dict = model .state_dict ()
43+ lora_state_dict = {k : state_dict [k ] for k in state_dict if ("lora_" in k and adapter_name in k )}
44+ return [(name .replace (f".{ adapter_name } " , "" ), model .get_parameter (name )) for name in lora_state_dict ]
45+
46+
47+ def gather_deepspeed_weights (model , ds_config , buffer_size , is_lora = False ):
3348 is_zero3 = ds_config .is_zero3 ()
34- named_params = [( name , param ) for name , param in model . named_parameters ()]
49+ named_params = _get_deepspeed_named_params ( model , ds_config , is_lora = is_lora )
3550
3651 waiting_params , waiting_params_size = [], 0
3752 for name , param in named_params :
@@ -150,7 +165,7 @@ def _setup_broadcast_group(self):
150165 def _colocated_model_update (self ):
151166 refs = []
152167 for named_weights in gather_deepspeed_weights (
153- self .model , self .ds_config , buffer_size = self ._model_update_buffer_size
168+ self .model , self .ds_config , buffer_size = self ._model_update_buffer_size , is_lora = self . is_lora
154169 ):
155170 serialized_tensors = serialize_named_weights (
156171 named_weights , infer_strategy = self .infer_worker_config .strategy_args .strategy_name
@@ -167,11 +182,16 @@ def _colocated_model_update(self):
167182 ray .get (refs )
168183 refs = []
169184 if co_infer_rank == 0 and self ._co_infer_worker is not None :
170- refs .append (self ._co_infer_worker .update_parameter_in_bucket .remote (infer_parallel_tensors ))
185+ refs .append (
186+ self ._co_infer_worker .update_parameter_in_bucket .remote (
187+ infer_parallel_tensors , is_lora = self .is_lora
188+ )
189+ )
171190 if self ._broadcast_workers :
172191 refs .extend (self ._broadcast_to_infer_workers (named_weights ))
173192 if refs :
174193 ray .get (refs )
194+ self ._add_lora_to_infer_workers ()
175195 return {}
176196
177197 def _broadcast_to_infer_workers (self , named_weights ) -> list [ray .ObjectRef ]:
@@ -183,6 +203,7 @@ def _broadcast_to_infer_workers(self, named_weights) -> list[ray.ObjectRef]:
183203 names = [n for n , _ in named_weights ],
184204 dtypes = [w .dtype for _ , w in named_weights ],
185205 shapes = [w .shape for _ , w in named_weights ],
206+ is_lora = self .is_lora ,
186207 )
187208 for worker in self ._broadcast_workers
188209 ]
@@ -198,8 +219,17 @@ def _broadcast_to_infer_workers(self, named_weights) -> list[ray.ObjectRef]:
198219 def _separated_model_update (self ):
199220 logger .info (f"start broadcast model update { self .model_update_group_name } " )
200221 for named_weights in gather_deepspeed_weights (
201- self .model , self .ds_config , buffer_size = self ._model_update_buffer_size
222+ self .model , self .ds_config , buffer_size = self ._model_update_buffer_size , is_lora = self . is_lora
202223 ):
203224 refs = self ._broadcast_to_infer_workers (named_weights )
204225 ray .get (refs )
226+ self ._add_lora_to_infer_workers ()
205227 return {}
228+
229+ def _add_lora_to_infer_workers (self ):
230+ if dist .get_rank () != 0 or not self .is_lora :
231+ return
232+ peft_config = self .model .peft_config .get ("default" , None )
233+ ray .get (
234+ [worker .add_lora .remote (peft_config = asdict (peft_config )) for worker in self .model_update_infer_workers ]
235+ )
0 commit comments