我试图在OS / X上强制Tensorflow从HDFS读取。文档
https://www.tensorflow.org/deploy/hadoop
没有明确说明这是否可行,而且代码仅指“posix”操作系统。我在尝试使用HDFS时遇到的错误如下:
UnimplementedError(参见上面的回溯):未实现文件系统方案hdfs [[Node:ReaderReadV2 = ReaderReadV2 [_device =“/ job:localhost / replica:0 / task:0 / cpu:0”](TFRecordReaderV2,input_producer)]]
这就是我到目前为止所做的事情:
这是重现的代码。
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“scheme无论如何: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)等模型的优点是能够从稀疏的加权特征中学习。
有什么想法吗?
答案 0 :(得分:1)
您在构建时是否在./configure中启用了HDFS支持?如果HDFS被禁用,那就是你会得到的错误。
我认为您做出了正确的改变以使其发挥作用。随意发送拉取请求以在macOS上查找.dylib。