【问题标题】:Most efficient way to make predictions on large data?对大数据进行预测的最有效方法?
【发布时间】:2023-03-17 00:51:02
【问题描述】:

我正在尝试编写一个预测函数来预测大型文本数据(所以它必须是批量的)。但是预测功能有点慢。所以我想知道我能做些什么来改善它的时间。

到目前为止我所拥有的:

def get_embeddings(model, data_loader, device):
    
    model.eval()  # eval mode
    
    with torch.no_grad():
        embeddings = torch.tensor([], dtype=torch.float64, device=device)  #initialize empty tensor
        for _, d in enumerate(tqdm(data_loader), 0):
            # model inputs
            input_ids = d["input_ids"].to(device)
            attention_mask = d["attention_mask"].to(device)

            # model outputs
            embeddings = torch.cat((embeddings, model.predict(
                input_ids,
                attention_mask=attention_mask
            )))  # concat predictions

    return embeddings.cpu().numpy()  # convert to numpy array

我认为从 GPU 转换到 CPU 需要时间,所以我决定先初始化一个空张量并连接所有预测。然后在最后将其转换回 numpy 数组。但我不确定张量连接是否真的会更慢。

所以我想知道在预测方面是否有更好或最佳实践。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    您的代码中有几件事引起了我的注意:

    • 您正在使用float64。 GPU 比 float32float16 慢得多。
    • 您可能会强制将 float32 转换为 float64,这也可能很慢。
    • 您正在为每个输入将注意力掩码复制到 GPU。相反,创建和/或保留它。
    • 确保所有操作均分批完成,以充分利用 GPU 的并行性。
    • 连接可能没用:GPU->CPU 传输大多受带宽限制,因此它是一个大张量还是许多小张量(在一定程度上)并不重要。其次,分配(由cat 引起)可能很慢。

    【讨论】:

    • 对于第 4 点,我的 data_loader 是一个数据加载器对象,因此它应该已经分批完成。对于第 3 点,您能说得更明确一点吗?
    • @Thomas 插入这一行:print(input_ids.shape, input_ids.dtype, attention_mask.shape, attention_mask.dtype)。它在您的预期用例中说明了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多