slowfast 跑多卡的时候遇到问题

博客内容涉及在多GPU环境中使用PyTorch进行分布式训练的调试问题。主要问题是57服务器资源被占用导致无法调试,以及185服务器上出现的错误。作者对比了自己的代码和测试代码,发现在`init_method`中未定义,已将其设置为`tcp://localhost:9999`。通过检查每个函数的定义,尝试解决问题。最终发现删除`pdb`调试语句即可解决问题,并建议添加打印输出辅助调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

在57 服务器上跑:

python tools/run_net.py --cfg configs/Kinetics/X3D_XS.yaml NUM_GPUS 4 TRAIN.BATCH_SIZE 8 SOLVER.BASE_LR 0.0125 DATA.PATH_TO_DATA_DIR /mnt/data/geguojing/Heart_data/annotations20201112

 

目前这个问题没有解决,57 的服务器一直在被占用。调试不了 

185 上的出现的错误是:

对比了自己的代码和测试代码:

import torch
import utils.distributed as dist
from torch.utils.data.distributed import DistributedSampler
from torch.utils.data.sampler import RandomSampler
from torch.utils.data._utils.collate import default_collate
import pdb

def manu_collate(batch):
    inputs, bbox = zip(*batch)
    inputs = default_collate(inputs)
    collate_bbox = [i[0] for i in bbox]
    return inputs, collate_bbox
class AVA_DATA(torch.utils.data.DataLoader):
    def __init__(self):
        print('heihei')
        pass
    def __getitem__(self, index):
        return torch.ones(3,224,224)*index, [index]
        # return torch.ones(3,224,224)*indx
    def __len__(self):
        return 16


class AVA_MODEL(torch.nn.Module):
    def __init__(self):
        super(AVA_MODEL, self).__init__()
        self.conv1 = torch.nn.Conv2d(3,64,3,1)
        self.tmp = None
        # for i in range(20):
        #     self.tmp[i]=0
    def forward(self,x,bbox,tmp):

        # print(x.device.index)
        self.tmp.append(1)
        if x.device.index==0:
            print(self.tmp)
            # tmp.append(1)
            # print(tmp)
        # # if 1:
        #     print('***start***')
        #     print(self.tmp)
        #     for j in bbox:
        #         self.tmp[j]=j
        #     print('***end***')
        #     print(bbox, self.tmp)
        # self.tmp.append(1)
        # print(self.tmp)
        # tmp.append(1)
        # print(tmp)
        # print(len(bbox))
        res = self.conv1(x)
        return res
    

def run(
    local_rank, num_proc, func, init_method, shard_id, num_shards, backend,
):

    # Initialize the process group.
    world_size = num_proc * num_shards
    rank = shard_id * num_proc + local_rank

    try:
        torch.distributed.init_process_group(
            backend=backend,
            init_method=init_method,
            world_size=world_size,
            rank=rank,
        )
    except Exception as e:
        raise e

    torch.cuda.set_device(local_rank)
    func()


def launch_job(func, init_method='tcp://localhost:9999', daemon=False, dis=True):
    """
    Run 'func' on one or more GPUs, specified in cfg
    Args:
        cfg (CfgNode): configs. Details can be found in
            slowfast/config/defaults.py
        init_method (str): initialization method to launch the job with multiple
            devices.
        func (function): job to run on GPU(s)
        daemon (bool): The spawned processes’ daemon flag. If set to True,
            daemonic processes will be created
    """
    if dis:
        torch.multiprocessing.spawn(
            run,
            nprocs=4,
            args=(
                4,
                func,
                init_method,
                0,
                1,
                'nccl',
                
               
            ),
            daemon=daemon,
        )
    else:
        func()

def train():
    model = AVA_MODEL()
    cur_device = torch.cuda.current_device()
    model = model.cuda(device=cur_device)
    # model = torch.nn.DataParallel(model).cuda()
    model = torch.nn.parallel.DistributedDataParallel(
            module=model, device_ids=[cur_device], output_device=cur_device)
    dataset = AVA_DATA()
    dataloader = torch.utils.data.DataLoader(
            dataset,
            batch_size=1,
            shuffle=False,
            sampler=DistributedSampler(dataset),
            # sampler=None,
            num_workers=8,
            pin_memory=True,
            drop_last=True,
            collate_fn=manu_collate,
            # worker_init_fn=None,
        )
    tmp = []
    model.train()
    for i in range(200000000):
        shuffle_dataset(dataloader,i)
        for iter, (inputs,bbox) in enumerate(dataloader):
            # print(i,iter)
            # inputs = inputs.cuda(non_blocking=True)
            # res = model(inputs,bbox,tmp)
            for j in bbox:
                tmp.append(j)
        dist.synchronize()
        tmp = dist.all_gather_unaligned(tmp)
        if dist.get_rank()==0:
            print(iter,tmp)
        break
    model.module.tmp = tmp
    for i in range(2):
        for iter, (inputs,bbox) in enumerate(dataloader):
            # print(i,iter)
            inputs = inputs.cuda(non_blocking=True)
            res = model(inputs,bbox,tmp)
            # tmp.append(1)
