當我們運行models/syntaxnet/$ echo "sentence to parse" | ./syntaxnet/demo.sh
時,哪個特定的張量確實收到「句子解析」?SyntaxNet:parser_eval.py如何接收stdin?
我製作了一個SyntaxNet服務器(AWS,django)來幫助我的其他會話任務。每次我發送一個句子查詢到我的服務器,大約需要3.5秒才能得到解析的句子。
這對我的任務來說不夠快。所以我試圖找出瓶頸在哪裏。 我發現import tensorflow as tf
需要0.8秒,實際上需要1.6秒(2 * 0.8秒),因爲SyntaxNet有兩個步驟(POS標記和解析),甚至在它加載參數和構建圖之前。
我希望我的服務器總是'清醒',並準備用預先加載的圖表和參數來解析句子。 所以我嘗試調整SyntaxNet的工作如下。該會話通過input()
連續接收用戶輸入,並打印計算出的張量並永不關閉。
import tensorflow as tf
def multiplication(sess):
x1 = int(input())
matrix1 = tf.constant([[x1, x1]]
matrix2 = tf.constant([[2],[2]])
product = sess.run([tf.matmul(matrix1, matrix2)])
return product
with tf.Session() as sess:
while True:
print(multiplication(sess))
------------------------------------------
1
[array([[4]], dtype=int32)]
2
[array([[8]], dtype=int32)]
3
[array([[12]], dtype=int32)]
但是,我不能在哪裏實施input()
部分。 當我們運行models/syntaxnet/$ echo "sentence to parse" | ./syntaxnet/demo.sh
, demo.sh如何收到標準輸入?換句話說,「句子解析」去哪裏?我在bash腳本中找不到任何read
。
所以我就直接奔parser_eval通過
python bazel-bin/syntaxnet/parser_eval \
--input=stdin \
--output=stdout-conll \
--hidden_layer_sizes=64 \
--arg_prefix=brain_tagger \
--graph_builder=structured \
--task_context=syntaxnet/models/parsey_mcparseface/context.pbtxt \
--model_path=syntaxnet/models/parsey_mcparseface/tagger-params \
--slim_model \
--batch_size=1024 \
--alsologtostderr \
,並試圖找到哪裏蟒蛇文件syntaxnet/parser_eval.py接收輸入。
下面看來parser.evaluation ['documents']以某種方式收到stdin。
def Eval(sess):
...
...
while True:
tf_eval_epochs, tf_eval_metrics, tf_documents = sess.run([
parser.evaluation['epochs'],
parser.evaluation['eval_metrics'],
parser.evaluation['documents'],
])
if len(tf_documents):
logging.info('Processed %d documents', len(tf_documents))
num_documents += len(tf_documents)
sess.run(sink, feed_dict={sink_documents: tf_documents})
num_tokens += tf_eval_metrics[0]
num_correct += tf_eval_metrics[1]
if num_epochs is None:
num_epochs = tf_eval_epochs
elif num_epochs < tf_eval_epochs:
break
...
...
def main(unused_argv):
print >> sys.stderr, "parser_eval.py main start", time.time()
logging.set_verbosity(logging.INFO)
temp_counter = 0
while True:
with tf.Session() as sess:
Eval(sess, temp_counter)
temp_counter +=1
if __name__ == '__main__':
tf.app.run()
我也找到了graph_builder.py
,gen_parser_ops.py
,但無法找到其具體的張量或變量接收標準輸入句子呢。
您能解釋一下SyntaxNet接收stdin語句的位置?
如果你能回答一些相關的問題,這也會有幫助。
- 我怎樣才能把裏面parser_eval.py
while True:
環(這個我試過一些地方在parser_eval.py
,但它接收標準輸入一次。) - 能tensorflow服務幫助這個問題?
在此先感謝。
您可能想要觀看此問題:https://github.com/tensorflow/models/issues/2015 – adrin