# Copyright (c) 2026 SandAI. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import torch from .parallel_state import get_tp_rank, get_tp_world_size def is_last_rank(): return torch.distributed.get_rank() == (torch.distributed.get_world_size() - 1) def is_last_tp_cp_rank(): return get_tp_rank(with_context_parallel=True) == get_tp_world_size(with_context_parallel=True) - 1 def get_world_size(): if torch.distributed.is_available() and torch.distributed.is_initialized(): world_size = torch.distributed.get_world_size() else: world_size = 1 return world_size def get_device(local_rank=None): backend = torch.distributed.get_backend() if backend == "nccl": if local_rank is None: device = torch.device("cuda") else: device = torch.device(f"cuda:{local_rank}") elif backend == "gloo": device = torch.device("cpu") else: raise RuntimeError return device