def shuffle_dataset(loader, cur_epoch):
    """"
    Shuffles the data.
    Args:
        loader (loader): data loader to perform shuffle.
        cur_epoch (int): number of the current epoch.
    """
    # sampler = (
    #     loader.batch_sampler.sampler
    #     if isinstance(loader.batch_sampler, ShortCycleBatchSampler)
    #     else loader.sampler
    # )
    # assert isinstance(
    #     sampler, (RandomSampler, DistributedSampler)
    # ), "Sampler type '{}' not supported".format(type(sampler))
    # # RandomSampler handles shuffling automatically
    sampler = loader.sampler
    if isinstance(sampler, DistributedSampler):
        # DistributedSampler shuffles data based on epoch
        sampler.set_epoch(cur_epoch)
if __name__ == "__main__":
    tmp = dict()
    pdb.set_trace()
    for i in range(20):
        tmp[i]=0
    pdb.set_trace()
    launch_job(train)    
    # train(tmp)

        

发现init_method 程序里面没有定义 

给init_method 一个定义:tcp://localhost:9999

 

查看每一个函数定义与测试代码的异同点

cfg.SHRAD_ID 0

cfg.NUM_SHARDS 1

cfg.DIST_BACKEND 为nccl

57上的nccl 的问题 不知道修改这个是不是就可以了

进到run 里面print 打印 

总结下来就是:不知道改了哪里就好了

pdb去掉就好了

最好是加打印输出 

### 如何在张显上运行 Ollama 模型 Ollama 是一款专注于本地化推理的工具,主要设计目标是在单机环境下高效运行大语言模型。然而,在某些情况下,可能需要利用个 GPU 来加速推理过程或扩展计算能力。尽管 Ollama 的官方文档并未提供详细的 GPU 分布式训练配置指南[^3],可以通过一些间接方法实现这一目标。 以下是关于如何尝试在张显上运行 Ollama 模型的方法: #### 方法一:通过 DeepSpeed 实现分布式推理 DeepSpeed 是一种高效的深度学习优化库,能够显著提升大模型在 GPU 上的表现。虽然 Ollama 并未原生集成 DeepSpeed 支持,但可以考虑将 Ollama 导出的模型加载到 PyTorch 中,并借助 DeepSpeed 进行分布式的推理操作[^1]。 具体步骤如下: ```python import deepspeed from transformers import AutoModelForCausalLM, AutoTokenizer model_name = "your_ollama_model" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) # 初始化 DeepSpeed 配置文件 ds_config = { "fp16": {"enabled": True}, "zero_optimization": {"stage": 2} } # 使用 DeepSpeed 加载模型 model_engine, _, _, _ = deepspeed.initialize( model=model, config_params=ds_config ) text = "Your input text here." input_ids = tokenizer.encode(text, return_tensors="pt").cuda() with torch.no_grad(): outputs = model_engine.generate(input_ids=input_ids, max_length=50) print(tokenizer.decode(outputs[0], skip_special_tokens=True)) ``` 上述代码展示了如何使用 DeepSpeed 对 Ollama 模型进行分布式推理。需要注意的是,这种方法依赖于 Hugging Face Transformers 库的支持[^2]。 --- #### 方法二:手动分配子任务至不同 GPU 如果不想引入额外的库(如 DeepSpeed),也可以采用更基础的方式——手动拆分输入序列并将它们分别发送到不同的 GPU 设备上执行推理。这种方式适用于较小规模的任务,但对于复杂的大模型可能会遇到效率瓶颈。 示例代码如下: ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer device_map = {0: 'cuda:0', 1: 'cuda:1'} # 定义设备映射关系 model_name = "your_ollama_model" tokenizer = AutoTokenizer.from_pretrained(model_name) models = {} for i in range(len(device_map)): models[i] = AutoModelForCausalLM.from_pretrained(model_name).to(device_map[i]) def parallel_inference(input_text): inputs = tokenizer([input_text]*len(models), return_tensors='pt') results = [] for idx, (key, device) in enumerate(device_map.items()): local_inputs = {k:v[idx].unsqueeze(0).to(device) for k,v in inputs.items()} with torch.no_grad(): output = models[key].generate(**local_inputs, max_length=50) decoded_output = tokenizer.decode(output[0], skip_special_tokens=True) results.append(decoded_output) return results result_texts = parallel_inference("Input sentence.") for res in result_texts: print(res) ``` 此脚本会将相同的输入传递给每一块指定的 GPU,并收集各自的输出结果。注意调整 `device_map` 字典来匹配实际可用的硬件环境。 --- #### 注意事项 - **性能考量**:由于 Ollama 更倾向于轻量化部署而非高性能计算场景,因此即使实现了 GPU 支持,也可能无法充分发挥所有设备的能力。 - **兼容性验证**:确保所使用的版本号与各组件之间保持一致;否则可能出现意外错误。 - **资源管理**:当涉及大量 GPU 资源时,请务必监控内存占用情况以及网络通信开销等问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值