标签: PaddleHub

  • 在 AWS Sagemaker 上使用 Paddlehub 搭建 OCR 文字识别服务,识别身份证、银行卡、票据等

    在 AWS Sagemaker 上使用 Paddlehub 搭建 OCR 文字识别服务,识别身份证、银行卡、票据等

    Paddlehub 是百度飞浆推出的预训练模型管理工具,Paddlehub 提供对预训练模型的安装、卸载、升级、部署等功能。

    Sagemaker 是 AWS 推出的机器学习工具平台,集成了 Jupyter Notebook,通过 Sagemaker WEB 工具或者 SDK 可快速完成机器学习相关的模型训练、部署等过程。

    在 Sagemaker 上面部署自己的机器学习模型分为以下几个步骤:

    1. 将服务封装成成符合 Sagemaker 要求的镜像托管到 AWS ECR 容器仓库;
    2. 在 Sagemaker 上将镜像制作成 Sagemaker 定义的模型;
    3. 创建终端节点配置,部署终端节点。

    其中,第一步是比较繁琐的,要按照 Sagemaker 平台的要求来合理规划代码及数据在 Docker 镜像中的路径。2、3步都可以通过 Sagemaker 的 WEB 界面完成。

    将服务封装成成符合 Sagemaker 要求的镜像托管到 AWS ECR 容器仓库

    Sagemaker 约定了推理模型的容器必须实施在端口 8080 上响应 /invocations 和 /ping 的 Web 服务器。也就是说推理模型必须部署一个端口为 8080 的 Web 服务,这个服务需要有两个 API:一个是 http://localhost:8080/invocations 用来接收数据,返回推理结果;一个是 http://localhost:8080/ping 用来响应健康检查。

    Paddlehub 提供了启动推理服务的快速命令:

    hub serving start -m chinese_ocr_db_crnn_mobile -p 8866

    其中,-p 参数用来指定端口,这里保持使用 8866 端口号。计划在镜像里面加一个 Nginx 的 server 配置,用来响应 8080 端口上 path 为/invocations 的推理请求,将请求转发到 Paddlehub 服务 的 8866 端口上,并添加另外一个 server 配置,响应 8080 端口上 path 为 /ping 的请求,来通过 Sagemaker 的健康检查。

    网络拓扑图

    基础镜像基于 ubuntu docker 基础镜像制作。

    docker run -it ubuntu /bin/bash
    apt-get update

    安装 nginx 并配置

    apt-get install nginx

    将准备好的 Nginx 配置文件上传到 docker 镜像中:

    docker cp /home/ec2-user/SageMaker/ocr/ocr.conf [启动的容器ID]:/etc/nginx/conf.d/ocr.conf

    Nginx 配置参考:

    server {
        listen 8080;
        server_name localhost;
    
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X_Forward_For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
    
        location /ping {
          add_header Access-Control-Allow-Origin * always;
          add_header Access-Control-Allow-Headers X-Requested-With;
          add_header Access-Control-Allow-Methods PUT,POST,GET,DELETE,OPTIONS;
          
          return 200 "OK";
        }
    
        location /invocations {
          add_header Access-Control-Allow-Origin * always;
          add_header Access-Control-Allow-Headers X-Requested-With;
          add_header Access-Control-Allow-Methods PUT,POST,GET,DELETE,OPTIONS;
          
          proxy_pass http://127.0.0.1:8866/predict/chinese_ocr_db_crnn_server;
        }
    }
    

    安装 python 3.6,移除默认的 python 3.8

    ubuntu 镜像中可能存在 python3.8 版本, 在我安装的时候,Paddlehub 在 python3.8 下运行会出现问题。

    apt-get install software-properties-common
    add-apt-repository ppa:deadsnakes/ppa
    apt-get update
    apt-get install python3.6
    apt-get purge remove python3.8
    echo alias python=python3 >> ~/.bashrc
    echo alias python3=python3.6 >> ~/.bashrc
    source ~/.bashrc

    安装 PaddlePaddle、PaddleHub

    apt-get install python3-pip
    echo alias pip=pip3>> ~/.bashrc
    source ~/.bashrc
    
    pip install paddlepaddle-gpu==2.0.0rc
    pip install paddlehub==2.0.0b

    安装 OCR 文字识别模型

    apt-get install git libgl1-mesa-glx
    pip install sentencepiece  shapely pyclipper
    hub install chinese_ocr_db_crnn_mobile==1.1.1

    将准备好的启动脚本上传到正在编辑的容器中

    这里有两个,一个是供 CPU 实例类型用的,一个是供 GPU 实例类型用的。

    docker cp /home/ec2-user/SageMaker/ocr/run-gpu.sh [启动的容器ID]:/root/run.sh # 或者
    docker cp /home/ec2-user/SageMaker/ocr/run.sh [启动的容器ID]:/root/run.sh

    run 脚本参考:

    #!/bin/bash
    
    # nginx
    /usr/sbin/nginx > /var/log/nginx.log 2>&1 &
    
    # ocr service
    hub serving start -m chinese_ocr_db_crnn_server --use_gpu > /var/log/chinese_ocr_db_crnn_server.log 2>&1 & # For gpu
    # hub serving start -m chinese_ocr_db_crnn_server > /var/log/chinese_ocr_db_crnn_server.log 2>&1 & # For cpu
    
    
    # just keep this script running
    while [[ true ]]; do
        sleep 1
    done

    打包上传基础镜像到 AWS ECR

    docker commit -m "[note]" -a "19050023" [启动的容器ID] [镜像名称]:[base-version]
    docker tag [镜像名称]:[base-version] [AWS ECR 地址].amazonaws.com.cn/[镜像名称]:[base-version]
    docker push [AWS ECR 地址].amazonaws.com.cn/[镜像名称]:[base-version]

    Dockerfile 配置参考:

    # FROM [镜像名称]:v1
    FROM [镜像名称]:v1-gpu
    
    # COPY run.sh /root/run.sh # For cpu
    COPY run-gpu.sh /root/run.sh # For gpu
    
    RUN chmod +x /root/run.sh
    
    ENTRYPOINT ["/root/run.sh"]
    
    EXPOSE 8080

    在 Sagemaker 上将镜像制作成 Sagemaker 定义的模型

    创建模型

    选择“创建模型”,进入创建模型的配置页面

    配置容器

    推理代码图像位置一栏填上面步骤中上传的推理镜像的 ECR 地址,模型构件指预训练模型等,可以上传到 s3 存储,SageMaker 运行的时候会拉去模型数据,解压到指定的目录中,这里不需要。完成配置,点“创建模型”即可。

    创建终端节点,部署终端节点

    在 SageMaker 终端节点模块选择创建终端节点

    创建新的终端节点配置,添加模型,并调整实例类型

    点击 创建终端节点配置 即创建好了配置文件。

    最后,点击页面底部的“创建终端节点”,服务就部署好了。