2017-03-05 20 views
0

OS/XでTensorflowを強制してHDFSから読み込もうとしています。ドキュメントMacでTensorflowをHDFSから読み取ることはできますか?

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

は明らかにこれが可能であるかどうかを指定していない、とのコードでは、唯一の「POSIX」のオペレーティングシステムを指します。

UnimplementedError(トレースバックについては上記参照):HDFSを使用しようとすると、私は見ているエラーは以下の通りですファイルシステムのスキームが 実装されていないHDFS [[ノード:ReaderReadV2 = ReaderReadV2 [_device = "/仕事:ローカルホスト/レプリカ:0 /タスク:0/CPU:0" ](TFRecordReaderV2、input_producer)]]

は、ここで私はこの時点までに何をやったかです:

  1. 醸造は、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.soではなくlibhdfs.dylibを読み込み、再コンパイルして、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:私はTensorflowソースで見ているコードパスは、私は別のエラーが表示されるだろうと私に示しているようだ

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))) 

https://github.com/tensorflow/tensorflow/blob/v1.0.0/tensorflow/core/platform/hadoop/hadoop_file_system.cc#L474に関係なく、「hdfs」スキーム用に何らかの種類のハンドラが登録されているため、問題が実際にMac固有のものだった場合は上記のものよりも優先されます。他の誰かがTensorflowをMacで動かすことに成功しましたか?サポートされていない場合は、簡単にパッチを当てる場所はありますか?

私はまた、より良いアプローチが何であるかについて提案しています。上位レベルの目標は、各ワーカーがデータのサブセットのみを読み取ることを考慮して、共有パラメーター・サーバーを使用して、モデルを並行して効率的にトレーニングすることです。これはローカルのファイルシステムを使って簡単に実現できますが、それを超えて拡張する方法はあまり明確ではありません。上記のコードをうまく機能させることができたとしても、データの局所性に問題が生じる可能性があります。

このスレッドhttps://github.com/tensorflow/tensorflow/issues/2218は、pyspark.RDD.toLocalIteratorを使用して、グラフ内のプレースホルダを持つデータセットを反復処理することを示唆しています。各作業者に完全なデータセットを反復させるという懸念を除いて、Tensorflowの組み込みEstimatorクラスが指定されたinput_fnとともにカスタムフィード関数を受け入れるように強制する方法はなく、カスタムinput_fnが必要です疎な加重されたフィーチャから学習できるLinearClassifier(https://www.tensorflow.org/tutorials/linear)のようなモデルの利点

どのような考えですか?

答えて

1

ビルド時に./configureでHDFSサポートを有効にしましたか?これは、HDFSが無効になっている場合に発生するエラーです。

私はあなたが正しい変更を加えて動作させると思います。 macOSで.dylibを探すためのプルリクエストを自由に送信してください。

+0

ありがとうございました!私は約10回そのプロンプトを通り抜け、それを完全に忘れてしまった。私はBazelと少し戦ったが、すぐにそれを私にダーウィンの定義を与えるように強制することはできなかった。もし私がそれを働かせたら、私はパッチを提出するでしょう。 .dyllibに変更することは、本当に私のために必要だったすべてでした。 – Josh

関連する問題