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 机器学习
1.5MB
16K SLoC
麦科
麦科是一个数据处理库,主要用于机器学习。它提供高效的管道原语来构建有向无环数据流图,以及一个数据加载器在单独的线程中运行图。它还提供常见的分词器和批处理工具来处理文本数据。
用法
要构建一个管道,首先从一个加载节点开始
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