bert向量服务部署

● 一、bert-as-service

● step1: 编译docker镜像需要的文件

● step2: 编译镜像

● step3: 启动容器服务命令

● step4: 导出bert-as-service镜像分发部署

● 参考

● 二、torchServe部署bert-as-service

● 环境准备

● 打包模型服务

● 启动服务

● 请求

● 并发测试

 

一、bert-as-service

step1: 编译docker镜像需要的文件

这里以data为例,进入/data/docker_build/bert-as-service文件夹

a. 创建一个docker文件夹,拉取tensorflow镜像

mkdir docker

docker pull tensorflow/tensorflow:1.12.0-gpu-py3

b. 进入刚创建的docker文件夹,创建如下Dockerfile文件

Dockerfile

FROM tensorflow/tensorflow:1.12.0-gpu-py3

RUN pip install bert-serving-server[http]

RUN mkdir -p /app

WORKDIR /app

ENTRYPOINT ["bert-serving-start","-http_port","8125","-model_dir","/model"]

CMD ["-num_worker","2","-pooling_layer","-1"]

HEALTHCHECK --timeout=5s CMD curl -f http://localhost:8125/status/server || exit 1

step2: 编译镜像

在Dockerfile所在目录执行如下命令

docker build -t bert-as-service .

step3: 启动容器服务命令

注: 模型文件放在/data/MODELS,启动镜像,按需设置num-worker数目,每个worker需占用一份显存

#macbert服务

PATH_MODEL=/data/MODELS/macbert

docker run --runtime nvidia -dit -p 6555:5555 -p 6556:5556 --name mac_bert -v $PATH_MODEL:/model -t bert-as-service -num_worker=8 -pooling_layer=-1

googlebert服务

PATH_MODEL=/data/MODELS/googlebert

docker run --runtime nvidia -dit -p 8555:5555 -p 8556:5556 --name google_bert -v $PATH_MODEL:/model -t bert-as-service -num_worker=4 -pooling_layer=-1

step4: 从机器导出bert-as-service镜像分发部署

A. 进入镜像文件夹

cd /data/images

B. 导出bert-as-service镜像

docker save -o ./bert-as-service.tar bert-as-service:latest

C. 分发到其他机器

D. 进入其他服务器,加载镜像

docker load -i bert-as-service.tar

dockerr run --runtime nvidia -dit -p 6555:5555 -p 6556:5556 --name mac_bert -v $PATH_MODEL:/model -t bert-as-service -num_worker=4 -pooling_layer=-1

参考

https://zhuanlan.zhihu.com/p/30555962

二、torchServe部署bert-as-service

环境准备

1、安装torch-model-archiver,改包用于打包模型文件,也可以在自己本地打包后上传。

pip install torch-model-archiver

2、安装torchserve:可以在机器上安装torchserve,推荐用docker方式:

docker pull pytorch/torchserve:latest-gpu

打包模型服务

以Huggingface模型为例,首先保存模型必要文件:

python

from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained("hfl/chinese-roberta-wwm-ext-large")

model = BertModel.from_pretrained("hfl/chinese-roberta-wwm-ext-large")

model.save_pretrained("./roberta") # 模型保存,包括权重和config.json

tokenizer.save_pretrained("./roberta") # tokenizer保存,包括各种词典文件

然后定制服务配置文件:

json

{

"model_name":"hfl/chinese-roberta-wwm-ext",

"do_lower_case":true,

"max_length":"25",

"pooling_layer":"-1",

"pooling_strategy":"REDUCE_MEAN"

}

接着完成handler文件,这是torchserve后端执行推理的逻辑,可以直接Transformer_handler_generalized.py下载使用。注意这个handler里的模型初始化方式如下,如果你使用的类比较特殊,请自行修改代码中的对应片段:

python

载入模型和tokenizer,其中tokenizer初始化必须文件如果不曾传入,就根据配置自行定义

self.model = BertModel.from_pretrained(model_dir)

self.model.to(self.device)

if any(fname for fname in os.listdir(model_dir) if fname.startswith("vocab.") and os.path.isfile(fname)):

self.tokenizer = BertTokenizer.from_pretrained(

model_dir, do_lower_case=self.setup_config["do_lower_case"]

)

else:

self.tokenizer = BertTokenizer.from_pretrained(

self.setup_config["model_name"],

do_lower_case=self.setup_config["do_lower_case"],

)

最后用torch-model-archiver将模型打包成mar文件,这个压缩文件是部署的基础。例子:

shell

torch-model-archiver --model-name roberta --version 1.0 --serialized-file ./roberta/pytorch_model.bin --handler ./Transformer_handler_generalized.py --extra-files "./roberta/config.json,./roberta/setup_config.json,./roberta/vocab.txt,./roberta/tokenizer_config.json,./roberta/special_tokens_map.json"

torch-model-archiver命令中参数的含义:

● --model-name:导出模型的名称,导出文件的文件名将是model-name.mar

● --version:指定模型的版本

● --handler:handler是模型的入口程序,可以是TorchServe默认的handler名或者定义了handler的python文件

● --model-file:定义了模型结构的py文件,文件中的类必须继承⾃nn.modules。torchscript保存的模型不需要此参数;如果自定义handler且handler中定义了模型载入方式,也不需要此参数和

● --serialized-file:权重pt或pth文件路径

● --extra-files:入口函数的其他依赖文件,比如传递⼀个json,它将自动加载到handler,并通过self.mapping访问

● --export-path:导出mar文件的存放路径,默认在当前文件夹。若加上参数-f,则表示覆盖之前的文件

● --runtime:指定python,可选(python,python2,python3)

启动服务

如果torchserve docker未启动,可用如下命令启动,注意挂载的路径要写成当前真实路径,确保model-store文件夹下放有mar压缩包:

shell

docker run -it -d -p 8080:8080 -p 8081:8081 --shm-size=8g --ulimit memlock=-1 --ulimit stack=67108864 --gpus all -v $(pwd)/model-store:/home/model-server/model-store pytorch/torchserve torchserve --start --model-store model-store --models all

posted @ 2023-08-22 10:54  glowwormss  阅读(521)  评论(0)    收藏  举报