diff --git a/README.md b/README.md index 5ba660971efae976629f9198d0fa8bc6261fe8b4..2171280055ebb6b1fa3c5b44fc24212356b9e0ef 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,107 @@ -# 概述 -PaddlePaddle是百度开源的机器学习框架,广泛支持各种深度学习模型的定制化开发; Paddle serving是PaddlePaddle的在线预估服务框架,通过加载PaddlePaddle训练得到的模型,利用PaddlePaddle的预测库,提供机器学习预测云服务。 +# Paddle Serving +Paddle Serving是PaddlePaddle的在线预估服务框架,能够帮助开发者轻松实现从移动端、服务器端调用深度学习模型的远程预测服务。当前Paddle Serving以支持PaddlePaddle训练的模型为主,可以与Paddle训练框架联合使用,快速部署预估服务。 -# 文档 +# 客户端快速上手 +Paddle Serving当前的develop版本支持轻量级Python API进行快速预测,我们假设远程已经部署的Paddle Serving的文本分类模型,您可以在自己的服务器快速安装客户端并进行快速预测。 -[设计文档](doc/DESIGN.md) +## 客户端安装 +``` +pip install paddle-serving-client +``` -[从零开始写一个预测服务](doc/CREATING.md) +## 训练过程中保存Serving的配置 +``` +import os +import sys +import paddle +import logging +import paddle.fluid as fluid +import paddle_serving as serving + +logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s') +logger = logging.getLogger("fluid") +logger.setLevel(logging.INFO) + +def load_vocab(filename): + vocab = {} + with open(filename) as f: + wid = 0 + for line in f: + vocab[line.strip()] = wid + wid += 1 + vocab[""] = len(vocab) + return vocab + +if __name__ == "__main__": + vocab = load_vocab('imdb.vocab') + dict_dim = len(vocab) + + data = fluid.layers.data(name="words", shape=[1], dtype="int64", lod_level=1) + label = fluid.layers.data(name="label", shape=[1], dtype="int64") + + dataset = fluid.DatasetFactory().create_dataset() + filelist = ["train_data/%s" % x for x in os.listdir("train_data")] + dataset.set_use_var([data, label]) + pipe_command = "python imdb_reader.py" + dataset.set_pipe_command(pipe_command) + dataset.set_batch_size(4) + dataset.set_filelist(filelist) + dataset.set_thread(10) + from nets import cnn_net + avg_cost, acc, prediction = cnn_net(data, label, dict_dim) + optimizer = fluid.optimizer.SGD(learning_rate=0.01) + optimizer.minimize(avg_cost) + + exe = fluid.Executor(fluid.CPUPlace()) + exe.run(fluid.default_startup_program()) + epochs = 30 + save_dirname = "cnn_model" + + for i in range(epochs): + exe.train_from_dataset(program=fluid.default_main_program(), + dataset=dataset, debug=False) + logger.info("TRAIN --> pass: {}".format(i)) + fluid.io.save_inference_model("%s/epoch%d.model" % (save_dirname, i), + [data.name, label.name], [acc], exe) + serving.save_model("%s/epoch%d.model" % (save_dirname, i), "client_config{}".format(i), + {"words": data, "label": label}, + {"acc": acc, "cost": avg_cost, "prediction": prediction}) +``` -[编译安装](doc/INSTALL.md) +## 启动服务 +TBA -[FAQ](doc/FAQ.md) +## 客户端访问 +``` python +from paddle_serving import Client +import sys +client = Client() +client.load_client_config(sys.argv[1]) +client.connect(["127.0.0.1:9292"]) -# 框架简介 +for line in sys.stdin: + group = line.strip().split() + words = [int(x) for x in group[1:int(group[0])]] + label = [int(group[-1])] + feed = {"words": words, "label": label} + fetch = ["acc", "cost", "prediction"] + fetch_map = client.predict(feed=feed, fetch=fetch) + print("{} {}".format(fetch_map["prediction"][1], label[0])) -![图片](doc/architecture.png) +``` -## 主要功能 -Paddle serving框架为策略工程师提供以下三层面的功能性扩展: +## 完成操作截屏 +TBA -### 模型 -- 预测引擎:集成PaddlePaddle深度学习框架的预测Lib; -- 模型种类:支持Paddle Fluid模型格式; -- 用户接口:支持模型加载、重载的配置化驱动,不同种类模型的预测接口完全一致; -- 模型调度:支持基于异步线程模型的多模型预估调度,实现异构资源的优先级调度; +# 文档 -### 业务 -- 预测流程:通过有限DAG图描述一次预测从Request到Response的业务流程,节点Node是一个最小逻辑单元——OP; -- 预测逻辑:框架封装常用预处理、预测计算、后处理等常用OP,用户通过自定义OP算子实现特化处理逻辑; +[设计文档](doc/DESIGN.md) -### 服务 +[从零开始写一个预测服务](doc/CREATING.md) -- RPC:底层通过Baidu-rpc封装网络交互,Server端可配置化启动多个独立Service,框架会搜集Service粒度的详细业务指标,并按照BVar接口对接到Noah等监控平台; -- SDK:基于Baidu-rpc的client进行封装,提供多下游连接管理、可扩展路由策略、可定制参数实验、自动分包等机制,支持同步、半同步、纯异步等交互模式,以及多种兼容协议,所有连接策略均通过配置驱动 +[编译安装](doc/INSTALL.md) -# 目录结构 +[FAQ](doc/FAQ.md) -``` -. -|-- cmake # CMake文件 -| |-- external -| `-- patch -|-- configure # Configure模块; Paddle Serving使用Protobuf格式的配置语言 -| |-- include -| |-- proto -| |-- src -| `-- tests -|-- demo-client # Client端示例;包括如文本分类、图像分类等任务的例子 -| |-- conf # Client示例的conf目录 -| |-- data # Client示例的data目录 -| | \-- images -| `-- src # Client示例的src目录 -|-- demo-serving # Serving示例。该目录下代码与libpdserving.a联编,产出一个可执行的serving二进制 -| |-- conf # Serving示例的Conf目录 -| |-- data # Serving示例的data目录 -| | `-- model -| | `-- paddle -| | `-- fluid -| | |-- SE_ResNeXt50_32x4d -| | `-- text_classification_lstm -| |-- op # Serving示例OP -| |-- proto # Serving示例的proto文件 -| `-- scripts -|-- doc # 文档 -|-- inferencer-fluid-cpu # 与PaddlePaddle CPU预测库的接口代码 -| |-- include -| `-- src -|-- pdcodegen # pdcodegen插件;请用此插件编译用户定义的服务接口描述protobuf文件 -| |-- plugin -| `-- src -|-- predictor # Serving端库: libpdserving.a -| |-- common -| |-- conf -| |-- cts -| | `-- lib -| |-- framework -| |-- mempool -| |-- op -| |-- proto -| |-- scripts -| | `-- images -| |-- src -| `-- unittest -|-- sdk-cpp # Client端库: libpdsdk-cpp.a -| |-- include -| |-- plugin -| |-- proto -| `-- src -`-- tools # CI工具 - `-- codestyle -```