自定义镜像规范

针对您本地开发的模型,在制作AI应用的自定义镜像时,需满足ModelArts定义的规范。

  • 自定义镜像中不能包含恶意代码。
  • 自定义镜像大小不超过10GB。
  • 镜像对外接口
  • (可选)健康检查接口
  • 日志文件输出
  • 镜像启动入口
  • 镜像依赖组件
  • (可选)保持Http长链接,无损滚动升级
  • (可选)处理SIGTERM信号,容器优雅退出

镜像对外接口

ModelArts用于推理的镜像的对外服务接口需要为8080,推理接口需与config.json文件中apis定义的url一致,当镜像启动时可以直接访问。下面是mnist镜像的访问示例,该镜像内含mnist数据集训练的模型,可以识别手写数字。其中listen_ip为容器IP,您可以通过启动自定义镜像,在容器中获取容器IP。

镜像对外接口请求示例

◉ 请求示例

curl -X POST \ http://{listen_ip}:8080/ \ -F images=@seven.jpg

listen_ip获取示例

◉ 返回示例

{"mnist_result": 7}

(可选)健康检查接口

如果在滚动升级时要求不中断业务,那么必须在config.json文件中配置健康检查的接口,供ModelArts调用,在config.json文件中配置。当业务可提供正常服务时,健康检查接口返回健康状态,否则返回异常状态。如果要实现无损滚动升级,必须配置健康检查接口。

健康检查接口示例如下:

URI

GET /health

请求示例

curl -X GET \ http://{listen_ip}:8080/health

响应示例

{"health": "true"}

状态码

200 请求成功

日志文件输出

为保证日志内容可以正常显示,日志信息需要打印到标准输出。

当前ModelArts推理基础镜像使用的python的logging模块,采用的是默认的日志级别Warnning,即当前只有warning级别的日志可以默认查询出来。如果想要指定INFO等级的日志能够查询出来,需要在代码中指定logging的输出日志等级为INFO级别。

在推理代码所在的py文件中,指定日志输出到Console的默认级别为INFO级别,确保将对应级别的日志打印出来。参考代码如下:
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

镜像启动入口

如果需要部署ModelArts批量服务,镜像的启动入口文件需要为“/home/run.sh”,采用CMD设置默认启动路径,例如Dockerfile如下:

CMD ["sh", "/home/run.sh"]

镜像依赖组件

如果需要部署ModelArts批量服务,镜像内需要安装python、jre/jdk、zip等组件包。

(可选)保持Http长链接,无损滚动升级

ModelArts服务如果需要支持滚动升级的过程中不中断业务,那么需要将服务的Http的“keep-alive”参数设置为200s。以gunicorn服务框架为例,gunicorn缺省情形下不支持keep-alive,需要同时安装gevent并配置启动参数“--keep-alive 200 -k gevent”。不同服务框架参数设置有区别,请以实际情况为准。

(可选)处理SIGTERM信号,容器优雅退出

ModelArts服务如果需要支持滚动升级的过程中不中断业务,那么需要在容器中捕获SIGTERM信号,并且在收到SIGTERM信号之后等待60秒再优雅退出容器。提前优雅退出容器可能会导致在滚动升级的过程中业务概率中断。要保证容器优雅退出,从收到SIGTERM信号开始,业务需要将收到的请求全部处理完毕再结束,这个处理时长最多不超过90秒。例如run.sh如下所示:

#!/bin/bash
gunicorn_pid=""

handle_sigterm() {
echo "Received SIGTERM, send SIGTERM to $gunicorn_pid"
if [ $gunicorn_pid != "" ]; then
sleep 60
kill -15 $gunicorn_pid # 传递 SIGTERM 给gunicorn进程
wait $gunicorn_pid # 等待gunicorn进程完全终止
fi
}

trap handle_sigterm TERM


常见问题

常见问题

  • 推理基础镜像都支持哪些?

    ModelArts的推理平台提供了一系列的基础镜像,用户可以基于这些基础镜像构建自定义镜像,用于部署推理服务。

    详情信息请参见ModelArts官网文档推理基础镜像列表

  • 使用自定义镜像创建在线服务,如何修改默认端口?

    当模型配置文件中定义了具体的端口号,例如:8443,创建AI应用没有配置端口(默认端口号为8080),或者配置了其他端口号,均会导致服务部署失败。您需要把AI应用中的端口号配置为8443,才能保证服务部署成功。

    修改默认端口号,具体操作如下:

    1.登录ModelArts控制台,左侧菜单选择“AI应用管理 > AI应用”;

    2.单击“创建”,进入创建AI应用界面,元模型选择“从容器镜像中选择”,选择自定义镜像;

    3.配置“容器调用接口”和端口号,端口号与模型配置文件中的端口保持一致;

    请参见ModelArts官网文档使用自定义镜像创建在线服务,如何修改默认端口

  • 自定义镜像导入配置运行时依赖无效

    自定义镜像导入不支持配置运行时依赖,系统不会自动安装所需要的pip依赖包。

    重新构建镜像,在构建镜像的Dockerfile文件中安装pip依赖包,例如安装Flask依赖包。示例代码如下:

    # 配置华为云的源,安装 python、python3-pip 和 Flask
    RUN cp -a /etc/apt/sources.list /etc/apt/sources.list.bak && \
    sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list && \
    sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y python3 python3-pip && \
    pip3 install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple Flask

    请参见ModelArts官网文档自定义镜像导入配置运行时依赖无效

制作创建AI应用的自定义镜像案例推荐

  • 收起 展开
    从0-1制作自定义镜像并创建AI应用 收起 展开

    从0到1,手把手教你如何使用自定义镜像完成AI应用的创建,并部署成在线服务。


    帮助文档
  • 收起 展开
    在开发环境中构建并调试推理镜像 收起 展开

    在ModelArts的开发环境Notebook中使用基础镜像构建一个新的推理镜像,并完成AI应用的创建,部署为在线服务。

    帮助文档
  • 收起 展开
    无需构建在开发环境中调试并保存推理镜像 收起 展开

    将本地已经制作好的模型包导入ModelArts的开发环境Notebook中进行调试和保存,使用保存的镜像完成AI应用的创建,部署为在线服务。

    帮助文档