1

我有一个使用 Pyro4 的客户端-服务器设计,其中客户端代码如下:

import Pyro4
uri         =   'PYRO:PYRO_SERVER@123.123.123.123:10000
test_1      =   Pyro4.Proxy(uri)
test_1.run_model()

服务器端代码如下:

import Pyro4
import socket
from keras.models import Sequential
from keras.layers import LSTM
import tensorflow as tf

@Pyro4.expose

class PyroServer(object):

    def run_model(self):
        session     =   tf.Session()
        session.run(tf.global_variables_initializer())
        session.run(tf.local_variables_initializer())
        session.run(tf.tables_initializer())
        session.run(tf.variables_initializer([]))
        tf.reset_default_graph()
        model = Sequential()
        model.add(LSTM(25, input_shape=(5, 10)))

host_name   =   socket.gethostbyname(socket.getfqdn())
daemon      =   Pyro4.Daemon(host = host_name,port = 10000)
uri         =   daemon.register(PyroServer,objectId = 'PYRO_SERVER')
daemon.requestLoop()

服务器启动后,客户端对 run_model() 方法的第一次调用正常运行。对于第二次和所有后续调用,将显示以下错误消息:

文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/Pyro4/core.py”,第 187 行,调用
return self.__send(self.__name, args, kwargs)
_pyroInvoke raise data 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/Pyro4/core.py”,第 472 行,
如果您在回溯中看到这个,您应该可能还要检查远程回溯
ValueError: Fetch 参数不能被解释为张量。(操作名称:“lstm_1/init”
op:“NoOp”
输入:“^lstm_1/kernel/Assign”
输入:“^lstm_1/recurrent_kernel/Assign”
输入:“^lstm_1/bias/Assign”
不是这个的元素图形。)

任何人都可以为此提出一个可能的解决方案吗?

4

2 回答 2

0

我不熟悉 Tensorflow,但实际错误是这样的:

ValueError:Fetch 参数不能解释为张量。

简化您的代码并使其首先正确独立运行,然后才将其包装在 Pyro 服务中。

于 2017-11-27T00:41:18.807 回答
-1

嘿,我使用该代码,这对我很有用。

$cat 问候服务器.py

import Pyro4
import tensorflow as tf

@Pyro4.expose
class GreetingMaker(object):
    def get_fortune(self, name):
        var = tf.constant('Hello, TensorFlow!')
        sess = tf.Session()
        return "Hello, {0}. Here is your greeting message:\n" \
               "{1}".format(name,sess.run(var))

daemon = Pyro4.Daemon()                # make a Pyro daemon
uri = daemon.register(GreetingMaker)   # register the greeting maker as a Pyro object

print("Ready. Object uri =", uri)      # print the uri so we can use it in the client later
daemon.requestLoop()                   # start the event loop of the server to wait for calls

$猫问候-client.py

import Pyro4

uri = input("What is the Pyro uri of the greeting object? ").strip()
name = input("What is your name? ").strip()

greeting_maker = Pyro4.Proxy(uri)         # get a Pyro proxy to the greeting object
print(greeting_maker.get_fortune(name))   # call method normally

$ python greeting-server.py &
[1] 2965
准备好了。对象 uri = PYRO:obj_a751da78da6a4feca49f18ab664cc366@loc​​alhost:53025

$python greeting-client.py
问候对象的 Pyro uri 是什么?

PYRO:obj_a751da78da6a4feca49f18ab664cc366@loc​​alhost:53025


你叫什么名字?

PLM

2018-03-06 16:20:32.271647: W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 SSE4.1 指令,但这些在您的机器上可用并且可以加速 CPU计算。2018-03-06 16:20:32.271673: W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 SSE4.2 指令,但这些可在您的机器上使用并且可以加快 CPU计算。2018-03-06 16:20:32.271678: W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 AVX 指令,但这些可在您的机器上使用并且可以加快 CPU 计算速度。2018-03-06 16:20:32.271682: W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 AVX2 指令,但这些在您的机器上可用,并且可以加快 CPU 计算速度。2018-03-06 16:20:32.271686: W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 FMA 指令,但这些可在您的机器上使用,并且可以加速 CPU 计算。
你好,PLM。这是您的问候语:
b'Hello,TensorFlow!'

如您所见,如果再次连接到相同的 url,则无需 TF 初始化时间即可工作,因为它已经在第一次调用期间完成。然后,只要您调用相同的 Pyro url,显然就可以在 2 个单独的调用中保持持久性。

$ python greeting-client.py
什么是问候对象的 Pyro uri?

PYRO:obj_a751da78da6a4feca49f18ab664cc366@loc​​alhost:53025


你叫什么名字?

Plm2


你好,PLM2。这是您的问候语:
b'Hello,TensorFlow!'

于 2018-03-07T00:30:53.180 回答