8 个版本

0.3.0 2022 年 1 月 16 日
0.2.5 2021 年 8 月 15 日
0.2.4 2021 年 7 月 31 日
0.1.0 2021 年 6 月 16 日

#512 in 机器学习

MIT/Apache

1.5MB
16K SLoC

麦科

CI Status Current Crates.io Version Documentation

麦科是一个数据处理库,主要用于机器学习。它提供高效的管道原语来构建有向无环数据流图,以及一个数据加载器在单独的线程中运行图。它还提供常见的分词器和批处理工具来处理文本数据。

用法

要构建一个管道,首先从一个加载节点开始

use mako::pipeline::RandomLoader;

fn main() {
  let pipeline = RandomLoader::new(vec!["file1.txt".to_string(), "file2.txt".to_string()]);
}

默认情况下,RandomLoader 从文件中随机加载单个行。接下来,使用 add_fn() 函数向其中添加一个转换

let pipeline = RandomLoader::new(vec!["file1.txt".to_string(), "file2.txt".to_string()])
      .add_fn(|lines| lines.into_iter().map(|line| format!("Hello {}", line)).collect());

这创建了一个新的无状态节点,它只对数据进行闭包操作。闭包需要接受一批数据,这使得你可以进行批处理。在这种情况下,我们只是按顺序处理,使用 .into_iter().map().collect()

现在我们已经给每一行添加了 "Hello ",让我们创建一个有状态的节点来保存分词器并使其对数据进行分词

use mako::pipeline::Stateful;

// Our tokenizer
let tokenizer = mako::tokenization::WordpieceTokenizer::load();

// Our pipeline
let pipeline = RandomLoader::new(vec!["file1.txt".to_string(), "file2.txt".to_string()])
      .add_fn(|lines| lines.into_iter().map(|line| format!("Hello {}", line)).collect())
      .add_node(
            Stateful::new(
                  |(lines, tokenizer)| {
                        tokenizer.batch_tokenize(lines) // batch_tokenize takes in many sentences (Vec<String>) and tokenizes all of them, outputting Vec<Vec<String>>
                  },
                  tokenizer // The state we want this Stateful Node to have
            )
      );

太好了!现在我们的数据被有效地批处理分词。

加载节点

到目前为止,我们似乎只使用了两种类型的节点,无状态和有状态(无状态是在我们使用 .add_fn() 时生成的)。实际上我们使用了三种,因为 RandomLoader 也是一个节点!它接受 Vec<>() 作为输入,这是管道开始的地方,并产生数据(Vec)以发送到管道。

自定义节点

实际上,您也可以通过实现 Node 特性来自定义节点!只需在特性中实现 fn process(Vec<Input>) -> Vec<Output>,并在需要时实现 fn reset(&mut),这个方法会在一个纪元的开始时被调用,以及 fn data_remaining(&self) -> usize,这个方法应该返回节点可用数据量(对于 RandomLoader 是我们尚未加载的行数,对于非加载节点是 usize::MAX)和您就可以有自己的节点来集成到管道中!

数据加载器

既然我们构建了这个酷炫的管道,我们能用它做什么呢?首先,我们可以简单调用 process() 并传入一些数据,但让我们做些更酷的事情。让我们将其放入数据加载器中,并在机器学习训练循环中使用它。

// Make the dataloader
let mut dataloader = mako::dataloader::Dataloader(pipeline, 64); // We use 64 as the batch size

// Training loop
for example in &mut dataloader {
   // Now example is a vector of tokenized strings!
   // Do with them what you may...
}

待办事项

  • 使标记化器加载更高效
  • 使用 rayon 创建自动并行管道节点

依赖关系

~14–26MB
~385K SLoC