ModelArts集群
训练镜像
八爪鱼训练镜像使用ma-user用户运行,用户需保证镜像内已创建ma-user用户,且训练过程中使用到的python环境或其他依赖对ma-user具有权限,以下分别从“从0到1构建”和“从已有镜像”迁移两种方式说明。
- 从0到1构建训练镜像
用户可以docker run -it {image-id-or-name} bash在容器内依次执行命令后commit为新的镜像。
或者采用dockerfile构建,参考如下:# 1、查看算法依赖,一般需要考虑使用的ubuntu版本、cuda版本、cudnn版本 FROM xxx/cuda:11.3.1-cudnn8-devel-ubuntu20.04 # 2、安装python环境 如果使用其他方式安装,可替换 USER root RUN apt update && \ apt install python3 python3-pip -y && \ # 可选,安装opencv库时需要安装以下依赖,缺少其他库请按实际需求添加依赖 # apt install libgl1-mesa-glx -y && \ ln -sf /usr/bin/python3 /usr/bin/python && \ ln -sf /usr/bin/pip3 /usr/bin/pip && \ # 如果在root下安装pip依赖,在步骤3后需要对python库添加权限,如 # chmod -R 777 ${PYTHONPATH}/lib/python3.8 或者 # chown -R ma-user:100 ${PYTHONPATH}/lib/python3.8 # pip install xxx # 3、增加ma-user(必选) RUN useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user # 4、安装python依赖(或可在步骤2中安装) USER ma-user RUN pip install xxx ENV PYTHONPATH ${PYTHONPATH}:{YOUR NEW PYTHON BIN PATH}
- 从已有镜像迁移
# 将已有镜像导入 FROM {YOUR OWN IMAGE} USER root RUN useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user # 此处添加对使用python库赋权限,参考方式一 # 例如,用户的python依赖均在root属主下,需要对ma-user开放权限 USER ma-user ENV PYTHONPATH ${PYTHONPATH}:{YOUR PYTHON BIN PATH}
如果使用dockerfile构建,参考命令为docker build -f Dockerfile -t new_image:1.0 .
如果使用容器命令行方式构建,参考命令为docker commit {container-id} new_image:1.0
本地镜像构建完成后,需要将镜像上传到八爪鱼平台镜像仓库。
推理服务
- 推理服务镜像同训练任务镜像一样,必须内置一个用户名为“ma-user”,组名为“ma-group”的普通用户,且必须确保该用户的uid=1000、gid=100。
- 需要明确设置镜像的启动命令。执行命令如下:
CMD sh /home/mind/run.sh
- 服务端必须使用https协议, 且暴露在所有网络平面(0.0.0.0)的“8080”端口。
- 在“8080”端口,提供URL路径为“/health”的健康检查接口供健康检查使用。
- 接口仅支持POST、GET、PUT、DELETE四种方法。
FROM python:3.11 USER root RUN useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user USER ma-user RUN pip install --progress-bar off flask cryptography WORKDIR /home/ma-user COPY server.py . CMD python server.py
HTTPS Server示例:
from flask import Flask, request import json app = Flask(__name__) @app.route('/greet', methods=['POST']) def say_hello_func(): print("----------- in hello func ----------") data = json.loads(request.get_data(as_text=True)) print(data) username = data['name'] rsp_msg = 'Hello, {}!'.format(username) return json.dumps({"response":rsp_msg}, indent=4) @app.route('/goodbye', methods=['GET']) def say_goodbye_func(): print("----------- in goodbye func ----------") return '\nGoodbye!\n' @app.route('/', methods=['POST']) def default_func(): print("----------- in default func ----------") data = json.loads(request.get_data(as_text=True)) return '\n called default func !\n {} \n'.format(str(data)) @app.route('/health', methods=['GET']) def healthy(): return "{\"status\": \"OK\"}" # host must be "0.0.0.0", port must be 8080 if __name__ == '__main__': # 访问创建推理服务时选择的模型版本文件 torchserve = PTVisionService(model_path=os.getenv('OCTOPUS_MODEL') + '/best.pt') # host must be "0.0.0.0", port must be 8080 app.run(host="0.0.0.0", port=8080, ssl_context='adhoc')
注意:在创建推理服务时选择的模型版本文件将在服务启动时下载到OCTOPUS_MODEL对应的路径下:
环境变量名称
含义
默认值(默认值可能会随版本变化,不建议直接使用)
OCTOPUS_MODEL
模型版本文件下载目录
/home/mind/model
在本地机器调试
自定义引擎的规范可以在安装有docker的本地机器上通过以下步骤提前验证:
- 将自定义引擎镜像下载至本地机器,假设镜像名为custom_engine:v1。
- 将模型版本文件夹复制到本地机器,假设模型包文件夹名字为model。
- 在模型文件夹的同级目录下验证如下命令拉起服务:
docker run -u 1000:100 -p 8080:8080 -v /home/model:/home/mind/model -e OCTOPUS_MODEL=/home/mind/model custom_engine:v1
- 在本地机器上启动另一个终端,执行以下验证指令,得到符合预期的推理结果。
curl -k https://127.0.0.1:8080/${推理服务的请求路径}
本地调试完成后,每次都需将镜像推送至新版本,使用二次推送镜像功能会导致推理服务镜像更新不生效。