Всем привет, я Ху.
Я давно не обновлял 100-дневную серию машинного обучения. Недавно я смотрел на фреймворк с открытым исходным кодом, который полезен для gRPC. Его можно использовать для развертывания моделей машинного обучения и для разработки Фреймворки глубокого обучения Побочная история машинного обучения.
gRPC (удаленный вызов процедур)
Разработанный Google, gRPC — это независимый от языка и платформы фреймворк RPC с открытым исходным кодом.
RPC (удаленный вызов процедур) — это удаленный вызов процедур, представляющий собой протокол, который запрашивает услуги у удаленной компьютерной программы через сеть, не зная базовой сетевой технологии. При использовании клиентская сторона вызывает интерфейс, предоставленный серверной стороной, точно так же, как вызов локальной функции.
Например: есть два сервера A и B. Приложение развернуто на сервере A. Если вы хотите вызвать функцию/метод, предоставленный приложением на сервере B, его нельзя вызвать напрямую, поскольку оно не находится в том же пространстве памяти. , Семантика и Передает данные для вызова.
RPC больше похож на идею или механизм, и существует множество способов его реализации.Помимо gRPC, есть Dubbo от Alibaba, Thrift от Facebook, Finagle от Twitter и т. д.
gRPC основан на следующих идеях: определяет службу, указывая ее методы (включая параметры и возвращаемые типы), которые можно вызывать удаленно. Реализуйте этот интерфейс на стороне сервера и запустите сервер gRPC для обработки клиентских вызовов. Наличие заглушки на стороне клиента может действовать как метод на стороне сервера. Вы можете легко создать сервер gRPC на C++ и клиентов на Go, Python, Ruby.
Protocbuf на рисунке выше — это инструмент сериализации данных для gRPC.Использование Protobuf для сериализации данных в потоки двоичных данных может быть написано на разных языках (proto3 поддерживает C++, Java, Python, Go, Ruby, Objective-C, C#). И приложения, работающие на разных платформах, обмениваются данными. ps: Protocbuf также является открытым исходным кодом Google.
Protocol Buffer официально предоставляет инструменты компиляции для компиляции прото-файлов и создания файлов кода, связанных с языком, что может значительно снизить нагрузку на кодирование. Для протокола сериализации пользователю нужно обратить внимание только на сам бизнес-объект, то есть на определение idl, а код сериализации и десериализации должен быть сгенерирован только инструментом.
Подробный экземпляр gRPC — развертывание модели машинного обучения
Перед запуском инстанса необходимо установить gRPC и сопутствующие инструменты.
pip install -U grpcio
pip install -U grpcio-tools
pip install -U protobuf
Использование GRPC обычно включает в себя следующие шаги:
- Определение интерфейсов и типов данных через protobuf
- Написать серверный код gRPC
- Написать клиентский код gRPC
Возьмем в качестве примера набор данных Iris.На стороне сервера gRPC развертывается классификатор случайного леса, а на стороне клиента инициируется запрос на прогнозирование типа радужной оболочки.
0. Обучите модель классификации случайного леса и сохраните обученную модель в виде pkl-файла.
# train_model.py
from sklearn import datasets
from sklearn.pipeline import Pipeline
import joblib
from sklearn.ensemble import RandomForestClassifier
def main():
clf = RandomForestClassifier()
p = Pipeline([('clf', clf)])
p.fit(X, y)
filename_p = 'IrisClassifier.pkl'
joblib.dump(p, filename_p)
print('Model saved!')
if __name__ == "__main__":
iris = datasets.load_iris()
X, y = iris.data, iris.target
main()
1. Определить интерфейсы и типы данных через protobuf
Создайте новый файл iris_demo.proto.
syntax = "proto3";
package iris;
message IrisPredictRequest {// 定义参数1
float sepal_length = 1;//参数字段1
float sepal_width = 2;//参数字段2
float petal_length = 3;//参数字段3
float petal_width = 4;//参数字段4
}
message IrisPredictResponse {// 定义参数1
int32 species = 1;
}
service IrisPredictor{// 定义服务
rpc predict_iris_species(IrisPredictRequest) returns (IrisPredictResponse){}
}
Формат файла proto обычно состоит из трех частей:
- Синтаксис в заголовке указывает на то, что номер версии — «proto3», что должно быть написано без причины.
- Среднее сообщение определяет параметры IrisPredictRequest и IrisPredictResponse метода predict_iris_species, а также тип поля параметра.
- Служба в конце определяет службу IrisPredictor, которая включает в себя метод RPC Predict_iris_species. Здесь могут быть определены несколько методов RPC, и соответствующие параметры могут быть определены в сообщении.
2. Используйте gRPC protobuf для создания библиотечных функций Python.
python -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. ./iris_demo.proto
в:
-I указывает путь к исходному файлу
--python_out, укажите выходной путь xxx_pb2.py, если вы используете другие языки, используйте опцию соответствующего языка
--grpc_python_out указывает выходной путь файла xxx_pb2_grpc.py
--*.proto — это компилируемый прото-файл.
После успешной операции будут автоматически сгенерированы iris_demo_pb2.py (с классом сериализации сообщений в нем) и iris_demo_pb2_grpc.py (включая серверный класс Stub и клиентский класс Stub, а также реализуемый сервисный RPC-интерфейс). Нам не нужно заботиться о деталях этих двух файлов py, просто о том, как вызывать их на сервере и клиенте.
В этом примере мы будем использовать следующий метод:
xxx_pb2.py
├── xxx_pb2.IrisPredictRequest для входящих данных объектов
├── xxx_pb2.IrisPredictResponse для предсказания
xxxx_pb2_grpc.py
├── Класс-заглушка сервера xxx_pb2_grpc.IrisPredictorServicer
├── xxx_pb2_grpc.IrisPredictorStub клиентский класс-заглушка
3. Написать сервер
Суть здесь в том, чтобы определить метод predict_iris_species класса IrisPredictor, а затем добавить IrisPredictor на сервер с помощью метода add_IrisPredictorServicer_to_server в iris_demo_pb2_grpc.py. Функция serve определяет, как работает gRPC, используя пул потоков из 4 рабочих процессов.
# iris_prediction_server.py
import grpc
from concurrent import futures
import time
import joblib
import iris_demo_pb2
import iris_demo_pb2_grpc
import predict_iris
from sklearn.ensemble import RandomForestClassifier
class IrisPredictor(iris_demo_pb2_grpc.IrisPredictorServicer):
@classmethod
def get_trained_model(cls):
cls._model = joblib.load('IrisClassifier.pkl')
return cls._model
def predict_iris_species(self, request, context):
model = self.__class__.get_trained_model()
sepal_length = request.sepal_length
sepal_width = request.sepal_width
petal_length = request.petal_length
petal_width = request.petal_width
result = model.predict(
[[sepal_length, sepal_width, petal_length, petal_width]])
response = iris_demo_pb2.IrisPredictResponse(species=result[0])
return response # not sure
def run():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
iris_demo_pb2_grpc.add_IrisPredictorServicer_to_server(
IrisPredictor(), server)
server.add_insecure_port('[::]:50055')
server.start()
print("grpc server start...")
print("Listening on port 50055")
server.wait_for_termination()
if __name__ == '__main__':
run()
4. Написать клиент
Логический клиент проще, даже на сервисе gRPC, а потом инициировать вызовы.
# iris_prediction_client.py
import grpc
import iris_demo_pb2
import iris_demo_pb2_grpc
def run():
channel = grpc.insecure_channel('localhost:50055')
stub = iris_demo_pb2_grpc.IrisPredictorStub(channel)
request = iris_demo_pb2.IrisPredictRequest(
sepal_length=6.7,
sepal_width=3.0,
petal_length=5.2,
petal_width=2.3)
response = stub.predict_iris_species(request)
print('The prediction is :', response.species)
if __name__ == '__main__':
run()
5. Вызов RPC
Сначала запустите сервер
$ python iris_prediction_server.py
Другой терминал выполняет клиентский код и вызывает службу gRPC.Результаты следующие:
$ python iris_prediction_client.py
referance
grpc.io/
doc.oschina.net/
zhuanlan.zhihu.com/p/148139089
вау-я это ка wow.medium.com/machine- аааа…