【发布时间】:2019-08-12 14:30:49
【问题描述】:
我构建了一个客户端,使用 grpc 和 c++ 将一些数据提供给 docker-container 内的模型服务器。
尝试连接时,我收到消息: 错误 14 对等方重置连接。
客户端代码:
std::cout << "calling prediction service on " << "localhost:8500"
<< std::endl;
ServingClient sclient(grpc::CreateChannel(
"localhost:8500", grpc::InsecureChannelCredentials()));
std::vector<float> reply = sclient.callPredict(model_name,
model_signature_name, data);
tensorflow 服务命令:
tensorflow_model_server --port=8500 --rest_api_port=8501 -- model_name=best_model --model_base_path=/models/best_model/
docker 容器输出:
2019-08-12 13:59:29.851181: I tensorflow_serving/core/loader_harness.cc:86] 成功加载可服务版本 {name: best_model version: 1} 2019-08-12 13:59:29.854813:我 tensorflow_serving/model_servers/server.cc:324] 在 0.0.0.0:8500 运行 gRPC ModelServer ... [警告] getaddrinfo:不支持节点名的地址族 [evhttp_server.cc : 239] RAW:进入事件循环... 2019-08-12 13:59:29.858052:我 tensorflow_serving/model_servers/server.cc:344] 在:localhost:8501 导出 HTTP/REST API ...
客户端输出: 在 localhost:8500 上调用预测服务 生成的 Proto Tensor OK gRPC 调用返回码:14:对等方重置连接 gRPC 失败
【问题讨论】:
-
"Connection reset by peer" 可能表明服务器没有监听客户端所针对的 ip:port。您说您正在端口 8500 上的 docker 容器中运行服务器,并且客户端的目标是环回接口和端口 8500 - 如果是这样,则应满足以下条件之一才能使其正常工作:a)使用 docker host网络,即 --net 主机,用于服务器 b) 以 docker 容器的 IP 为目标,而不是您机器的本地主机,c) 您的客户端必须在与服务器相同的 docker 容器中运行。
-
通过定位 docker-ip 你的意思是使用 0.0.0.0: 而不是 "localhost" 对吗?我已经尝试过但没有改善。我很确定我的客户端代码工作正常,因为当我连接不同的服务器(在 docker 之外)时,我得到了连接。当我使用 REST 接口与 docker 容器通信时,我得到: curl: (56) Recv failure: Connection reset by peer 。另一个威胁表明它可能是由容器内的错误端口映射引起的。但我只使用了 tensorflow 服务命令。
-
不完全是,定位 0.0.0.0 也不正确。请注意,docker 网络使用“docker 桥” - 请参阅docs.docker.com/v17.09/engine/userguide/networking/… 和相关的更多详细信息。简而言之,docker 容器默认不与主机“共享”网络接口。找出可用于从主机(或其他容器)访问容器的 docker IP 的一种方法是运行“docker inspect
”,然后查看“IPAddress”字段。获取容器 id 的一个简单示例方法是运行“docker container ls”
标签: tensorflow grpc serving