forked from OSSInnovation/mindspore
restructure
This commit is contained in:
parent
e09d50e4d6
commit
ba5fa502cc
|
@ -106,6 +106,7 @@ endif() # NOT ENABLE_ACL
|
|||
|
||||
if (ENABLE_SERVING)
|
||||
add_subdirectory(serving)
|
||||
add_subdirectory(serving/example/cpp_client)
|
||||
endif()
|
||||
|
||||
if (NOT ENABLE_ACL)
|
||||
|
|
|
@ -1,318 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: ms_service.proto
|
||||
|
||||
from google.protobuf.internal import enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from google.protobuf import reflection as _reflection
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor.FileDescriptor(
|
||||
name='ms_service.proto',
|
||||
package='ms_serving',
|
||||
syntax='proto3',
|
||||
serialized_options=None,
|
||||
serialized_pb=b'\n\x10ms_service.proto\x12\nms_serving\"2\n\x0ePredictRequest\x12 \n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32\x12.ms_serving.Tensor\"2\n\x0cPredictReply\x12\"\n\x06result\x18\x01 \x03(\x0b\x32\x12.ms_serving.Tensor\"\x1b\n\x0bTensorShape\x12\x0c\n\x04\x64ims\x18\x01 \x03(\x03\"p\n\x06Tensor\x12-\n\x0ctensor_shape\x18\x01 \x01(\x0b\x32\x17.ms_serving.TensorShape\x12)\n\x0btensor_type\x18\x02 \x01(\x0e\x32\x14.ms_serving.DataType\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c*\xc9\x01\n\x08\x44\x61taType\x12\x0e\n\nMS_UNKNOWN\x10\x00\x12\x0b\n\x07MS_BOOL\x10\x01\x12\x0b\n\x07MS_INT8\x10\x02\x12\x0c\n\x08MS_UINT8\x10\x03\x12\x0c\n\x08MS_INT16\x10\x04\x12\r\n\tMS_UINT16\x10\x05\x12\x0c\n\x08MS_INT32\x10\x06\x12\r\n\tMS_UINT32\x10\x07\x12\x0c\n\x08MS_INT64\x10\x08\x12\r\n\tMS_UINT64\x10\t\x12\x0e\n\nMS_FLOAT16\x10\n\x12\x0e\n\nMS_FLOAT32\x10\x0b\x12\x0e\n\nMS_FLOAT64\x10\x0c\x32\x8e\x01\n\tMSService\x12\x41\n\x07Predict\x12\x1a.ms_serving.PredictRequest\x1a\x18.ms_serving.PredictReply\"\x00\x12>\n\x04Test\x12\x1a.ms_serving.PredictRequest\x1a\x18.ms_serving.PredictReply\"\x00\x62\x06proto3'
|
||||
)
|
||||
|
||||
_DATATYPE = _descriptor.EnumDescriptor(
|
||||
name='DataType',
|
||||
full_name='ms_serving.DataType',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
values=[
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_UNKNOWN', index=0, number=0,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_BOOL', index=1, number=1,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_INT8', index=2, number=2,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_UINT8', index=3, number=3,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_INT16', index=4, number=4,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_UINT16', index=5, number=5,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_INT32', index=6, number=6,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_UINT32', index=7, number=7,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_INT64', index=8, number=8,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_UINT64', index=9, number=9,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_FLOAT16', index=10, number=10,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_FLOAT32', index=11, number=11,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
_descriptor.EnumValueDescriptor(
|
||||
name='MS_FLOAT64', index=12, number=12,
|
||||
serialized_options=None,
|
||||
type=None),
|
||||
],
|
||||
containing_type=None,
|
||||
serialized_options=None,
|
||||
serialized_start=280,
|
||||
serialized_end=481,
|
||||
)
|
||||
_sym_db.RegisterEnumDescriptor(_DATATYPE)
|
||||
|
||||
DataType = enum_type_wrapper.EnumTypeWrapper(_DATATYPE)
|
||||
MS_UNKNOWN = 0
|
||||
MS_BOOL = 1
|
||||
MS_INT8 = 2
|
||||
MS_UINT8 = 3
|
||||
MS_INT16 = 4
|
||||
MS_UINT16 = 5
|
||||
MS_INT32 = 6
|
||||
MS_UINT32 = 7
|
||||
MS_INT64 = 8
|
||||
MS_UINT64 = 9
|
||||
MS_FLOAT16 = 10
|
||||
MS_FLOAT32 = 11
|
||||
MS_FLOAT64 = 12
|
||||
|
||||
|
||||
|
||||
_PREDICTREQUEST = _descriptor.Descriptor(
|
||||
name='PredictRequest',
|
||||
full_name='ms_serving.PredictRequest',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='data', full_name='ms_serving.PredictRequest.data', index=0,
|
||||
number=1, type=11, cpp_type=10, label=3,
|
||||
has_default_value=False, default_value=[],
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
serialized_options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
serialized_options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=32,
|
||||
serialized_end=82,
|
||||
)
|
||||
|
||||
|
||||
_PREDICTREPLY = _descriptor.Descriptor(
|
||||
name='PredictReply',
|
||||
full_name='ms_serving.PredictReply',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='result', full_name='ms_serving.PredictReply.result', index=0,
|
||||
number=1, type=11, cpp_type=10, label=3,
|
||||
has_default_value=False, default_value=[],
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
serialized_options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
serialized_options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=84,
|
||||
serialized_end=134,
|
||||
)
|
||||
|
||||
|
||||
_TENSORSHAPE = _descriptor.Descriptor(
|
||||
name='TensorShape',
|
||||
full_name='ms_serving.TensorShape',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='dims', full_name='ms_serving.TensorShape.dims', index=0,
|
||||
number=1, type=3, cpp_type=2, label=3,
|
||||
has_default_value=False, default_value=[],
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
serialized_options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
serialized_options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=136,
|
||||
serialized_end=163,
|
||||
)
|
||||
|
||||
|
||||
_TENSOR = _descriptor.Descriptor(
|
||||
name='Tensor',
|
||||
full_name='ms_serving.Tensor',
|
||||
filename=None,
|
||||
file=DESCRIPTOR,
|
||||
containing_type=None,
|
||||
fields=[
|
||||
_descriptor.FieldDescriptor(
|
||||
name='tensor_shape', full_name='ms_serving.Tensor.tensor_shape', index=0,
|
||||
number=1, type=11, cpp_type=10, label=1,
|
||||
has_default_value=False, default_value=None,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
serialized_options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='tensor_type', full_name='ms_serving.Tensor.tensor_type', index=1,
|
||||
number=2, type=14, cpp_type=8, label=1,
|
||||
has_default_value=False, default_value=0,
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
serialized_options=None, file=DESCRIPTOR),
|
||||
_descriptor.FieldDescriptor(
|
||||
name='data', full_name='ms_serving.Tensor.data', index=2,
|
||||
number=3, type=12, cpp_type=9, label=1,
|
||||
has_default_value=False, default_value=b"",
|
||||
message_type=None, enum_type=None, containing_type=None,
|
||||
is_extension=False, extension_scope=None,
|
||||
serialized_options=None, file=DESCRIPTOR),
|
||||
],
|
||||
extensions=[
|
||||
],
|
||||
nested_types=[],
|
||||
enum_types=[
|
||||
],
|
||||
serialized_options=None,
|
||||
is_extendable=False,
|
||||
syntax='proto3',
|
||||
extension_ranges=[],
|
||||
oneofs=[
|
||||
],
|
||||
serialized_start=165,
|
||||
serialized_end=277,
|
||||
)
|
||||
|
||||
_PREDICTREQUEST.fields_by_name['data'].message_type = _TENSOR
|
||||
_PREDICTREPLY.fields_by_name['result'].message_type = _TENSOR
|
||||
_TENSOR.fields_by_name['tensor_shape'].message_type = _TENSORSHAPE
|
||||
_TENSOR.fields_by_name['tensor_type'].enum_type = _DATATYPE
|
||||
DESCRIPTOR.message_types_by_name['PredictRequest'] = _PREDICTREQUEST
|
||||
DESCRIPTOR.message_types_by_name['PredictReply'] = _PREDICTREPLY
|
||||
DESCRIPTOR.message_types_by_name['TensorShape'] = _TENSORSHAPE
|
||||
DESCRIPTOR.message_types_by_name['Tensor'] = _TENSOR
|
||||
DESCRIPTOR.enum_types_by_name['DataType'] = _DATATYPE
|
||||
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
|
||||
|
||||
PredictRequest = _reflection.GeneratedProtocolMessageType('PredictRequest', (_message.Message,), {
|
||||
'DESCRIPTOR' : _PREDICTREQUEST,
|
||||
'__module__' : 'ms_service_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ms_serving.PredictRequest)
|
||||
})
|
||||
_sym_db.RegisterMessage(PredictRequest)
|
||||
|
||||
PredictReply = _reflection.GeneratedProtocolMessageType('PredictReply', (_message.Message,), {
|
||||
'DESCRIPTOR' : _PREDICTREPLY,
|
||||
'__module__' : 'ms_service_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ms_serving.PredictReply)
|
||||
})
|
||||
_sym_db.RegisterMessage(PredictReply)
|
||||
|
||||
TensorShape = _reflection.GeneratedProtocolMessageType('TensorShape', (_message.Message,), {
|
||||
'DESCRIPTOR' : _TENSORSHAPE,
|
||||
'__module__' : 'ms_service_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ms_serving.TensorShape)
|
||||
})
|
||||
_sym_db.RegisterMessage(TensorShape)
|
||||
|
||||
Tensor = _reflection.GeneratedProtocolMessageType('Tensor', (_message.Message,), {
|
||||
'DESCRIPTOR' : _TENSOR,
|
||||
'__module__' : 'ms_service_pb2'
|
||||
# @@protoc_insertion_point(class_scope:ms_serving.Tensor)
|
||||
})
|
||||
_sym_db.RegisterMessage(Tensor)
|
||||
|
||||
|
||||
|
||||
_MSSERVICE = _descriptor.ServiceDescriptor(
|
||||
name='MSService',
|
||||
full_name='ms_serving.MSService',
|
||||
file=DESCRIPTOR,
|
||||
index=0,
|
||||
serialized_options=None,
|
||||
serialized_start=484,
|
||||
serialized_end=626,
|
||||
methods=[
|
||||
_descriptor.MethodDescriptor(
|
||||
name='Predict',
|
||||
full_name='ms_serving.MSService.Predict',
|
||||
index=0,
|
||||
containing_service=None,
|
||||
input_type=_PREDICTREQUEST,
|
||||
output_type=_PREDICTREPLY,
|
||||
serialized_options=None,
|
||||
),
|
||||
_descriptor.MethodDescriptor(
|
||||
name='Test',
|
||||
full_name='ms_serving.MSService.Test',
|
||||
index=1,
|
||||
containing_service=None,
|
||||
input_type=_PREDICTREQUEST,
|
||||
output_type=_PREDICTREPLY,
|
||||
serialized_options=None,
|
||||
),
|
||||
])
|
||||
_sym_db.RegisterServiceDescriptor(_MSSERVICE)
|
||||
|
||||
DESCRIPTOR.services_by_name['MSService'] = _MSSERVICE
|
||||
|
||||
# @@protoc_insertion_point(module_scope)
|
|
@ -1,96 +0,0 @@
|
|||
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
|
||||
import grpc
|
||||
|
||||
import ms_service_pb2 as ms__service__pb2
|
||||
|
||||
|
||||
class MSServiceStub(object):
|
||||
"""Missing associated documentation comment in .proto file"""
|
||||
|
||||
def __init__(self, channel):
|
||||
"""Constructor.
|
||||
|
||||
Args:
|
||||
channel: A grpc.Channel.
|
||||
"""
|
||||
self.Predict = channel.unary_unary(
|
||||
'/ms_serving.MSService/Predict',
|
||||
request_serializer=ms__service__pb2.PredictRequest.SerializeToString,
|
||||
response_deserializer=ms__service__pb2.PredictReply.FromString,
|
||||
)
|
||||
self.Test = channel.unary_unary(
|
||||
'/ms_serving.MSService/Test',
|
||||
request_serializer=ms__service__pb2.PredictRequest.SerializeToString,
|
||||
response_deserializer=ms__service__pb2.PredictReply.FromString,
|
||||
)
|
||||
|
||||
|
||||
class MSServiceServicer(object):
|
||||
"""Missing associated documentation comment in .proto file"""
|
||||
|
||||
def Predict(self, request, context):
|
||||
"""Missing associated documentation comment in .proto file"""
|
||||
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
||||
context.set_details('Method not implemented!')
|
||||
raise NotImplementedError('Method not implemented!')
|
||||
|
||||
def Test(self, request, context):
|
||||
"""Missing associated documentation comment in .proto file"""
|
||||
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
||||
context.set_details('Method not implemented!')
|
||||
raise NotImplementedError('Method not implemented!')
|
||||
|
||||
|
||||
def add_MSServiceServicer_to_server(servicer, server):
|
||||
rpc_method_handlers = {
|
||||
'Predict': grpc.unary_unary_rpc_method_handler(
|
||||
servicer.Predict,
|
||||
request_deserializer=ms__service__pb2.PredictRequest.FromString,
|
||||
response_serializer=ms__service__pb2.PredictReply.SerializeToString,
|
||||
),
|
||||
'Test': grpc.unary_unary_rpc_method_handler(
|
||||
servicer.Test,
|
||||
request_deserializer=ms__service__pb2.PredictRequest.FromString,
|
||||
response_serializer=ms__service__pb2.PredictReply.SerializeToString,
|
||||
),
|
||||
}
|
||||
generic_handler = grpc.method_handlers_generic_handler(
|
||||
'ms_serving.MSService', rpc_method_handlers)
|
||||
server.add_generic_rpc_handlers((generic_handler,))
|
||||
|
||||
|
||||
# This class is part of an EXPERIMENTAL API.
|
||||
class MSService(object):
|
||||
"""Missing associated documentation comment in .proto file"""
|
||||
|
||||
@staticmethod
|
||||
def Predict(request,
|
||||
target,
|
||||
options=(),
|
||||
channel_credentials=None,
|
||||
call_credentials=None,
|
||||
compression=None,
|
||||
wait_for_ready=None,
|
||||
timeout=None,
|
||||
metadata=None):
|
||||
return grpc.experimental.unary_unary(request, target, '/ms_serving.MSService/Predict',
|
||||
ms__service__pb2.PredictRequest.SerializeToString,
|
||||
ms__service__pb2.PredictReply.FromString,
|
||||
options, channel_credentials,
|
||||
call_credentials, compression, wait_for_ready, timeout, metadata)
|
||||
|
||||
@staticmethod
|
||||
def Test(request,
|
||||
target,
|
||||
options=(),
|
||||
channel_credentials=None,
|
||||
call_credentials=None,
|
||||
compression=None,
|
||||
wait_for_ready=None,
|
||||
timeout=None,
|
||||
metadata=None):
|
||||
return grpc.experimental.unary_unary(request, target, '/ms_serving.MSService/Test',
|
||||
ms__service__pb2.PredictRequest.SerializeToString,
|
||||
ms__service__pb2.PredictReply.FromString,
|
||||
options, channel_credentials,
|
||||
call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
@ -1,67 +0,0 @@
|
|||
/**
|
||||
* Copyright 2020 Huawei Technologies Co., Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <grpcpp/grpcpp.h>
|
||||
#include <grpcpp/health_check_service_interface.h>
|
||||
#include <grpcpp/ext/proto_server_reflection_plugin.h>
|
||||
#include <iostream>
|
||||
|
||||
#include "./ms_service.grpc.pb.h"
|
||||
|
||||
using grpc::Server;
|
||||
using grpc::ServerBuilder;
|
||||
using grpc::ServerContext;
|
||||
using grpc::Status;
|
||||
using ms_serving::MSService;
|
||||
using ms_serving::PredictReply;
|
||||
using ms_serving::PredictRequest;
|
||||
|
||||
// Logic and data behind the server's behavior.
|
||||
class MSServiceImpl final : public MSService::Service {
|
||||
Status Predict(ServerContext *context, const PredictRequest *request, PredictReply *reply) override {
|
||||
std::cout << "server eval" << std::endl;
|
||||
return Status::OK;
|
||||
}
|
||||
};
|
||||
|
||||
void RunServer() {
|
||||
std::string server_address("0.0.0.0:50051");
|
||||
MSServiceImpl service;
|
||||
|
||||
grpc::EnableDefaultHealthCheckService(true);
|
||||
grpc::reflection::InitProtoReflectionServerBuilderPlugin();
|
||||
auto option = grpc::MakeChannelArgumentOption(GRPC_ARG_ALLOW_REUSEPORT, 0);
|
||||
|
||||
ServerBuilder builder;
|
||||
builder.SetOption(std::move(option));
|
||||
// Listen on the given address without any authentication mechanism.
|
||||
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
|
||||
// Register "service" as the instance through which we'll communicate with
|
||||
// clients. In this case it corresponds to an *synchronous* service.
|
||||
builder.RegisterService(&service);
|
||||
// Finally assemble the server.
|
||||
std::unique_ptr<Server> server(builder.BuildAndStart());
|
||||
std::cout << "Server listening on " << server_address << std::endl;
|
||||
|
||||
// Wait for the server to shutdown. Note that some other thread must be
|
||||
// responsible for shutting down the server for this call to ever return.
|
||||
server->Wait();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
RunServer();
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
cmake_minimum_required(VERSION 3.5.1)
|
||||
|
||||
project(HelloWorld C CXX)
|
||||
project(MSClient C CXX)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||
add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=0)
|
||||
|
@ -12,17 +12,33 @@ find_package(Threads REQUIRED)
|
|||
|
||||
# Find Protobuf installation
|
||||
# Looks for protobuf-config.cmake file installed by Protobuf's cmake installation.
|
||||
set(protobuf_MODULE_COMPATIBLE TRUE)
|
||||
find_package(Protobuf CONFIG REQUIRED)
|
||||
message(STATUS "Using protobuf ${protobuf_VERSION}")
|
||||
option(GRPC_PATH "set grpc path")
|
||||
if(GRPC_PATH)
|
||||
set(CMAKE_PREFIX_PATH ${GRPC_PATH})
|
||||
set(protobuf_MODULE_COMPATIBLE TRUE)
|
||||
find_package(Protobuf CONFIG REQUIRED)
|
||||
message(STATUS "Using protobuf ${protobuf_VERSION}, CMAKE_PREFIX_PATH : ${CMAKE_PREFIX_PATH}")
|
||||
elseif(NOT GRPC_PATH)
|
||||
if (EXISTS ${grpc_ROOT}/lib64)
|
||||
set(gRPC_DIR "${grpc_ROOT}/lib64/cmake/grpc")
|
||||
elseif(EXISTS ${grpc_ROOT}/lib)
|
||||
set(gRPC_DIR "${grpc_ROOT}/lib/cmake/grpc")
|
||||
endif()
|
||||
add_library(protobuf::libprotobuf ALIAS protobuf::protobuf)
|
||||
add_executable(protobuf::libprotoc ALIAS protobuf::protoc)
|
||||
message(STATUS "serving using grpc_DIR : " ${gRPC_DIR})
|
||||
elseif(NOT gRPC_DIR AND NOT GRPC_PATH)
|
||||
message("please check gRPC. If the client is compiled separately,you can use the command: cmake -D GRPC_PATH=xxx")
|
||||
message("XXX is the gRPC installation path")
|
||||
endif()
|
||||
|
||||
set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
|
||||
set(_REFLECTION gRPC::grpc++_reflection)
|
||||
if (CMAKE_CROSSCOMPILING)
|
||||
find_program(_PROTOBUF_PROTOC protoc)
|
||||
else ()
|
||||
set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
|
||||
endif ()
|
||||
if(CMAKE_CROSSCOMPILING)
|
||||
find_program(_PROTOBUF_PROTOC protoc)
|
||||
else()
|
||||
set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
|
||||
endif()
|
||||
|
||||
# Find gRPC installation
|
||||
# Looks for gRPCConfig.cmake file installed by gRPC's cmake installation.
|
||||
|
@ -30,14 +46,14 @@ find_package(gRPC CONFIG REQUIRED)
|
|||
message(STATUS "Using gRPC ${gRPC_VERSION}")
|
||||
|
||||
set(_GRPC_GRPCPP gRPC::grpc++)
|
||||
if (CMAKE_CROSSCOMPILING)
|
||||
find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
|
||||
else ()
|
||||
set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>)
|
||||
endif ()
|
||||
if(CMAKE_CROSSCOMPILING)
|
||||
find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
|
||||
else()
|
||||
set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>)
|
||||
endif()
|
||||
|
||||
# Proto file
|
||||
get_filename_component(hw_proto "../ms_service.proto" ABSOLUTE)
|
||||
get_filename_component(hw_proto "../../ms_service.proto" ABSOLUTE)
|
||||
get_filename_component(hw_proto_path "${hw_proto}" PATH)
|
||||
|
||||
# Generated sources
|
||||
|
@ -59,13 +75,13 @@ add_custom_command(
|
|||
include_directories("${CMAKE_CURRENT_BINARY_DIR}")
|
||||
|
||||
# Targets greeter_[async_](client|server)
|
||||
foreach (_target
|
||||
ms_client ms_server)
|
||||
add_executable(${_target} "${_target}.cc"
|
||||
${hw_proto_srcs}
|
||||
${hw_grpc_srcs})
|
||||
target_link_libraries(${_target}
|
||||
${_REFLECTION}
|
||||
${_GRPC_GRPCPP}
|
||||
${_PROTOBUF_LIBPROTOBUF})
|
||||
endforeach ()
|
||||
foreach(_target
|
||||
ms_client)
|
||||
add_executable(${_target} "${_target}.cc"
|
||||
${hw_proto_srcs}
|
||||
${hw_grpc_srcs})
|
||||
target_link_libraries(${_target}
|
||||
${_REFLECTION}
|
||||
${_GRPC_GRPCPP}
|
||||
${_PROTOBUF_LIBPROTOBUF})
|
||||
endforeach()
|
|
@ -211,77 +211,12 @@ PredictRequest ReadBertInput() {
|
|||
return request;
|
||||
}
|
||||
|
||||
PredictRequest ReadLenetInput() {
|
||||
size_t size;
|
||||
auto buf = ReadFile("lenet_img.bin", &size);
|
||||
if (buf == nullptr) {
|
||||
std::cout << "read file failed" << std::endl;
|
||||
return PredictRequest();
|
||||
}
|
||||
PredictRequest request;
|
||||
auto cur = buf;
|
||||
if (size > 0) {
|
||||
Tensor data;
|
||||
TensorShape shape;
|
||||
// set type
|
||||
data.set_tensor_type(ms_serving::MS_FLOAT32);
|
||||
|
||||
// set shape
|
||||
shape.add_dims(size / sizeof(float));
|
||||
*data.mutable_tensor_shape() = shape;
|
||||
|
||||
// set data
|
||||
data.set_data(cur, size);
|
||||
*request.add_data() = data;
|
||||
}
|
||||
std::cout << "get input data size " << size << std::endl;
|
||||
return request;
|
||||
}
|
||||
|
||||
PredictRequest ReadOtherInput(const std::string &data_file) {
|
||||
size_t size;
|
||||
auto buf = ReadFile(data_file.c_str(), &size);
|
||||
if (buf == nullptr) {
|
||||
std::cout << "read file failed" << std::endl;
|
||||
return PredictRequest();
|
||||
}
|
||||
PredictRequest request;
|
||||
auto cur = buf;
|
||||
if (size > 0) {
|
||||
Tensor data;
|
||||
TensorShape shape;
|
||||
// set type
|
||||
data.set_tensor_type(ms_serving::MS_FLOAT32);
|
||||
|
||||
// set shape
|
||||
shape.add_dims(size / sizeof(float));
|
||||
*data.mutable_tensor_shape() = shape;
|
||||
|
||||
// set data
|
||||
data.set_data(cur, size);
|
||||
*request.add_data() = data;
|
||||
}
|
||||
std::cout << "get input data size " << size << std::endl;
|
||||
return request;
|
||||
}
|
||||
|
||||
template <class DT>
|
||||
void print_array_item(const DT *data, size_t size) {
|
||||
for (size_t i = 0; i < size && i < 100; i++) {
|
||||
std::cout << data[i] << '\t';
|
||||
if ((i + 1) % 10 == 0) {
|
||||
std::cout << std::endl;
|
||||
}
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
class MSClient {
|
||||
public:
|
||||
explicit MSClient(std::shared_ptr<Channel> channel) : stub_(MSService::NewStub(channel)) {}
|
||||
~MSClient() = default;
|
||||
|
||||
std::string Predict(const std::string &type, const std::string &data_file) {
|
||||
std::string Predict(const std::string &type) {
|
||||
// Data we are sending to the server.
|
||||
PredictRequest request;
|
||||
if (type == "add") {
|
||||
|
@ -299,10 +234,6 @@ class MSClient {
|
|||
*request.add_data() = data;
|
||||
} else if (type == "bert") {
|
||||
request = ReadBertInput();
|
||||
} else if (type == "lenet") {
|
||||
request = ReadLenetInput();
|
||||
} else if (type == "other") {
|
||||
request = ReadOtherInput(data_file);
|
||||
} else {
|
||||
std::cout << "type only support bert or add, but input is " << type << std::endl;
|
||||
}
|
||||
|
@ -325,20 +256,6 @@ class MSClient {
|
|||
|
||||
// Act upon its status.
|
||||
if (status.ok()) {
|
||||
for (size_t i = 0; i < reply.result_size(); i++) {
|
||||
auto result = reply.result(i);
|
||||
if (result.tensor_type() == ms_serving::DataType::MS_FLOAT32) {
|
||||
print_array_item(reinterpret_cast<const float *>(result.data().data()), result.data().size() / sizeof(float));
|
||||
} else if (result.tensor_type() == ms_serving::DataType::MS_INT32) {
|
||||
print_array_item(reinterpret_cast<const int32_t *>(result.data().data()),
|
||||
result.data().size() / sizeof(int32_t));
|
||||
} else if (result.tensor_type() == ms_serving::DataType::MS_UINT32) {
|
||||
print_array_item(reinterpret_cast<const uint32_t *>(result.data().data()),
|
||||
result.data().size() / sizeof(uint32_t));
|
||||
} else {
|
||||
std::cout << "output datatype " << result.tensor_type() << std::endl;
|
||||
}
|
||||
}
|
||||
return "RPC OK";
|
||||
} else {
|
||||
std::cout << status.error_code() << ": " << status.error_message() << std::endl;
|
||||
|
@ -360,8 +277,6 @@ int main(int argc, char **argv) {
|
|||
std::string arg_target_str("--target");
|
||||
std::string type;
|
||||
std::string arg_type_str("--type");
|
||||
std::string arg_data_str("--data");
|
||||
std::string data = "default_data.bin";
|
||||
if (argc > 2) {
|
||||
{
|
||||
// parse target
|
||||
|
@ -389,33 +304,19 @@ int main(int argc, char **argv) {
|
|||
if (arg_val2[start_pos] == '=') {
|
||||
type = arg_val2.substr(start_pos + 1);
|
||||
} else {
|
||||
std::cout << "The only correct argument syntax is --type=" << std::endl;
|
||||
std::cout << "The only correct argument syntax is --target=" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
type = "add";
|
||||
}
|
||||
}
|
||||
if (argc > 3) {
|
||||
// parse type
|
||||
std::string arg_val3 = argv[3];
|
||||
size_t start_pos = arg_val3.find(arg_data_str);
|
||||
if (start_pos != std::string::npos) {
|
||||
start_pos += arg_data_str.size();
|
||||
if (arg_val3[start_pos] == '=') {
|
||||
data = arg_val3.substr(start_pos + 1);
|
||||
} else {
|
||||
std::cout << "The only correct argument syntax is --data=" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
target_str = "localhost:5500";
|
||||
type = "add";
|
||||
}
|
||||
MSClient client(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
|
||||
std::string reply = client.Predict(type, data);
|
||||
std::string reply = client.Predict(type);
|
||||
std::cout << "client received: " << reply << std::endl;
|
||||
|
||||
return 0;
|
|
@ -0,0 +1,46 @@
|
|||
# Copyright 2020 Huawei Technologies Co., Ltd
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ============================================================================
|
||||
import numpy as np
|
||||
|
||||
import mindspore.context as context
|
||||
import mindspore.nn as nn
|
||||
from mindspore.ops import operations as P
|
||||
from mindspore import Tensor
|
||||
from mindspore.train.serialization import export
|
||||
|
||||
context.set_context(mode=context.GRAPH_MODE, device_target="Ascend")
|
||||
|
||||
class Net(nn.Cell):
|
||||
def __init__(self):
|
||||
super(Net, self).__init__()
|
||||
self.add = P.TensorAdd()
|
||||
|
||||
def construct(self, x_, y_):
|
||||
return self.add(x_, y_)
|
||||
|
||||
x = np.ones(4).astype(np.float32)
|
||||
y = np.ones(4).astype(np.float32)
|
||||
|
||||
def export_net():
|
||||
add = Net()
|
||||
output = add(Tensor(x), Tensor(y))
|
||||
export(add, Tensor(x), Tensor(y), file_name='tensor_add.pb', file_format='BINARY')
|
||||
print(x)
|
||||
print(y)
|
||||
print(output.asnumpy())
|
||||
|
||||
if __name__ == "__main__":
|
||||
export_net()
|
||||
|
|
@ -19,28 +19,25 @@ import ms_service_pb2_grpc
|
|||
|
||||
|
||||
def run():
|
||||
channel = grpc.insecure_channel('localhost:50051')
|
||||
channel = grpc.insecure_channel('localhost:5050')
|
||||
stub = ms_service_pb2_grpc.MSServiceStub(channel)
|
||||
# request = ms_service_pb2.EvalRequest()
|
||||
# request.name = 'haha'
|
||||
# response = stub.Eval(request)
|
||||
# print("ms client received: " + response.message)
|
||||
|
||||
request = ms_service_pb2.PredictRequest()
|
||||
request.data.tensor_shape.dims.extend([32, 1, 32, 32])
|
||||
request.data.tensor_type = ms_service_pb2.MS_FLOAT32
|
||||
request.data.data = (np.ones([32, 1, 32, 32]).astype(np.float32) * 0.01).tobytes()
|
||||
|
||||
request.label.tensor_shape.dims.extend([32])
|
||||
request.label.tensor_type = ms_service_pb2.MS_INT32
|
||||
request.label.data = np.ones([32]).astype(np.int32).tobytes()
|
||||
|
||||
result = stub.Test(request)
|
||||
#result_np = np.frombuffer(result.result.data, dtype=np.float32).reshape(result.result.tensor_shape.dims)
|
||||
print("ms client test call received: ")
|
||||
#print(result_np)
|
||||
x = request.data.add()
|
||||
x.tensor_shape.dims.extend([4])
|
||||
x.tensor_type = ms_service_pb2.MS_FLOAT32
|
||||
x.data = (np.ones([4]).astype(np.float32)).tobytes()
|
||||
|
||||
y = request.data.add()
|
||||
y.tensor_shape.dims.extend([4])
|
||||
y.tensor_type = ms_service_pb2.MS_FLOAT32
|
||||
y.data = (np.ones([4]).astype(np.float32)).tobytes()
|
||||
|
||||
result = stub.Predict(request)
|
||||
print(result)
|
||||
result_np = np.frombuffer(result.result[0].data, dtype=np.float32).reshape(result.result[0].tensor_shape.dims)
|
||||
print("ms client received: ")
|
||||
print(result_np)
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
|
@ -1,57 +0,0 @@
|
|||
# Copyright 2020 Huawei Technologies Co., Ltd
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ============================================================================
|
||||
import grpc
|
||||
import numpy as np
|
||||
import ms_service_pb2
|
||||
import ms_service_pb2_grpc
|
||||
|
||||
|
||||
def run():
|
||||
channel = grpc.insecure_channel('localhost:50051')
|
||||
stub = ms_service_pb2_grpc.MSServiceStub(channel)
|
||||
# request = ms_service_pb2.PredictRequest()
|
||||
# request.name = 'haha'
|
||||
# response = stub.Eval(request)
|
||||
# print("ms client received: " + response.message)
|
||||
|
||||
request = ms_service_pb2.PredictRequest()
|
||||
request.data.tensor_shape.dims.extend([32, 1, 32, 32])
|
||||
request.data.tensor_type = ms_service_pb2.MS_FLOAT32
|
||||
request.data.data = (np.ones([32, 1, 32, 32]).astype(np.float32) * 0.01).tobytes()
|
||||
|
||||
request.label.tensor_shape.dims.extend([32])
|
||||
request.label.tensor_type = ms_service_pb2.MS_INT32
|
||||
request.label.data = np.ones([32]).astype(np.int32).tobytes()
|
||||
|
||||
result = stub.Predict(request)
|
||||
#result_np = np.frombuffer(result.result.data, dtype=np.float32).reshape(result.result.tensor_shape.dims)
|
||||
print("ms client received: ")
|
||||
#print(result_np)
|
||||
|
||||
# future_list = []
|
||||
# times = 1000
|
||||
# for i in range(times):
|
||||
# async_future = stub.Eval.future(request)
|
||||
# future_list.append(async_future)
|
||||
# print("async call, future list add item " + str(i));
|
||||
#
|
||||
# for i in range(len(future_list)):
|
||||
# async_result = future_list[i].result()
|
||||
# print("ms client async get result of item " + str(i))
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
|
@ -1,55 +0,0 @@
|
|||
# Copyright 2020 Huawei Technologies Co., Ltd
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ============================================================================
|
||||
from concurrent import futures
|
||||
import time
|
||||
import grpc
|
||||
import numpy as np
|
||||
import ms_service_pb2
|
||||
import ms_service_pb2_grpc
|
||||
import test_cpu_lenet
|
||||
from mindspore import Tensor
|
||||
|
||||
class MSService(ms_service_pb2_grpc.MSServiceServicer):
|
||||
def Predict(self, request, context):
|
||||
request_data = request.data
|
||||
request_label = request.label
|
||||
|
||||
data_from_buffer = np.frombuffer(request_data.data, dtype=np.float32)
|
||||
data_from_buffer = data_from_buffer.reshape(request_data.tensor_shape.dims)
|
||||
data = Tensor(data_from_buffer)
|
||||
|
||||
label_from_buffer = np.frombuffer(request_label.data, dtype=np.int32)
|
||||
label_from_buffer = label_from_buffer.reshape(request_label.tensor_shape.dims)
|
||||
label = Tensor(label_from_buffer)
|
||||
|
||||
result = test_cpu_lenet.test_lenet(data, label)
|
||||
result_reply = ms_service_pb2.PredictReply()
|
||||
result_reply.result.tensor_shape.dims.extend(result.shape())
|
||||
result_reply.result.data = result.asnumpy().tobytes()
|
||||
return result_reply
|
||||
|
||||
def serve():
|
||||
server = grpc.server(futures.ThreadPoolExecutor(max_workers=1))
|
||||
ms_service_pb2_grpc.add_MSServiceServicer_to_server(MSService(), server)
|
||||
server.add_insecure_port('[::]:50051')
|
||||
server.start()
|
||||
try:
|
||||
while True:
|
||||
time.sleep(60*60*24) # one day in seconds
|
||||
except KeyboardInterrupt:
|
||||
server.stop(0)
|
||||
|
||||
if __name__ == '__main__':
|
||||
serve()
|
|
@ -1,91 +0,0 @@
|
|||
# Copyright 2019 Huawei Technologies Co., Ltd
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ============================================================================
|
||||
import numpy as np
|
||||
import mindspore.context as context
|
||||
import mindspore.nn as nn
|
||||
from mindspore import Tensor
|
||||
from mindspore.nn import TrainOneStepCell, WithLossCell
|
||||
from mindspore.nn.optim import Momentum
|
||||
from mindspore.ops import operations as P
|
||||
import ms_service_pb2
|
||||
|
||||
|
||||
class LeNet(nn.Cell):
|
||||
def __init__(self):
|
||||
super(LeNet, self).__init__()
|
||||
self.relu = P.ReLU()
|
||||
self.batch_size = 32
|
||||
|
||||
self.conv1 = nn.Conv2d(1, 6, kernel_size=5, stride=1, padding=0, has_bias=False, pad_mode='valid')
|
||||
self.conv2 = nn.Conv2d(6, 16, kernel_size=5, stride=1, padding=0, has_bias=False, pad_mode='valid')
|
||||
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
|
||||
self.reshape = P.Reshape()
|
||||
self.fc1 = nn.Dense(400, 120)
|
||||
self.fc2 = nn.Dense(120, 84)
|
||||
self.fc3 = nn.Dense(84, 10)
|
||||
|
||||
def construct(self, input_x):
|
||||
output = self.conv1(input_x)
|
||||
output = self.relu(output)
|
||||
output = self.pool(output)
|
||||
output = self.conv2(output)
|
||||
output = self.relu(output)
|
||||
output = self.pool(output)
|
||||
output = self.reshape(output, (self.batch_size, -1))
|
||||
output = self.fc1(output)
|
||||
output = self.relu(output)
|
||||
output = self.fc2(output)
|
||||
output = self.relu(output)
|
||||
output = self.fc3(output)
|
||||
return output
|
||||
|
||||
|
||||
def train(net, data, label):
|
||||
learning_rate = 0.01
|
||||
momentum = 0.9
|
||||
|
||||
optimizer = Momentum(filter(lambda x: x.requires_grad, net.get_parameters()), learning_rate, momentum)
|
||||
criterion = nn.SoftmaxCrossEntropyWithLogits(is_grad=False, sparse=True)
|
||||
net_with_criterion = WithLossCell(net, criterion)
|
||||
train_network = TrainOneStepCell(net_with_criterion, optimizer) # optimizer
|
||||
train_network.set_train()
|
||||
res = train_network(data, label)
|
||||
print("+++++++++Loss+++++++++++++")
|
||||
print(res)
|
||||
print("+++++++++++++++++++++++++++")
|
||||
assert res
|
||||
return res
|
||||
|
||||
def test_lenet(data, label):
|
||||
context.set_context(mode=context.GRAPH_MODE, device_target="CPU")
|
||||
net = LeNet()
|
||||
return train(net, data, label)
|
||||
|
||||
if __name__ == '__main__':
|
||||
tensor = ms_service_pb2.Tensor()
|
||||
tensor.tensor_shape.dim.extend([32, 1, 32, 32])
|
||||
# tensor.tensor_shape.dim.add() = 1
|
||||
# tensor.tensor_shape.dim.add() = 32
|
||||
# tensor.tensor_shape.dim.add() = 32
|
||||
tensor.tensor_type = ms_service_pb2.MS_FLOAT32
|
||||
tensor.data = np.ones([32, 1, 32, 32]).astype(np.float32).tobytes()
|
||||
|
||||
data_from_buffer = np.frombuffer(tensor.data, dtype=np.float32)
|
||||
print(tensor.tensor_shape.dim)
|
||||
data_from_buffer = data_from_buffer.reshape(tensor.tensor_shape.dim)
|
||||
print(data_from_buffer.shape)
|
||||
input_data = Tensor(data_from_buffer * 0.01)
|
||||
input_label = Tensor(np.ones([32]).astype(np.int32))
|
||||
test_lenet(input_data, input_label)
|
Loading…
Reference in New Issue