
# 查看训练作业监控指标
在训练作业运行过程中，如果用户能在模型训练出问题（例如loss值异常）的情况下能收到告警并及时处理，可以节省大量时间和资源，避免无效运行作业导致的浪费。同时通过指标监控可以实时掌握训练作业的进度，了解模型在不同阶段的训练状态。
当前ModelArts训练作业模块在训练作业详情页的"监控"页签中提供了训练作业占用的CPU、GPU或NPU资源使用情况，具体参见[支持在ModelArts控制台上直接查看的监控指标]。
除了在[ModelArts管理控制台](https://console.huaweicloud.com/modelarts)训练作业详情页可以查看训练作业的指标外，更多指标可以登录到[AOM控制台](https://console.huaweicloud.com/aom2/)查看，具体参见[在AOM控制台查看ModelArts所有监控指标](https://support.huaweicloud.com/resmgmt-modelarts/resmgmt-modelarts_0033.html)。
除此外，ModelArts还支持自定义一些指标信息采集上报到AOM系统，比如训练日志常见打印loss值、step耗时、gpu throughput等指标信息，方便观察指标变化趋势，或对比不同训练作业指标情况。
**[通过Prometheus指标采集到AOM（HTTP）]** ：通过配置采集进程和HTTP接口，由平台自动拉取指标数据。
- 适合希望简化操作，减少代码改动的用户。
- 适合已经熟悉Prometheus生态，有现成采集工具的用户。
 
**[通过Prometheus指标采集到AOM（Command）]** ：通过配置执行命令和执行命令参数，由平台自动拉取指标数据。
- 适合不想暴露指标解析的用户。
- 适合已经熟悉Prometheus生态，有现成采集工具的用户。
 
**[使用SDK上报自定义监控指标到AOM]** ：通过在代码中集成SDK，手动上传指标数据到AOM。
- 适合需要高度定制化指标，例如自定义维度或复杂计算的用户。
- 适用于复杂的业务逻辑，需要在代码层面控制指标上报的场景。
- 适合已经使用华为云SDK，熟悉云服务的用户。
 
 #### 支持在ModelArts控制台上直接查看的监控指标
支持在[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)训练作业详情页中直接查看的监控指标请参见[表1 训练作业监控指标](https://support.huaweicloud.com/usermanual-standard-modelarts/develop-modelarts-0015.html#ZH-CN_TOPIC_0000002002276129__table52965263513)。
支持在[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)总览页中查看的训练相关监控指标请参见[表1 训练作业任务级的指标说明]。
 表1训练作业任务级的指标说明 
| 指标        | 说明                       | 查看方式                                                                                                                                                                                                                                                 |
|:---|:---|:---|
| 训练作业资源利用率 | 每个训练作业的CPU、GPU或NPU资源利用率。 | 在[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)总览页的"训练作业资源利用情况"版块查看。                                                                                                                                                                   |
| 卡时        | 每个训练作业运行时长和占用卡数。         | 在[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)总览页的"训练作业资源利用情况"版块查看。 ![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000002131923081.png "点击放大") |
   
 #### 通过Prometheus指标采集到AOM（HTTP）
通过配置采集进程和HTTP接口，由平台自动拉取Prometheus指标数据上报到[AOM控制台](https://console.huaweicloud.com/aom2/)。该方案用户只需配置指标的采集和暴露，无需手动上传，简化了操作流程，特别适合需要实时监控训练作业性能的场景。
![](https://support.huaweicloud.com/usermanual-standard-modelarts/public_sys-resources/caution_3.0-zh-cn.png)
在使用本方案时，请注意以下约束：
- 指标格式要求：用户自定义的指标必须符合云原生exporter的标准上报格式，否则可能导致数据无法解析。
  指标格式示例：
  ```
  mspti_marker_range_cost_time{name="Step: 0", source_kind="host", process_id="1887317", thread_id="1887317"} 261981960 1732357956859823920
  mspti_marker_range_cost_time{name="Step matmul: 0", source_kind="host", process_id="1887317", thread_id="1887757"} 2366640 1732357956863054960
  ```
  
- 数据量限制：如果在10秒内上报的指标数据过多（超过32KB），可能会导致数据丢失。
- 打点频率限制：如果指标的打点频率低于毫秒级，可能会因为时间戳重复而导致部分指标丢失。
 
1. 在训练容器中启动指标采集进程。要在训练进程之外，启动一个单独的进程来采集自定义指标。 
   例如，可以使用Flask框架来创建一个简单的HTTP服务器。
   ```
   from flask import Flask
   app = Flask(__name__)
   @app.route('/metrics')
   def get_metrics():
       # 生成或获取自定义指标数据
       metrics = """
       mspti_marker_range_cost_time{name="Step: 0", source_kind="host", process_id="1887317", thread_id="1887317"} 261981960 1732357956859823920
       mspti_marker_range_cost_time{name="Step matmul: 0", source_kind="host", process_id="1887317", thread_id="1887757"} 2366640 1732357956863054960
       """
       return metrics
   if __name__ == '__main__':
       app.run(host='0.0.0.0', port=8000)
   ```
   
   
2. 配置HTTP接口，确保指标采集进程提供一个HTTP接口（如/metrics），以便训练平台可以定时拉取指标数据。 
   每次HTTP接口被调用后，及时清理已采集的指标，避免内存泄漏或性能问题。
   
   
3. 启用Prometheus指标采集。 
   在创建训练作业时，开启"采集Prometheus指标"，"获取指标类型"选择"http获取指标"，并配置"采集URL"和"采集端口"。参数配置要满足以下要求：
   - 确保配置的URL和端口号与指标采集进程一致，否则可能导致指标无法上报。
   
   - 确保训练作业所在的网络环境允许访问配置的URL和端口号，避免因网络问题导致指标采集失败。
   
   
   
   
4. 在AOM查看自定义监控指标。 
   训练作业运行后，用户可以登录[AOM控制台](https://console.huaweicloud.com/aom2/)，在"指标浏览"页面，通过指定"指标"查看上报的自定义Prometheus指标。
   
   
 
 #### 通过Prometheus指标采集到AOM（Command）
通过配置执行命令和执行命令参数，由平台自动拉取Prometheus指标数据上报到[AOM控制台](https://console.huaweicloud.com/aom2/)。该方案用户只需配置指标的采集，无需手动上传，指标解析过程完全由用户自主定制，特别适合需要实时监控训练作业性能的场景。
![](https://support.huaweicloud.com/usermanual-standard-modelarts/public_sys-resources/caution_3.0-zh-cn.png)
在使用本方案时，请注意以下约束：
- 指标格式要求：自定义指标数据的格式必须符合特定格式的文本，即每个指标的格式应为"\<指标名称\>{\<标签名称\>=\<标签值\>,...} \<采样值\> \[毫秒时戳\]"。 指标数据示例：
  ```
  # HELP http_requests_total The total number of HTTP requests.
  # TYPE http_requests_total gauge
  html_http_requests_total{method="post",code="200"} 1656 1686660980680
  html_http_requests_total{method="post",code="400"} 2 1686660980681
  ```
  
- 数据量限制：如果在10秒内上报的指标数据过多（超过32KB），可能会导致数据丢失。
- 打点频率限制：如果指标的打点频率低于毫秒级，可能会因为时间戳重复而导致部分指标丢失。
 
1. 提供自定义指标文件，比如"test.prom"，该文件可以是存储在训练镜像或者是训练代码中，但必须保证是训练容器可获取到的。
2. 启用Prometheus指标采集。 
   在创建训练作业时，开启"采集Prometheus指标"，"获取指标类型"选择"命令行获取指标"，并配置如下参数：
   - "执行命令"：读取指标的Linux命令，例如填写"cat"。
   
   - "执行命令参数"：填写自定义指标文件的路径，例如"/XXX/a.prom"。
   
   
   要确保配置的执行命令和执行命令参数是可以稳定输出指标的，且响应要在秒级，否则指标可能会采集失败。
   
   
3. 在AOM查看自定义监控指标。 
   训练作业运行后，用户可以登录[AOM控制台](https://console.huaweicloud.com/aom2/)，在"指标浏览"页面，通过指定"指标"查看上报的自定义Prometheus指标。
   
   
 
 #### 使用SDK上报自定义监控指标到AOM
通过在代码中集成SDK，手动上传指标数据到AOM。
该方案适用于监控高度定制化的指标，例如自定义维度或复杂计算，需要在代码层面直接控制指标的上报，适合复杂的业务逻辑。
1. 准备训练代码，在训练代码中增加指标监控的代码。具体代码示例如下。准备训练代码的其它要求请参见[准备训练代码](https://support.huaweicloud.com/usermanual-standard-modelarts/develop-modelarts-0136.html#ZH-CN_TOPIC_0000002633900810__section128061059125610)。
   代码中倒数第2行的region = "cn-southwest-2"参数值请替换成实际region值，region取值可以参考[终端节点](https://console.huaweicloud.com/apiexplorer/#/endpoint/AOM)。
   代码中增加监控指标数据，具体参数解释参考[AOM文档](https://support.huaweicloud.com/api-aom/aom_04_0013.html#section3)。
   ```
   # coding: utf-8
   import os
   from huaweicloudsdkaom.v2 import *
   from huaweicloudsdkaom.v2.region.aom_region import AomRegion
   from huaweicloudsdkcore.auth.credentials import BasicCredentials
   from huaweicloudsdkcore.exceptions import exceptions
   from moxing.framework import cloud_utils
   def report2Aom(request,region):
       auth = cloud_utils.get_auth() #AK、SK和临时TOKEN值，系统会自动获取无需在代码中填写。
       ak = auth.AK
       sk = auth.SK
       securityToken = auth.TOKEN
       projectId = os.environ.get("MA_IAM_PROJECT_ID")
       credentials = BasicCredentials(ak, sk, projectId).with_security_token(securityToken)
       client = AomClient.new_builder() \
           .with_credentials(credentials) \
           .with_region(AomRegion.value_of(region)) \
           .build()
       try:
           response = client.add_metric_data(request)
           print(response)
       except Exception as e:
           print(e)
   if __name__ == "__main__":
       request = AddMetricDataRequest()
       listValuesBody = [
           #下面填上对应的指标名称、类型、单位、数值，比如step_time、loss值等
           ValueData(
               metric_name="step_time", #监控指标名称，例如step_time
               type="float",  #指标的数据类型，取值范围只能是"int"或"float"。
               unit="ms",     #数据的单位。长度不超过32个字符，此处举例为ms
               value=135.572  #指标数据的值。取值范围有效的数值类型。最小值0
           ),
           ValueData(
               metric_name="loss",
               type="float",
               value=0.6932
           )
       ]
       listDimensionsMetric = [
           #下面填上想查看的指标维度，比如线程、host等等
           Dimension2(
               name="cluster_name",#此处仅为举例示意，请替换为实际需要查看的指标维度
               value="fab2c5cf438b4f0c851fdcdf"# 此处仅为举例示意，请替换为实际参数值
           ),
           Dimension2(
               name="user_name",
               value="modelarts_02" # 此处仅为举例示意，请替换为实际参数值
           ),
           Dimension2(
               name="user_id",
               value="04f258c8fb00d42a1f6xxx" # 此处仅为举例示意，请替换为实际参数值
           )
       ]
       metricBody = MetricItemInfo(
           dimensions=listDimensionsMetric,
           namespace="NOPAAS.ESC"  #保持默认值即可，无需修改
       )
       listBodybody = [
           MetricDataItem(
               collect_time=int(round(time.time()*1000)),  #监控指标数据收集时间，为最新的时间戳，ms为单位
               metric=metricBody,
               values=listValuesBody
           )
       ]
       request.body = listBodybody
       region = "cn-southwest-2"  #请根据实际region替换
       response = report2Aom(request,region)
   ```
   
2. 在训练代码中加入命令，用于加载对应的依赖包。如果使用的是自定义镜像，也可以在制作镜像时安装以下依赖，具体参见[开发用于自定义镜像训练的代码](https://support.huaweicloud.com/usermanual-standard-modelarts/develop-modelarts-1416.html)。
   ```
   pip install huaweicloudsdkaom
   pip install huaweicloudsdkcore
   ```
   
3. 创建训练作业并运行，具体参考[创建训练作业](https://support.huaweicloud.com/usermanual-standard-modelarts/develop-modelarts-0022.html)章节。
4. 登录[AOM控制台](https://console.huaweicloud.com/aom2/)，在"指标浏览"页面，通过指定"指标"查看上报的指标数据。
5. 参考[告警上报配置方法](https://support.huaweicloud.com/devtool-modelarts/devtool-modelarts_03031.html#section1)章节设置AOM告警和通知机制。
 
