写点什么

三步实现 BERT 模型迁移部署到昇腾

  • 2023-09-21
    广东
  • 本文字数:1729 字

    阅读完需:约 6 分钟

本文分享自华为云社区 《bert模型昇腾迁移部署案例》,作者:AI 印象。

镜像构建


1. 基础镜像(由工具链小组统一给出 D310P 的基础镜像)

From xxx


2. 安装 mindspore 2.1.0,假定 whl 包和 tar 包已经下载到本地,下载地址:https://www.mindspore.cn/lite/docs/zh-CN/r2.0/use/downloads.html


ADD . /usr/local/RUN cd /usr/local && \    pip install mindspore_lite-2.1.0-cp37-cp37m-linux_x86_64.whl && \    tar -zxvf mindspore-lite-2.1.0-linux-x64.tar.gz && \    ln -s /usr/local/mindspore-lite-2.1.0-linux-x64 /usr/local/mindspore-lite
复制代码


3. 安装 cann 包 6.3.RC2 版本,假定也下载到本地,下载地址:https://support.huawei.com/enterprise/zh/ascend-computing/cann-pid-251168373/software


RUN ./Ascend-cann-toolkit_6.3.RC2_linux-x86_64.run --install
复制代码


4. 安装 pip 依赖


RUN pip install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple onnx onnxruntime flask gunicorn
复制代码


5. 安装昇腾迁移工具 tailor,假定也下载到本地


RUN pip install tailor-0.2.1-py3-none-any.whl
复制代码


6. 生成镜像


docker build -t bert_poc_test:v1.0.0 .

容器部署


宿主机用户目录/home/xxx/下存放着若干文件:


/home/xxx--- model   --- model.onnx   --- model.mindir--- infer   --- run.sh   --- infer_server.py   --- mslite_model.py
复制代码


1. 运行容器


docker run -itd --privileged -p 50033:22 -p 8443:8443 -v /usr/local/Ascend/driver:/usr/local/Ascend/driver -v /home/xxx:/home/xxx --name bert_d310p bert_poc_test:v1.0.0 /bin/bash
复制代码


参数说明:


-itd 设置交互守护运行容器,可以退出容器


-- privileged 设置特权容器,可以查看所有 npu 卡信息


-p 主机端口和容器端口映射


2. 进入容器


docker exec -it bert_d310p bash


进入容器内部,执行 npu-smi info 命令查看 npu 卡使用情况



3. 使用 tailor 工具转换并优化模型文件


tailor --model_path=/home/xxx/model/ model.onnx --input_shape=input_ids:1,70 --aoe=True
复制代码


执行成功后在/home/xxx/model/ output/model_fp16_aoe_xxx/convert 目录下会生成转换成功的 mindir 文件,然后将这个文件拷贝到/home/xxx/model 下



4. 修改 infer_server.py 指定模型文件路径, 这里给出例子


import osfrom flask import Flaskfrom mslite_model import MsliteModelimport numpy as np
app = Flask(__name__)os.environ['DEVICE_ID'] = "0"
model_path = "/home/xxx/model/model.mindir"input_data = np.random.randn(1,70).astype(np.int32)
model = MsliteModel(model_path)
@app.route('/', methods=['POST'])def infer(): print("receive request") res = model([input_data]) return str(res)
if __name__ == '__main__': app.run(debug=False, host="0.0.0.0", port=8443)
复制代码


5. 修改 run.sh 文件指定进程个数,这里给出例子


#! /bin/bashsource /usr/local/Ascend/ascend-toolkit/set_env.shhost_ip=$(hostname -i)service_port=8443listen_address="${host_ip}:${service_port}"worker_num=60worker_threads=5worker_timeout=120gunicorn -w ${worker_num} --threads ${worker_threads} -t ${worker_timeout} -b ${listen_address} infer_server:app
复制代码


6. 启动服务


sh run.sh


7. 外部调用请求


使用 curl:


curl -kv -X POST http://{宿主机 ip}:8443/

性能评估


1. 安装 java


下载 jdk 包


拷贝到/opt/jdk


解压


然后设置环境变量:


export JAVA_HOME=/opt/jdk/jdk1.8.0_252


export PATH=${JAVA_HOME}/bin:${PATH}


2. 安装 jemter


下载 jmeter 包


拷贝到/opt/jmeter


解压


然后设置环境变量


export PATH=/opt/jmeter/apache-jmeter-5.4.1/bin:${PATH}


也可以持久化到 /etc/profile


source /etc/profile


3. 测试 qps


服务器端 gunicorn 使用 60 个 worker,显存占用接近 80%



客户端 jmeter 使用一个进程压测 iops 为 248 平均时延为 4ms



客户端使用 2 个进程, npu 使用率到 71%,qps 到 356 平均时延 5ms




客户端使用 4 个进程,npu 使用率已经到了 97%,qps 到 429 平均时延 9ms




进一步加大进程个数到 8 个,性能开始下降:



综上,bert poc 模型在 D310p 单卡 qps 可以达到 429。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
三步实现BERT模型迁移部署到昇腾_人工智能_华为云开发者联盟_InfoQ写作社区