GithubHelp home page GithubHelp logo

dataloader接口设计 about libai HOT 9 CLOSED

oneflow-inc avatar oneflow-inc commented on August 17, 2024
dataloader接口设计

from libai.

Comments (9)

CPFLAME avatar CPFLAME commented on August 17, 2024

如果用户新定义了一个dataset:

class my_dataset:
    def __init__(self, weigts, my_input1, my_input2):
          ...
    ...

那么对于方案一来说, 用户只需要修改lazyconfig:

dataloader.train = LazyCall(build_image_train_loader)(
    dataset=[
        LazyCall(my_dataset)(
            root="/DATA/disk1/ImageNet/extract/", 
            weights=...,
            my_input1=...,
            my_input2=...
        ),
    ],
    batch_size=16,
)

或者通过import的方式, 直接继承过来修改:

...
from default_config import dataloader
...

dataloader.train.dataset=[
    LazyCall(my_dataset)(
            root="/DATA/disk1/ImageNet/extract/", 
            weights=...,
            my_input1=...,
            my_input2=...
    ),
]

而对于方案二来说 用户需要修改的地方则为:

  1. config文件, 把自己的my_input1 和自己的my_input2加到config文件里面去
  2. trainer:
class Trainer:
    def build_train_dataloader(self, data_path, weights, my_input1, my_input2):
        dataset = build_my_dataset(data_path, weights, my_input1, my_input2)
        sampler = CyclicSampler(...)
        return Dataloader(dataset, batch_sampler=sampler, collate_fn=dataset.collate_fn)

    def build_train_valid_test_dataloader(self, data_path, weights, splits, my_input1, my_input2):
        train_dataset, valid_dataset, test_dataset = build_train_valid_test_dataset(data_path, weights, my_input1, my_input2)
        train_sampler = CyclicSampler(...)
        valid_sampler = SingleRoundSampler(...)
        test_sampler = SingleRoundSampler(...)
        train_dataloader = Dataloader(train_dataset, batch_sampler=sampler, collate_fn=dataset.collate_fn)
        valid_dataloader = Dataloader(valid_dataset, batch_sampler=sampler, collate_fn=dataset.collate_fn)
        test_dataloader = Dataloader(test_dataset, batch_sampler=sampler, collate_fn=dataset.collate_fn)
        return train_dataloader, valid_dataloader, test_dataloader

from libai.

dangkai4u avatar dangkai4u commented on August 17, 2024

build_train_dataset和build_train_valid_test_dataset使用cfg进行传参,和方案一应该是一样的。只不过是把方案一里创建sampler和dataloader的步骤放到了trainer下面。

from libai.

L1aoXingyu avatar L1aoXingyu commented on August 17, 2024

我不理解为什么要把 sampler 写死,为啥只能有这两种 sampler,难道我不能按类别做重采样吗?把 collate fn 和 dataset 绑定也挺奇怪的,从来没有见过这种方式。

你把 build_train_dataset 和 build_train_valid_test_dataset 都用 cfg 传参,别人想在外部直接使用这个函数就变得根本不可能。

而且你只定义了 build_train_dataloader 和 build_train_valid_test_dataloader,只有 test_loader 的代码在哪里?

from libai.

dangkai4u avatar dangkai4u commented on August 17, 2024
  1. 我确实忽略了可能存在其他sampler的情形,但不一定只有lazycall才能做到这一点,我不相信lazycall出来前,所有的框架是sampler写死了,这个需求可以提出来,想办法解决,可以加一个参数,表明是否按类别重采样。
  2. collate_fn和dataset绑定,没见过这种方式,说明见的少,这里就有:https://github.com/pytorch/fairseq/blob/main/fairseq/data/language_pair_dataset.py#L344
  3. 别人想在外部使用build_train_dataset、build_train_valid_test_dataset变得不可能,我们能做的就是让这个用法简单,他们可以仿写即可,做自己的框架,为什么要关系别人外部使用的是否方便,而且,现在那种方法就算方便了吗?
  4. 只有 test_loader 的代码在哪里?我就举了几个例子,省略了一点,build_test_dataloader当然也按照那样写了。
  5. 我觉得核心问题在于,你们过分依赖lazycall,我查了很多资料,虽然很好,只有少数几个库使用,说明大部分用户不熟悉这个机制。fair团队是很厉害,普通的开发者是没有资格质疑他们做出来的成熟的东西。但其他的团队也不是吃干饭的,注册机制的应用范围很广,这个就值得怀疑了吗?再者,oneflow做的事情就是怀疑google、fair团队的事,所以不要盲目崇拜他们。而现在这种写法,只支持lazycall,之前写的注册机制相关的代码,相当于白写了。

from libai.

L1aoXingyu avatar L1aoXingyu commented on August 17, 2024

一个东西,在没有好的解决方案出来之前,大家通过比较麻烦的方式去解决了,现在有了更好的解决方案,为什么我们还要继续沿用麻烦的解决方案去搞。

你说话自相矛盾,你一会儿说我们不关心外面的人是否使用方便,一会儿又说我们要用注册机制因为用户不熟悉 lazycall,你到底想表达什么意思?我完全不知道你在说什么。

from libai.

L1aoXingyu avatar L1aoXingyu commented on August 17, 2024

一个东西做出来是给外面的用户用的,你给我说”为什么要关心别人外部使用是否方便“,我觉得你的**出了问题。

from libai.

CPFLAME avatar CPFLAME commented on August 17, 2024

这里其实也有自相矛盾的地方:

  1. 没见过这种方式, 并不是说这个东西没有市场, 而是说明你见得少, 所以我们可以这么做.

collate_fn和dataset绑定,没见过这种方式,说明见的少,这里就有

  1. 这里又说, 只有少数几个库再用, 说明大部分用户不熟悉这个机制.

只有少数几个库使用,说明大部分用户不熟悉这个机制

这个逻辑是怎么做到,
collate_fn和dataset绑定少量存在, 就是你见识不够,
lazycall只有几个库再用, 又说明大部分用户不熟悉这个机制.

lazycall应该是市场上最先进的config配置系统方式了, 我们没有以前别的库的历史包袱, 需要不停的兼容以前的版本, 导致又要支持注册, 又要支持lazycall, 甚至于有时候还要支持最原始的args.parser.
而且上来先直接写一版简洁干净并且可运行的代码, 我不觉得有什么不对.

from libai.

rentainhe avatar rentainhe commented on August 17, 2024

我觉得你有一个核心矛盾点在于,你说我们盲目崇拜fair团队,说我们使用LazyCall有问题,那你认为还有什么其他更好的解决方案吗,让你给你又没有给出来,你既然认为我们不能用别人团队设计的比较优秀的机制,那你倒是给出来一个更好的解决方案啊,那如果你没有办法给出来更好的解决方案,还是认为用yacs,argparse更好的的话,那是不是我也可以认为你在盲目崇拜别的团队,你这里是不是有些自相矛盾的点在里面

能用LazyCall轻松几十行代码解决的问题,你需要用注册修改好几个文件,到时候加一堆莫名其名的参数,让外部用户增加这种完全完全没必要的学习成本,人家还需要理解你每个参数的意思。有必要吗,用户只需要自己关心每个独立的组件就行了,这才是用户最简单易懂的修改方式

from libai.

rentainhe avatar rentainhe commented on August 17, 2024

还有一个点在于,不是我们过分依赖于LazyCall,是LazyCall帮忙我们解决了一大堆不必要的依赖,简化了一大堆不必要的设计,这个点我希望你仔细思考一下

from libai.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.