当我们运行models/syntaxnet/$ echo "sentence to parse" | ./syntaxnet/demo.sh
时,哪个特定张量确实收到“要解析的句子”?
我创建了一个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_evalpython 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 \
并试图找到python文件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
,但找不到哪个特定的张量或变量接收了stdin句子。
请问你能解释一下SyntaxNet从哪里收到stdin句子?
如果你能回答一些相关的问题,也会有所帮助。
while True:
循环放在parser_eval.py中(我在parser_eval.py
尝试了一些部分,但它只接收stdin一次。)提前致谢。