Fix data parallel + tensor parallel (#4499)
This commit is contained in:
@@ -82,10 +82,12 @@ class DataParallelController:
|
||||
self.scheduler_procs = []
|
||||
self.workers = [None] * server_args.dp_size
|
||||
|
||||
if not server_args.enable_dp_attention:
|
||||
dp_port_args = self.launch_dp_schedulers(server_args, port_args)
|
||||
else:
|
||||
if server_args.enable_dp_attention:
|
||||
dp_port_args = self.launch_dp_attention_schedulers(server_args, port_args)
|
||||
self.control_message_step = server_args.tp_size
|
||||
else:
|
||||
dp_port_args = self.launch_dp_schedulers(server_args, port_args)
|
||||
self.control_message_step = 1
|
||||
|
||||
# Only node rank 0 runs the real data parallel controller that dispatches the requests.
|
||||
if server_args.node_rank == 0:
|
||||
@@ -105,6 +107,7 @@ class DataParallelController:
|
||||
threads = []
|
||||
sockets = []
|
||||
dp_port_args = []
|
||||
ready_events = []
|
||||
for dp_rank in range(server_args.dp_size):
|
||||
tmp_port_args = PortArgs.init_new(server_args)
|
||||
tmp_port_args.tokenizer_ipc_name = port_args.tokenizer_ipc_name
|
||||
@@ -115,10 +118,13 @@ class DataParallelController:
|
||||
# We hold it first so that the next dp worker gets a different port
|
||||
sockets.append(bind_port(tmp_port_args.nccl_port))
|
||||
|
||||
ready_event = threading.Event()
|
||||
ready_events.append(ready_event)
|
||||
|
||||
# Create a thread for each worker
|
||||
thread = threading.Thread(
|
||||
target=self.launch_tensor_parallel_group,
|
||||
args=(server_args, tmp_port_args, base_gpu_id, dp_rank),
|
||||
target=self.launch_tensor_parallel_group_thread,
|
||||
args=(server_args, tmp_port_args, base_gpu_id, dp_rank, ready_event),
|
||||
)
|
||||
threads.append(thread)
|
||||
base_gpu_id += server_args.tp_size * server_args.gpu_id_step
|
||||
@@ -130,11 +136,27 @@ class DataParallelController:
|
||||
# Start all threads
|
||||
for thread in threads:
|
||||
thread.start()
|
||||
for thread in threads:
|
||||
thread.join()
|
||||
for event in ready_events:
|
||||
event.wait()
|
||||
|
||||
return dp_port_args
|
||||
|
||||
def launch_tensor_parallel_group_thread(
|
||||
self,
|
||||
server_args: ServerArgs,
|
||||
port_args: PortArgs,
|
||||
base_gpu_id: int,
|
||||
dp_rank: int,
|
||||
ready_event: threading.Event,
|
||||
):
|
||||
self.launch_tensor_parallel_group(server_args, port_args, base_gpu_id, dp_rank)
|
||||
ready_event.set()
|
||||
|
||||
# This thread cannot be closed because otherwise the `kill_itself_when_parent_died`
|
||||
# function in scheduler.py will kill the scheduler.
|
||||
while True:
|
||||
pass
|
||||
|
||||
def launch_dp_attention_schedulers(self, server_args, port_args):
|
||||
self.launch_tensor_parallel_group(server_args, port_args, 0, None)
|
||||
dp_port_args = []
|
||||
@@ -223,7 +245,7 @@ class DataParallelController:
|
||||
self.dispatching(recv_req)
|
||||
else:
|
||||
# Send other control messages to first worker of tp group
|
||||
for worker in self.workers[:: self.server_args.tp_size]:
|
||||
for worker in self.workers[:: self.control_message_step]:
|
||||
worker.send_pyobj(recv_req)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user