Tensorflow 可以从 Mac 上的 HDFS 读取数据吗?

Can Tensorflow read from HDFS on Mac?

我正在尝试强制 OS/X 上的 Tensorflow 从 HDFS 读取数据。文档

https://www.tensorflow.org/deploy/hadoop

没有明确说明这是否可行,代码仅指 "posix" 操作系统。我在尝试使用 HDFS 时看到的错误如下:

UnimplementedError (see above for traceback): File system scheme hdfs not implemented [[Node: ReaderReadV2 = ReaderReadV2[_device="/job:localhost/replica:0/task:0/cpu:0"](TFRecordReaderV2, input_producer)]]

这是我到目前为止所做的:

  1. brew 安装 Hadoop 2.7.2
  2. 为本地库单独编译了 Hadoop 2.7.2。 Hadoop 安装在我系统的 /usr/local/Cellar/hadoop/2.7.2/libexec 上,本地库 (libhdfs.dylib) 在 ~/Source/hadoop/hadoop-hdfs-project/hadoop-hdfs/target/hadoop-hdfs-2.7.2/lib/native.
  3. 编辑 https://github.com/tensorflow/tensorflow/blob/v1.0.0/tensorflow/core/platform/hadoop/hadoop_file_system.cc#L113-L119 处的代码以从 libhdfs.dylib 而不是 libhdfs.so 读取,重新编译并重新安装 Tensorflow。 (我不得不承认这很愚蠢,我不知道是否只需要让这段代码在 Mac 上运行。)

这是要重现的代码。

test.sh:

set -x

export JAVA_HOME=$($(dirname $(which java | xargs readlink))/java_home)
export HADOOP_HOME=/usr/local/Cellar/hadoop/2.7.2/libexec

. $HADOOP_HOME/libexec/hadoop-config.sh

export HADOOP_HDFS_HOME=$(echo ~/Source/hadoop/hadoop-hdfs-project/hadoop-hdfs/target/hadoop-hdfs-2.7.2)

export CLASSPATH=$($HADOOP_HDFS_HOME/bin/hdfs classpath --glob)

# Virtual environment with Tensorflow and necessary dependencies
. venv/bin/activate

python ./test.py

test.py:

import tensorflow as tf

_, example_bytes = tf.TFRecordReader().read(
    tf.train.string_input_producer(
        [
            "hdfs://localhost:9000/user/foo/feature_output/part-r-00000",
            "hdfs://localhost:9000/user/foo/feature_output/part-r-00001",
            "hdfs://localhost:9000/user/foo/feature_output/part-r-00002",
            "hdfs://localhost:9000/user/foo/feature_output/part-r-00003",
        ]
    )
)

with tf.Session().as_default() as sess:
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    print(len(sess.run(example_bytes)))

我在 Tensorflow 源代码中看到的代码路径似乎向我表明,如果问题确实是 mac 特定的,我会收到与上述错误不同的错误,因为某种处理程序已注册 "hdfs" 方案,而不管: https://github.com/tensorflow/tensorflow/blob/v1.0.0/tensorflow/core/platform/hadoop/hadoop_file_system.cc#L474 。有没有其他人成功地强迫 Tensorflow 与 Mac 一起工作?如果不支持,有没有方便的补丁?

我也乐于接受有关更好方法的建议。高级目标是使用共享参数服务器高效地并行训练模型,考虑到每个工作人员只会读取数据的一个子集。这很容易使用本地文件系统来完成,但是如何扩展到它之外还不​​太清楚。即使我确实成功地使上面的代码工作,结果也可能会遇到数据局部性问题。

此线程 https://github.com/tensorflow/tensorflow/issues/2218 suggests using pyspark.RDD.toLocalIterator to iterate over the data set with a placeholder in the graph. Aside from my concern about forcing each worker to iterate through the full dataset, I don't see a way to coerce Tensorflow's builtin Estimator class to accept a custom feed function along with a specified input_fn, and a custom input_fn appears necessary in order to take advantage of models like LinearClassifier (https://www.tensorflow.org/tutorials/linear) 能够从稀疏的加权特征中学习。

有什么想法吗?

您在构建时是否在 ./configure 中启用了 HDFS 支持?如果 HDFS 被禁用,这就是你会得到的错误。

我认为您进行了正确的更改以使其生效。欢迎发送拉取请求以在 macOS 上查找 .dylib。