diff --git a/doc/HOT_LOADING_IN_SERVING_CN.md b/doc/HOT_LOADING_IN_SERVING_CN.md
index 448e1a8bbaef559ff6372683ecdf7a3e645aba9d..7aa99351a9b2879d0d74a9bf45adfb9920efadba 100644
--- a/doc/HOT_LOADING_IN_SERVING_CN.md
+++ b/doc/HOT_LOADING_IN_SERVING_CN.md
@@ -13,17 +13,18 @@ Paddle Serving目前支持下面几种类型的远端监控Monitor:
| FTP | 远端为FTP,可以通过用户名、密码访问 | `ftp_host` FTP host
`ftp_port` FTP port
`ftp_username` FTP username,默认为空
`ftp_password` FTP password,默认为空 |
| AFS | 远端为AFS,通过Hadoop-client执行相关命令 | `hadoop_bin` Hadoop二进制的路径
`hadoop_host` AFS host,默认为空
`hadoop_ugi` AFS ugi,默认为空 |
-| Monitor通用选项 | 描述 |
-| :--------------------: | :----------------------------------------------------------: |
-| `type` | 指定Monitor类型 |
-| `remote_path` | 指定远端的基础路径 |
-| `remote_model_name` | 指定远端需要拉取的模型名 |
-| `remote_donefile_name` | 指定远端标志模型更新完毕的donefile文件名 |
-| `local_path` | 指定本地工作路径 |
-| `local_model_name` | 指定本地模型名 |
-| `local_timestamp_file` | 指定本地用于热加载的时间戳文件,该文件被认为在`local_path/local_model_name`下。默认为`fluid_time_file` |
-| `local_tmp_path` | 指定本地存放临时文件的文件夹路径。默认为`_serving_monitor_tmp`,若不存在则自动创建 |
-| `interval` | 指定轮询间隔时间 |
+| Monitor通用选项 | 描述 | 默认值 |
+| :--------------------: | :----------------------------------------------------------: | :------------------------------------------: |
+| `type` | 指定Monitor类型 | 无 |
+| `remote_path` | 指定远端的基础路径 | 无 |
+| `remote_model_name` | 指定远端需要拉取的模型名 | 无 |
+| `remote_donefile_name` | 指定远端标志模型更新完毕的donefile文件名 | 无 |
+| `local_path` | 指定本地工作路径 | 无 |
+| `local_model_name` | 指定本地模型名 | 无 |
+| `local_timestamp_file` | 指定本地用于热加载的时间戳文件,该文件被认为在`local_path/local_model_name`下。 | `fluid_time_file` |
+| `local_tmp_path` | 指定本地存放临时文件的文件夹路径。 | `_serving_monitor_tmp`(若不存在则自动创建) |
+| `interval` | 指定轮询间隔时间。 | 10(秒) |
+| `unpacked_filename` | Monitor支持tarfile打包的远程模型。如果远程模型是打包格式,则需要设置该选项来告知Monitor解压后的文件名。 | None |
下面通过HDFSMonitor示例来展示Paddle Serving的模型热加载功能。
@@ -43,7 +44,9 @@ Paddle Serving目前支持下面几种类型的远端监控Monitor:
```python
import os
+import sys
import time
+import tarfile
import paddle
import paddle.fluid as fluid
import paddle_serving_client.io as serving_io
@@ -73,22 +76,38 @@ exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
def push_to_hdfs(local_file_path, remote_path):
- hdfs_bin = 'hdfs'
+ hdfs_bin = '/hadoop-3.1.2/bin/hdfs'
os.system('{} dfs -put -f {} {}'.format(
hdfs_bin, local_file_path, remote_path))
+name = "uci_housing"
for pass_id in range(30):
for data_train in train_reader():
avg_loss_value, = exe.run(fluid.default_main_program(),
feed=feeder.feed(data_train),
fetch_list=[avg_loss])
- time.sleep(60) # Simulate the production model every other period of time
- serving_io.save_model("uci_housing_model", "uci_housing_client",
+ # Simulate the production model every other period of time
+ time.sleep(60)
+ model_name = "{}_model".format(name)
+ client_name = "{}_client".format(name)
+ serving_io.save_model(model_name, client_name,
{"x": x}, {"price": y_predict},
fluid.default_main_program())
- push_to_hdfs('uci_housing_model', '/')
- os.system('touch donefile')
- push_to_hdfs('donefile', '/')
+ # Package model
+ tar_name = "{}.tar.gz".format(name)
+ tar = tarfile.open(tar_name, 'w:gz')
+ tar.add(model_name)
+ tar.close()
+
+ # Push packaged model file to hdfs
+ push_to_hdfs(tar_name, '/')
+
+ # Generate donefile
+ donefile_name = 'donefile'
+ os.system('touch {}'.format(donefile_name))
+
+ # Push donefile to hdfs
+ push_to_hdfs(donefile_name, '/')
```
hdfs上的文件如下列所示:
@@ -96,8 +115,8 @@ hdfs上的文件如下列所示:
```bash
# hdfs dfs -ls /
Found 2 items
--rw-r--r-- 1 root supergroup 0 2020-03-30 09:27 /donefile
-drwxr-xr-x - root supergroup 0 2020-03-30 09:27 /uci_housing_model
+-rw-r--r-- 1 root supergroup 0 2020-04-02 02:54 /donefile
+-rw-r--r-- 1 root supergroup 2101 2020-04-02 02:54 /uci_housing.tar.gz
```
### 服务端加载模型
@@ -126,9 +145,10 @@ python -m paddle_serving_server.serve --model uci_housing_model --thread 10 --po
```shell
python -m paddle_serving_server.monitor \
--type='hdfs' --hdfs_bin='/hadoop-3.1.2/bin/hdfs' --remote_path='/' \
---remote_model_name='uci_housing_model' --remote_donefile_name='donefile' \
+--remote_model_name='uci_housing.tar.gz' --remote_donefile_name='donefile' \
--local_path='.' --local_model_name='uci_housing_model' \
---local_timestamp_file='fluid_time_file' --local_tmp_path='_tmp'
+--local_timestamp_file='fluid_time_file' --local_tmp_path='_tmp' \
+--unpacked_filename='uci_housing_model'
```
上面代码通过轮询方式监控远程HDFS地址`/`的时间戳文件`/donefile`,当时间戳变更则认为远程模型已经更新,将远程模型`/uci_housing_model`拉取到本地临时路径`./_tmp/uci_housing_model`下,更新本地模型`./uci_housing_model`以及Paddle Serving的时间戳文件`./uci_housing_model/fluid_time_file`。