【问题标题】:Can Tensorflow read from HDFS on Mac?Tensorflow 可以从 Mac 上的 HDFS 读取吗?
【发布时间】:2017-03-07 02:45:01
【问题描述】:

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

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

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

UnimplementedError(参见上面的回溯):文​​件系统方案 hdfs 未实现 [[节点: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 建议使用 pyspark.RDD.toLocalIterator 在图中使用占位符迭代数据集。除了我担心强迫每个工作人员遍历整个数据集之外,我看不到强制 Tensorflow 的内置 Estimator 类接受自定义 feed 函数以及指定 input_fn 的方法,并且自定义 input_fn 似乎是必要的,以便采取LinearClassifier (https://www.tensorflow.org/tutorials/linear) 等能够从稀疏加权特征中学习的模型的优势。

有什么想法吗?

【问题讨论】:

    标签: dynamic tensorflow libraries


    【解决方案1】:

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

    我认为您进行了正确的更改以使其正常工作。随时发送拉取请求以在 macOS 上查找 .dylib。

    【讨论】:

    • 谢谢!我经历了大约 10 次提示,然后完全忘记了它。我和巴泽尔打了一会儿架,但不能立即强迫它给我一个达尔文的定义。如果我得到这个工作,我会提交一个补丁。更改为 .dyllib 确实是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多