diff --git "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_config.md" "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_config.md" new file mode 100644 index 0000000000000000000000000000000000000000..3a9d116dab137dd9639a08e5e9e4bc766dc35386 --- /dev/null +++ "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_config.md" @@ -0,0 +1,57 @@ + +# KeenTune 配置文件说明 +配置文件主要用于各服务的配置操作,包括服务的ip、端口、算法选择、调优参数的选择等操作。安装服务时是按默认的配置文件安装的,安装好后如果需要修改配置直接在/etc/keentune/conf目录下找到对应服务的配置文件进行修改,修改完成后重启服务即可生效。(注:在源配置文件修改时,需要重新安装、启动服务才可生效,在/etc/keentune/conf目录下修改对应的配置文件时,只需重启服务就可生效) + +#### keentund 配置文件:/etc/keentune/conf/keentuned.conf +```conf +[keentuned] +KEENTUNED_HOME = /etc/keentune +PORT = 9871 +HEARTBEAT_TIME = 30 + +[brain] +BRAIN_IP = localhost +BRAIN_PORT = 9872 +ALGORITHM = tpe + +[target-group-1] +TARGET_IP = localhost +TARGET_PORT = 9873 +PARAMETER = sysctl.json + +[bench-group-1] +BENCH_SRC_IP = localhost +BENCH_DEST_IP = localhost +BENCH_SRC_PORT = 9874 +BENCH_DEST_PORT = 9875 +BASELINE_BENCH_ROUND = 2 +TUNING_BENCH_ROUND = 1 +RECHECK_BENCH_ROUND = 1 +BENCH_CONFIG = bench_wrk_nginx_long.json + +[dump] +DUMP_BASELINE_CONFIGURATION = false +DUMP_TUNING_CONFIGURATION = false +DUMP_BEST_CONFIGURATION = true +DUMP_HOME = /var/keentune + +[sensitize] +ALGORITHM = random +BENCH_ROUND = 2 + +[log] +LOGFILE_LEVEL = DEBUG +LOGFILE_NAME = keentuned.log +LOGFILE_INTERVAL = 2 +LOGFILE_BACKUP_COUNT = 14 + +[version] +VERSION_NUM = 1.1.0 +``` ++ brain.BRAIN_IP: keentune-brain组件部署ip ++ brain.ALGORITHM: brain中使用的tuning算法 ++ target-group-1.TARGET_IP: keentune-target组件部署ip ++ target-group-1.PARAMETER: keentune-target中调整的参数域 ++ bench-group-1.BENCH_SRC_IP: keentune-bench组件部署ip ++ bench-group-1.BENCH_DEST_IP: keentune-bench组件发压目标ip,一般是target ip ++ bench-group-1.BENCH_CONFIG: keentune-bench中运行的benchmark脚本配置 \ No newline at end of file diff --git "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_install.md" "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_install.md" index d01db5791276626afe4599b74031eca98b0e0fd0..93aa9ce8ad0e36ef1009025bdfda34512f992474 100644 --- "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_install.md" +++ "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_install.md" @@ -1,44 +1,13 @@ # KeenTune 安装配置手册 -## 单机部署 -### 方法一 Alinux3 YUM安装 -添加yum源 +## YUM安装 +参考[这里](KeenTune_requirements.md)安装KeenTune所需的所有依赖,然后使用以下命令安装KeenTune各组件 ```s -# keentune服务对应的yum源 -[keentune] -name=keentune-os -baseurl=https://mirrors.openanolis.cn/anolis/8.4/Plus/x86_64/os/ -gpgkey=https://mirrors.openanolis.cn/anolis/RPM-GPG-KEY-ANOLIS -enabled=1 - -# 将以上keentune源追加进系统的yum源 -echo "..." >> /etc/yum.repos.d/epel.repo -# 清空旧缓存 -yum clean all -# 生成新缓存 -yum makecache -``` - -安装keentune服务及相关的依赖包 -```s -yum install python36 python36-devel rust openssl-devel -pip3 install --upgrade pip -pip3 install tornado==6.1 -pip3 install pynginxconfig -pip3 install numpy==1.19.5 -pip3 install POAP==0.1.26 -pip3 install hyperopt==0.2.5 -pip3 install ultraopt==0.1.1 -pip3 install requests==2.25.1 -pip3 install pySOT==0.3.3 -pip3 install scikit_learn==0.24.2 -pip3 install shap -pip3 install xgboost - #yum源安装keentune各组件 yum install keentuned keentune-brain keentune-bench keentune-target ``` -启动各组件 +参照[这里](KeenTune_config.md)编辑keentuned配置文件,然后启动各组件(可以使用tmux,nohub或多个窗口运行的方式启动) + ```s # 启动keentuned服务 systemctl start keentuned @@ -50,46 +19,8 @@ systemctl start keentune-bench systemctl start keentune-target ``` -检查各组件启动状态 -```s -ps -ef|grep -E 'keentuned|keentune-brain|keentune-target|keentune-bench' -``` - -### 方法二 源码安装 -设置环境变量 -```s -#go编译器安装 -yum install go - -#验证go编译器 -go env -go version - -#配置go环境 -go env -w GO111MODULE=on -go env -w GOPROXY=https://goproxy.cn,direct -``` - -安装依赖包 -```s -# 安装python36和python36开发包(提供头文件和静态链接库) -yum install python36 python36-devel rust openssl-devel -# 安装python依赖包 -pip3 install --upgrade pip -pip3 install tornado==6.1 -pip3 install pynginxconfig -pip3 install numpy==1.19.5 -pip3 install POAP==0.1.26 -pip3 install hyperopt==0.2.5 -pip3 install ultraopt==0.1.1 -pip3 install requests==2.25.1 -pip3 install pySOT==0.3.3 -pip3 install scikit_learn==0.24.2 -pip3 install shap -pip3 install xgboost -``` - -下载源码 +## 源码安装 +使用以下命令下载KeenTune的源代码 ```s git clone https://gitee.com/anolis/keentuned.git git clone https://gitee.com/anolis/keentune_brain.git @@ -97,6 +28,8 @@ git clone https://gitee.com/anolis/keentune_target.git git clone https://gitee.com/anolis/keentune_bench.git ``` +参考[这里](KeenTune_requirements.md)安装KeenTune所需的所有依赖,然后使用以下命令编译和启动KeenTune各组件 + 编译安装各组件(在各组件git目录下分别执行以下命令) + keentuned ```s @@ -119,7 +52,8 @@ cd keentune_bench sudo python3 setup.py install ``` -启动各组件(可以使用tmux,nohub或多个窗口运行的方式启动) +参照[这里](KeenTune_config.md)编辑keentuned配置文件,然后启动各组件(可以使用tmux,nohub或多个窗口运行的方式启动) + ```s # 启动keentuned服务 keentuned @@ -140,65 +74,4 @@ nohup keentune-bench > bench.log 2>&1 & keentune-target # 或者 nohup keentune-target > target.log 2>&1 & -``` -检查各组件启动状态 -```java -ps -ef|grep -E 'keentuned|keentune-brain|keentune-target|keentune-bench' -``` - -### 配置文件说明 -配置文件主要用于各服务的配置操作,包括服务的ip、端口、算法选择、调优参数的选择等操作。安装服务时是按默认的配置文件安装的,安装好后如果需要修改配置直接在/etc/keentune/conf目录下找到对应服务的配置文件进行修改,修改完成后重启服务即可生效。(注:在源配置文件修改时,需要重新安装、启动服务才可生效,在/etc/keentune/conf目录下修改对应的配置文件时,只需重启服务就可生效) - -#### keentund 配置文件:/etc/keentune/conf/keentuned.conf -```conf -[keentuned] -KEENTUNED_HOME = /etc/keentune -PORT = 9871 -HEARTBEAT_TIME = 30 - -[brain] -BRAIN_IP = localhost -BRAIN_PORT = 9872 -ALGORITHM = tpe - -[target-group-1] -TARGET_IP = localhost -TARGET_PORT = 9873 -PARAMETER = sysctl.json - -[bench-group-1] -BENCH_SRC_IP = localhost -BENCH_DEST_IP = localhost -BENCH_SRC_PORT = 9874 -BENCH_DEST_PORT = 9875 -BASELINE_BENCH_ROUND = 2 -TUNING_BENCH_ROUND = 1 -RECHECK_BENCH_ROUND = 1 -BENCH_CONFIG = bench_wrk_nginx_long.json - -[dump] -DUMP_BASELINE_CONFIGURATION = false -DUMP_TUNING_CONFIGURATION = false -DUMP_BEST_CONFIGURATION = true -DUMP_HOME = /var/keentune - -[sensitize] -ALGORITHM = random -BENCH_ROUND = 2 - -[log] -LOGFILE_LEVEL = DEBUG -LOGFILE_NAME = keentuned.log -LOGFILE_INTERVAL = 2 -LOGFILE_BACKUP_COUNT = 14 - -[version] -VERSION_NUM = 1.1.0 -``` -+ brain.BRAIN_IP: keentune-brain组件部署ip -+ brain.ALGORITHM: brain中使用的tuning算法 -+ target-group-1.TARGET_IP: keentune-target组件部署ip -+ target-group-1.PARAMETER: keentune-target中调整的参数域 -+ bench-group-1.BENCH_SRC_IP: keentune-bench组件部署ip -+ bench-group-1.BENCH_DEST_IP: keentune-bench组件发压目标ip,一般是target ip -+ bench-group-1.BENCH_CONFIG: keentune-bench中运行的benchmark脚本配置 \ No newline at end of file +``` \ No newline at end of file diff --git "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_requirements.md" "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_requirements.md" new file mode 100644 index 0000000000000000000000000000000000000000..f72a13c033957524e0f22f497cfea7ca25dbbca6 --- /dev/null +++ "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/keentune_docs/KeenTune_requirements.md" @@ -0,0 +1,71 @@ +# KeenTune依赖安装 + +## 添加KeenTune yum源 +```s +# 将以下keentune源追加进系统的yum源 +vim /etc/yum.repos.d/epel.repo + +# keentune服务对应的yum源 +[keentune] +name=keentune-os +baseurl=https://mirrors.openanolis.cn/anolis/8.4/Plus/x86_64/os/ +gpgkey=https://mirrors.openanolis.cn/anolis/RPM-GPG-KEY-ANOLIS +enabled=1 + +# 清空旧缓存 +yum clean all +# 生成新缓存 +yum makecache +``` + +## keentuned 编译安装依赖项 +```s +#go编译器安装 +yum install go + +#验证go编译器 +go env +go version + +#配置go环境 +go env -w GO111MODULE=on +go env -w GOPROXY=https://goproxy.cn,direct +``` + +## keentune-brain 运行依赖项 +```s +yum install python36 python36-devel rust openssl-devel + +pip3 install --upgrade pip +pip3 install tornado==6.1 +pip3 install pynginxconfig +pip3 install numpy==1.19.5 +pip3 install POAP==0.1.26 +pip3 install hyperopt==0.2.5 +pip3 install ultraopt==0.1.1 +pip3 install requests==2.25.1 +pip3 install pySOT==0.3.3 +pip3 install scikit_learn==0.24.2 +pip3 install shap +pip3 install xgboost +``` + +如果安装shap和xgboost时报告gcc相关错误,使用以下步骤解决 + +```s +yum install gcc gcc-c++ make cmake +pip3 install xgboost +pip3 install shap==0.35.0 +``` + +## keentune-target 运行依赖项 +```s +pip3 install tornado==6.1 +pip3 install pynginxconfig +``` + +## keentune-bench 运行依赖项 +```s +pip3 install tornado==6.1 +pip3 install pynginxconfig +``` \ No newline at end of file diff --git "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224http long.md" "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224http long.md" index 6766ac4ce17e23e8ba83613245d61d00a6c262f9..a404f38377bd1a85da77e9827f8c36f363fbcd34 100644 --- "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224http long.md" +++ "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224http long.md" @@ -20,7 +20,8 @@ KeenTune总共包含四个组件:keentuned,keentune-target,keentune-brain 敏感参数识别的原理是根据参数配置组合和其对应的性能得分,通过敏感分析算法,找出对性能得分影响较大的参数配置。 ## 3. KeenTune参数敏感分析 -首先我们将解压后的数据集copy到/var/keentune/data/tuning_data/tuning路径下(没有可以手动创建),这个路径也是KeenTune运行智能参数调优时保存文件的路径。 +首先我们将解压后的**数据集文件夹**copy到/var/keentune/data/tuning_data/tuning路径下(没有可以手动创建),这个路径也是KeenTune运行智能参数调优时保存文件的路径。 +![数据文件存放位置(注意:请根据题目要求选择数据文件)](assets/demo_data.jpg) 我们应该可以通过keentune sensitize list命令看到我们提供的文件 ![](assets/44.png) 查到数据文件之后,通过下面这个命令使用KeenTune进行敏感参数识别,更具体的步骤请参考[《KeenTune敏感参数识别手册》](../keentune_docs/KeenTune_sensitize.md) diff --git "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224http short.md" "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224http short.md" index 76d1051f39c607b8d8178e61bc19b313e81a6098..de7ef9d0930c16203c41c55cc3a0672102e8bf46 100644 --- "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224http short.md" +++ "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224http short.md" @@ -20,7 +20,8 @@ KeenTune总共包含四个组件:keentuned,keentune-target,keentune-brain 敏感参数识别的原理是根据参数配置组合和其对应的性能得分,通过敏感分析算法,找出对性能得分影响较大的参数配置。 ## 3. KeenTune参数敏感分析 -首先我们将解压后的数据集copy到/var/keentune/data/tuning_data/tuning路径下(没有可以手动创建),这个路径也是KeenTune运行智能参数调优时保存文件的路径。 +首先我们将解压后的**数据集文件夹**copy到/var/keentune/data/tuning_data/tuning路径下(没有可以手动创建),这个路径也是KeenTune运行智能参数调优时保存文件的路径。 +![数据文件存放位置(注意:请根据题目要求选择数据文件)](assets/demo_data.jpg) 我们应该可以通过keentune sensitize list命令看到我们提供的文件. ![](assets/44.png) 查到数据文件之后,通过下面这个命令使用KeenTune进行敏感参数识别,更具体的步骤请参考[《KeenTune敏感参数识别手册》](../keentune_docs/KeenTune_sensitize.md) diff --git "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224https long.md" "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224https long.md" index dfd4ca0812fdcaa92a2d64b86e7db217dcb75784..19fa14dbe1ab53f8a917e0c4002e8d7957ab2a50 100644 --- "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224https long.md" +++ "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224https long.md" @@ -21,7 +21,8 @@ KeenTune总共包含四个组件:keentuned,keentune-target,keentune-brain ## 3. KeenTune参数敏感分析 -首先我们将解压后的数据集copy到/var/keentune/data/tuning_data/tuning路径下(没有可以手动创建),这个路径也是KeenTune运行智能参数调优时保存文件的路径。 +首先我们将解压后的**数据集文件夹**copy到/var/keentune/data/tuning_data/tuning路径下(没有可以手动创建),这个路径也是KeenTune运行智能参数调优时保存文件的路径。 +![数据文件存放位置(注意:请根据题目要求选择数据文件)](assets/demo_data.jpg) 我们应该可以通过keentune sensitize list命令看到我们提供的文件. ![](assets/44.png) 查到数据文件之后,通过下面这个命令使用KeenTune进行敏感参数识别,更具体的步骤请参考[《KeenTune敏感参数识别手册》](../keentune_docs/KeenTune_sensitize.md) diff --git "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224https short.md" "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224https short.md" index db2281c9f66a26b355ec57ebdfd7de4e04871525..8b1eccd68bd2faa8d5ac3d013e19d4489fd61c33 100644 --- "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224https short.md" +++ "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/KeenTune\346\225\217\346\204\237\345\217\202\346\225\260\350\257\206\345\210\253\342\200\224\342\200\224https short.md" @@ -21,7 +21,8 @@ KeenTune总共包含四个组件:keentuned,keentune-target,keentune-brain 敏感参数识别的原理是根据参数配置组合和其对应的性能得分,通过敏感分析算法,找出对性能得分影响较大的参数配置。 ## 3. KeenTune参数敏感分析 -首先我们将解压后的数据集copy到/var/keentune/data/tuning_data/tuning路径下(没有可以手动创建),这个路径也是KeenTune运行智能参数调优时保存文件的路径。 +首先我们将解压后的**数据集文件夹**copy到/var/keentune/data/tuning_data/tuning路径下(没有可以手动创建),这个路径也是KeenTune运行智能参数调优时保存文件的路径。 +![数据文件存放位置(注意:请根据题目要求选择数据文件)](assets/demo_data.jpg) 我们应该可以通过keentune sensitize list命令看到我们提供的文件 ![](assets/44.png) 查到数据文件之后,通过下面这个命令使用KeenTune进行敏感参数识别,更具体的步骤请参考[《KeenTune敏感参数识别手册》](../keentune_docs/KeenTune_sensitize.md) diff --git "a/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/assets/demo_data.jpg" "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/assets/demo_data.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..c08b880354a3bd2d3a1eb96225abe001862207f0 Binary files /dev/null and "b/\351\276\231\350\234\245\344\270\200\345\210\273/KeentuneAI\350\260\203\344\274\230\344\273\273\345\212\241/\351\242\230\347\233\256\346\214\207\345\257\274\346\211\213\345\206\214/assets/demo_data.jpg" differ