pytorch 如何删除deepspeed引擎占用的内存

yftpprvb  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(232)

我试图在我的数据集中的各种样本上微调Llama-7 B,并在测试样本上进行评估。Llama-7 B无法在我的GPU上进行原生训练,因此我使用deepspeed对其进行微调,如下面的代码所示。
对于不同的数据样本,我多次调用train()函数。我发现,尽管代码在第一个示例中成功地进行了训练/微调,但在第二个示例中却耗尽了内存。可以看到,我在整个代码中包含了几个print语句(通过get_gpu_memory_usage()使用nvidia-smi获取内存)来分析内存。

def train(tokenizer, model, device, loader, optimizer, model_params):
    print('GPU MEMORY USAGE BEFORE ENGINE CREATED')
    print(get_gpu_memory_usage())
    model.train()
    model, optimizer, _, _ = deepspeed.initialize(model=model, model_parameters=model.parameters(), config=model_params['DEEPSPEED_CONFIG'])
    print('GPU MEMORY USAGE AFTER INITIALIZING ENGINE')
    print(get_gpu_memory_usage())
    outputs = model(...)
    loss = outputs[0]
    print('GPU MEMORY USAGE DURING STEP')
    print(get_gpu_memory_usage())
    # optimizer.zero_grad()
    model.backward(loss)
    # loss.backward()
    model.step()
    # optimizer.step()
    optimizer = None
    torch.cuda.empty_cache()
    print('GPU MEMORY USAGE AFTER CLEARING CACHE')
    print(get_gpu_memory_usage())

    return losses

字符串
我发现每次train()被调用时,第一次get_gpu_memory_usage()调用(在'GPU MEMORY USAGE BEFORE ENGINE CREATED'下)的初始内存都会增加;例如,第一次调用train()时,内存是13 MB,第二次调用时是7000 MB,然后是14000 MB,依此类推。当我在较小的模型上执行此代码的非深度速度版本时(完全相同的代码,除了注解掉deepspeed行并取消注解optimizer.zero_grad(),loss.backward()和optimizer.step()),每次调用train()时内存都是恒定的。
因此,似乎deepspeed.initialize()创建的内容没有从GPU内存中正确清除。我已经尝试清空CUDA缓存,可以看到,并尝试删除对象等。- 这些都没用如何删除deepspeed对象占用的所有内存?

0ve6wy6x

0ve6wy6x1#

DeepSpeed开发人员在此!
你不分享你的DeepSpeed配置,但我猜你正在使用ZeRO阶段3?我今天也遇到了这个问题。原来我们在使用ZeRO stage 3时出现了内存泄漏。我们有一个修复程序,它将很快合并到DeepSpeed中:https://github.com/microsoft/DeepSpeed/pull/3903
此外,对于未来的bug,我们鼓励您在我们的GitHub存储库上打开一个问题:https://github.com/microsoft/DeepSpeed/issues

相关问题