AI开发平台MODELARTS-精度对齐:loss曲线对比

时间:2024-04-30 18:09:28

loss曲线对比

训练结束后,在output_dir参数指定目录下会输出trainer_state.json文件,该文件保存了训练过程loss以及learning_rate的log信息。

将GPU设备训练输出的trainer_state.json文件重命名为trainer_state_gpu.json,并复制到NPU节点的容器内,将NPU设备训练输出的trainer_state.json文件重命名为trainer_state_npu.json。

对其进行解析就可以获取loss信息,这里可以使用如下脚本进行loss曲线的绘制。

# compare_metric.py
import json
import os
from typing import List, Dict
 
import matplotlib.pyplot as plt
import numpy as np
 
## 解析 json 文件
def load_trainer_status(file_path):
    with open(file_path, "r") as f:
        trainer_status = json.load(f)
    return trainer_status.get("log_history")
 
def plot_curve(data_source: List[Dict], tags: List[str]):
    fig, ax = plt.subplots()
    for tag in tags:
        # print(data_source[0], len(data_source[0]))
        # assert all([tag in status.keys() for status in data_source]), f"Tag {tag} is missing for data source."
        for index, source in enumerate(data_source):
            y = []
            x = []
            for log in source:
                x.append(log.get("step"))
                y.append(log.get(tag))
            ax.plot(x, y, label=f"{tag}_{index}")
 
    ax.legend()
    plt.savefig("loss.png")
 
if __name__ == "__main__":
    state_npu_path = os.path.join("trainer_state_npu.json")
    state_gpu_path = os.path.join("trainer_state_gpu.json")
    state_npu = load_trainer_status(state_npu_path)
    state_gpu = load_trainer_status(state_gpu_path)
    plot_curve([state_npu, state_gpu], ["loss"])

对比单卡模式下NPU和GPU训练曲线,发现loss曲线下降趋势不一致。这说明迁移的模型存在精度偏差。

图1 loss曲线对比

图中蓝色loss_0是NPU迭代曲线,黄色loss_1是GPU的迭代曲线。

support.huaweicloud.com/bestpractice-modelarts/modelarts_10_4003.html