2013年5月5日,星期日

数据量大:相应地编码!

机器现在越来越大,越来越快:您可以租用一台具有244 GB RAM和数十个内核的机器,用于$每小时3.50。这意味着您可以删除庞大的数据集,而不必担心分布式编程的麻烦(如Jeff Hodges所指出的那样,``一台机器本地的问题很容易``)但是我尝试的大多数机器学习软件都不能真正胜任该任务,因为它没有尊重以下事实: 数据量大。对于想编写机器学习软件并希望通过使用大型单机进行扩展的人们来说,这是我的一些想法。

需要记住的数字是I / O昂贵;在单机环境中,尤其是将数据移入磁盘或从磁盘移出数据。当一件软件强迫您不必要地将数据移入或移出磁盘时,例如,强迫您将多个文件组合成一个文件,强迫您解压缩数据,或更普遍地强迫您实现任何易于计算的形式,这会很痛苦。数据转换。这里有一些避免引起最终用户(包括您自己!)痛苦的方法。

首先,如果可以的话,请流式传输数据,而不是在数据中随意查找。为什么这很重要?因为如果程序将输入视为流,则可以在输入到程序之前按需在内存中对其进行转换,这使程序的用途更加广泛。仅此一项就解决了许多其他问题。例如,如果我的数据分散在多个文件中,我可以即时将它们连接成一个流,或者如果我的数据以有趣的格式压缩,则可以即时对其进行解压缩。现在您可能会说``嘿,我没有在线算法'',但是尽管如此,许多程序还是错过了以流形式访问其输入的机会。例如,(否则确实很棒!) 线性 在数据上进行两次精确的顺序传递(第一个确定维度,第二个将数据读入核心),但是在这两次传递之间它调用 倒带。倒带的电话使事情变得非常困难。如果相反,liblinear仅关闭并重新打开了文件,那么我可以使用命名管道来玩弄技巧,以避免各种I / O。更好的是,如果liblinear允许一个文件指定两个文件而不是一个文件(第二个文件规范是可选的,默认是第二个文件与第一个文件相同),那么事情就变得容易了,因为 流处理重定向 技巧可以承担。 las,它都不做这些事情。

宗教上遵守流媒体访问模式是最佳的实践模式,但有时是不可能的。在那种情况下,仍然可以支持一些常见的模式。 不要让我串联文件:比这差 无用的猫,这是痛苦的缓慢,不必要地使用了猫。如果可以采用一个文件参数,则可以采用多个文件参数,就像它们被串联一样。 不要让我解压缩数据:您应该支持直接读取压缩数据。这不仅消除了实现数据的解压缩版本的需要,而且读取压缩数据并即时对其进行解压缩也比读取解压缩数据要快。 允许我假装输入比实际小 并且仅让您的程序在输入的第一个指定单位上运行(例如,前10000条记录);这有助于对逐渐更大的数据部分进行实验。 (我说数据科学就像求爱一样;我不喜欢一路走动去处理大量的数据,直到我偶然遇到了一些规模较小的偶然事件)。同样,如果您对待输入作为一个流,我可以在不需要您程序的额外帮助的情况下实现所有这些目标和其他目标,因此,这些警告仅适用于出于任何原因需要无顺序访问其输入的那些人。顺便说一下,您可以判断是否将输入视为流:只能执行打开,读取和关闭操作。

很少有机器学习工具包可以完全达到另一个层次,这是一个 DSL 用于实时数据转换。如果程序将输入数据视为流,并且只要转换后的数据不会太大,则可以使用进程间通信来模拟,而无需使用进程间通信来实现。 IPC 是可以接受的。这是mnist演示中的示例shell脚本摘录 Vowpal兔子
SHUFFLE='BEGIN { srand 69; };
         $i = int rand 1000;
         print $b[$i] if $b[$i];
         $b[$i] = $_; } { print grep { defined $_ } @b;'

paste -d' '                                                             \
  <(zcat train8m-labels-idx1-ubyte.gz | ./extract-labels)               \
  <(zcat train8m-images-idx3-ubyte.gz | ./extractpixels) |              \
perl -ne ${SHUFFLE} |                                                   \
./roundrobin ./pixelngrams 3 |                                          \
time ../../vowpalwabbit/vw --oaa 10 -f mnist8m11png.model               \
   -b 20 --adaptive --invariant                                         \
   --nn 5 --inpass                                                      \
   -l 0.05
在没有中间实现到磁盘的情况下,这里要解决的问题是:1)标签和数据位于不同的文件中(它们不是面向行的),需要将它们连接在一起; 2)有助于稍微整理数据以打破顺序相关性 新元;和3)需要计算其他像素图特征,这是CPU密集型的,因此为此使用了3个内核(通过辅助脚本循环)。

因此,上面看起来不错,为什么我们需要DSL才能在机器学习软件内部进行即时数据转换?一个很大的原因是中间体变大,IPC和解析输入的开销变得很大。在这种情况下,最好将转换推迟到学习核心内部(例如, 棺材)。的 -q, - 立方体--ngram Vowpal兔子的论点构成一种简单的迷你语言,具有很大的实际实用性;更好的是像 R公式.