Машинное обучение за 100 дней: модель обучена, что дальше?

машинное обучение

Всем привет, я Ху.

Я давно не обновлял 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, а код сериализации и десериализации должен быть сгенерирован только инструментом.

ProtoBuf 协议的工作流程

Подробный экземпляр 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- аааа…