
# 自定义引擎创建模型规范
使用自定义引擎创建模型，用户可以通过选择自己存储在SWR服务中的镜像作为模型的引擎，指定预先存储于OBS服务中的文件目录路径作为模型包来创建模型，轻松地应对ModelArts平台预置引擎无法满足个性化诉求的场景。
ModelArts将自定义引擎类型的模型部署为服务时，会先将模型相关的SWR镜像下载至集群中，用"uid=1000, gid=100"的用户启动SWR镜像为容器，然后将OBS文件下载到容器中的"/home/mind/model"目录下，最后执行SWR镜像中预置的启动命令。ModelArts平台会在APIG上注册一个预测接口提供给用户使用，用户可以通过平台提供的预测接口访问服务。
#### 自定义引擎创建模型的规范
使用自定义引擎创建模型，用户的SWR镜像、OBS模型包和文件大小需要满足以下规范：
- SWR镜像规范：
  - 镜像必须内置一个用户名为"ma-user"，组名为"ma-group"的普通用户，且必须确保该用户的uid=1000、gid=100。内置用户的dockerfile指令如下：
    ```
    groupadd -g 100 ma-group && useradd -d /home/ma-user -m -u 1000 -g 100 -s /bin/bash ma-user
    ```
    
  
  
  
  - 明确设置镜像的启动命令。在dockerfile文件中指定cmd，dockerfile指令示例如下：
    ```
    CMD sh /home/mind/run.sh
    ```
    启动入口文件run.sh需要自定义。示例如下：
    ```
    #!/bin/bash
    # 自定义脚本内容
    ...
    # run.sh调用app.py启动服务器，app.py请参考https示例
    python app.py
    ```
    ![](https://support.huaweicloud.com/usermanual-standard-modelarts/public_sys-resources/note_3.0-zh-cn.png)
    除了按上述要求设置启动命令，您也可以在镜像中自定义启动命令，在创建模型时填写与您镜像中相同的启动命令。
    
  
  
  
  - 提供的服务可使用HTTPS/HTTP协议和监听的容器端口，使用的协议和端口号请根据模型实际定义的推理接口进行配置。HTTPS协议的示例可参考[https示例]。
  
  - （可选）服务对外提供的端口，提供URL路径为"/health"的健康检查服务（健康检查的URL路径必须为"/health"）。
   

- OBS模型包规范 模型包的名字必须为model。模型包规范请参见[模型包规范介绍](https://support.huaweicloud.com/usermanual-standard-modelarts/inference-modelarts-0055.html)。
  
- 文件大小规范 当使用公共资源池时，SWR的镜像大小（指下载后的镜像大小，非SWR界面显示的压缩后的镜像大小）和OBS模型包大小总和不大于30G。
  
 #### https示例
使用Flask启动https，Webserver代码示例如下：
```
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__':
    app.run(host="0.0.0.0", port=8080, ssl_context='adhoc')
```
#### 在本地机器调试
自定义引擎的规范可以在安装有docker的本地机器上通过以下步骤提前验证：
1. 将自定义引擎镜像下载至本地机器，假设镜像名为custom_engine:v1。
2. 将模型包文件夹复制到本地机器，假设模型包文件夹名字为model。
3. 在模型包文件夹的同级目录下验证如下命令拉起服务：
   ```
   docker run --user 1000:100 -p 8080:8080 -v model:/home/mind/model    custom_engine:v1
   ```
   ![](https://support.huaweicloud.com/usermanual-standard-modelarts/public_sys-resources/note_3.0-zh-cn.png)
   该指令无法完全模拟线上，主要是由于-v挂载进去的目录是root权限。在线上，模型文件从OBS下载到/home/mind/model目录之后，文件owner将统一修改为ma-user。
   
4. 在本地机器上启动另一个终端，执行以下验证指令，得到符合预期的推理结果。
   ```
   curl https://127.0.0.1:8080/${推理服务的请求路径}
   ```
   
 
#### 推理部署示例
本节将详细说明以自定义引擎方式创建模型的步骤。
1. 创建模型并查看模型详情 登录[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)，进入"模型管理"页面中，单击"创建模型"，进入模型创建页面，设置相关参数如下：
   - 元模型来源：选择"从对象存储服务（OBS）中选择"。
   
   - 选择元模型：从OBS中选择一个模型包。
   
   - AI引擎：选择"Custom"。
   
   - 引擎包：从容器镜像中选择一个镜像。 其他参数保持默认值。
     
   
   
   单击"立即创建"，跳转到模型列表页，查看模型状态，当状态变为"正常"，模型创建成功。
   图1创建模型   
   ![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002159593269.png "点击放大")
   单击模型名称，进入模型详情页面，查看模型详情信息。
   
2. 部署服务并查看详情 在模型详情页面，单击右上角"部署\>在线服务"，进入服务部署页面，模型和版本默认选中，选择合适的"实例规格"（例如CPU：2核 8GB），其他参数可保持默认值，单击"下一步"，跳转至服务列表页，当服务状态变为"运行中"，服务部署成功。
   单击服务名称，进入服务详情页面，查看服务详情信息，单击"日志"页签，查看服务日志信息。
   图2查看服务日志信息   
   ![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002124273566.png "点击放大") 
3. 服务预测 在服务详情页面，单击"预测"页签，进行服务预测。
   图3服务预测   
   ![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002159711685.png "点击放大") 
 
