ModelArts训练脚本和推理日志解析

举报
黄生 发表于 2025/01/18 17:58:26 2025/01/18
【摘要】 以订阅的ResNet50算法进行训练为例,下面是训练的脚本:#变量定义MA_JOB_DIR /home/ma-user/modelarts/user-job-dirMA_MOUNT_PATH /home/ma-user/modelartsMA_WORKING_DIR /home/ma-user/modelarts/user-job-dircd ${MA_WORKING_DIR}python ...

以订阅的ResNet50算法进行训练为例,下面是训练的脚本:

#变量定义
MA_JOB_DIR	/home/ma-user/modelarts/user-job-dir
MA_MOUNT_PATH	/home/ma-user/modelarts
MA_WORKING_DIR	/home/ma-user/modelarts/user-job-dir

cd ${MA_WORKING_DIR}
python ${MA_JOB_DIR}/ \
--data_url=${MA_MOUNT_PATH}/inputs/data_url_0 \
--train_url=${MA_MOUNT_PATH}/outputs/train_url_0 \
--do_train=True \
--do_eval_along_train=True \
--epochs=50 \
--batch_size=64 \
--eval_batch_size=64 \
--lr=0.002 \
--lr_scheduler_type=step \
--lr_step_size=20 \
--lr_milestones=20,40,50 \
--lr_gamma=0.1 \
--momentum=0.9 \
--weight_decay=0.0001 \
--num_workers=4 \
--max_to_keep=10 \
--use_dali=False \
--do_data_cleaning=True

以下是对每一部分的详细解释:

1. cd ${MA_WORKING_DIR}

  • 解释: 切换到 ${MA_WORKING_DIR} 目录。${MA_WORKING_DIR} 是一个环境变量,表示当前工作目录的路径。
  • 作用: 确保脚本在正确的工作目录下执行。

2. python ${MA_JOB_DIR}/ \

  • 解释: 运行 Python 脚本。这里应该是执行code/train_start.py。${MA_JOB_DIR} 是一个环境变量,表示 Python 脚本所在的目录。
  • 作用: 启动训练任务。

3. --data_url=${MA_MOUNT_PATH}/inputs/data_url_0 \

  • 解释: 指定数据路径。
  • 作用: 告诉脚本从哪里读取训练数据。

4. --train_url=${MA_MOUNT_PATH}/outputs/train_url_0 \

  • 解释: 指定训练结果的输出路径。
  • 作用: 告诉脚本将训练结果(如模型权重、日志等)保存到哪里。

5. --do_train=True \

  • 解释: 启用训练模式。
  • 作用: 告诉脚本执行训练任务。

6. --do_eval_along_train=True \

  • 解释: 在训练过程中同时进行评估。
  • 作用: 在训练过程中定期评估模型性能,以便监控模型的训练效果。

7. --epochs=50 \

  • 解释: 设置训练的轮数(epochs)为 50。
  • 作用: 控制模型在整个数据集上训练的次数。

8. --batch_size=64 \

  • 解释: 设置每个批次的样本数为 64。
  • 作用: 控制每次训练时使用的样本数量。

9. --eval_batch_size=64 \

  • 解释: 设置评估时每个批次的样本数为 64。
  • 作用: 控制每次评估时使用的样本数量。

10. --lr=0.002 \

  • 解释: 设置初始学习率为 0.002。
  • 作用: 控制模型参数更新的步长。

11. --lr_scheduler_type=step \

  • 解释: 使用步进式学习率调度器。
  • 作用: 在训练过程中根据设定的步长调整学习率。

12. --lr_step_size=20 \

  • 解释: 设置学习率调整的步长为 20 个 epoch。
  • 作用: 每 20 个 epoch 调整一次学习率。

13. --lr_milestones=20,40,50 \

  • 解释: 设置学习率调整的关键点(milestones)为第 20、40 和 50 个 epoch。
  • 作用: 在这些关键点上调整学习率。

14. --lr_gamma=0.1 \

  • 解释: 设置学习率调整的乘数为 0.1。
  • 作用: 每次调整学习率时,将当前学习率乘以 0.1。

15. --momentum=0.9 \

  • 解释: 设置动量(momentum)为 0.9。
  • 作用: 在优化过程中加速收敛,减少震荡。

16. --weight_decay=0.0001 \

  • 解释: 设置权重衰减(weight decay)为 0.0001。
  • 作用: 防止模型过拟合,通过惩罚较大的权重值。

17. --num_workers=4 \

  • 解释: 设置数据加载时使用的线程数为 4。
  • 作用: 加速数据加载过程。

18. --max_to_keep=10 \

  • 解释: 设置最多保存的模型检查点数量为 10。
  • 作用: 控制保存的模型数量,避免占用过多存储空间。

19. --use_dali=False \

  • 解释: 不使用 NVIDIA DALI(Data Loading Library)进行数据加载。
  • 作用: 如果设置为 True,可以使用 DALI 加速数据加载过程。

20. --do_data_cleaning=True

  • 解释: 启用数据清洗。
  • 作用: 在训练前对数据进行清洗,去除噪声或无效数据。

其中,使用–max_to_keep=10保存模型检查点(Checkpoint)在深度学习中非常重要,主要有以下几个作用:

1. 防止训练中断导致的数据丢失

2. 选择最佳模型

  • 问题: 训练过程中,模型的性能可能会波动(如过拟合或欠拟合)。
  • 作用: 通过保存检查点,可以在训练结束后选择验证集上表现最好的模型,而不是仅仅使用最后一个 epoch 的模型。

3. 支持早停(Early Stopping)

  • 问题: 如果模型在验证集上的性能不再提升,继续训练可能会导致过拟合。
  • 作用: 保存检查点可以结合早停策略,在模型性能达到最佳时停止训练,并保留最佳模型。

4. 模型的可复现性

  • 问题: 训练过程中可能需要调整超参数或修改模型结构。
  • 作用: 保存检查点可以记录训练过程中的模型状态,便于后续复现实验结果或进行对比分析。

5. 调试和分析

  • 问题: 训练过程中可能出现异常(如梯度爆炸或损失值异常)。
  • 作用: 保存检查点可以用于调试和分析问题,检查模型在特定训练阶段的状态。

保存模型检查点是深度学习训练中的一种最佳实践,它不仅可以防止训练中断导致的数据丢失,还能帮助选择最佳模型、支持早停、提高模型的可复现性,并为后续的推理、微调和调试提供便利。通过合理设置检查点保存策略(如 max_to_keep),可以在保证模型性能的同时节省存储空间。

另外,大多数深度学习框架支持回调机制(如 TensorFlow 的 ModelCheckpoint 或 PyTorch 的 Checkpoint)。可以设置回调函数,在每次验证集性能提升时保存模型,而不是仅仅保存最近的检查点。

模型训练完成,部署为在线服务,服务启动的日志如下:

/home/mind/run.sh: 15: [: false: unexpected operator
Generating RSA private key, 2048 bit long modulus (2 primes)
........+++++
........................................................................................................................................................+++++
e is 65537 (0x010001)
writing RSA key
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................................................................................................................................+++++
.................................+++++
e is 65537 (0x010001)
Signature ok
subject=C = CN, ST = GD, L = SZ, O = Huawei, OU = ops, CN = *.huawei.com
Getting CA Private Key
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
[2025-01-16 23:15:05 +0800] [41] [INFO] Starting gunicorn 19.9.0
[2025-01-16 23:15:05 +0800] [41] [INFO] Listening at: http://127.0.0.1:8080 (41)
[2025-01-16 23:15:05 +0800] [41] [INFO] Using worker: sync
[2025-01-16 23:15:05 +0800] [44] [INFO] Booting worker with pid: 44
/home/mind/run.sh: 15: [: false: unexpected operator
Generating RSA private key, 2048 bit long modulus (2 primes)
........+++++
........................................................................................................................................................+++++
e is 65537 (0x010001)
writing RSA key
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................................................................................................................................+++++
.................................+++++
e is 65537 (0x010001)
Signature ok
subject=C = CN, ST = GD, L = SZ, O = Huawei, OU = ops, CN = *.huawei.com
Getting CA Private Key
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
[2025-01-16 23:15:05 +0800] [41] [INFO] Starting gunicorn 19.9.0
[2025-01-16 23:15:05 +0800] [41] [INFO] Listening at: http://127.0.0.1:8080 (41)
[2025-01-16 23:15:05 +0800] [41] [INFO] Using worker: sync

这段服务启动过程的输出,涉及脚本执行、密钥生成、Nginx 配置以及 Gunicorn 服务的启动。

1. /home/mind/run.sh: 15: [: false: unexpected operator

  • 解释: [ 命令(用于条件判断)遇到了意外的操作符 false
  • 原因: 可能是脚本中的条件判断语法错误,例如缺少空格或使用了不兼容的 Shell 解释器(如 sh 而不是 bash)。
  • 影响: 这个错误不会导致脚本停止运行,但可能会影响后续逻辑。

2. 生成 RSA 私钥

Generating RSA private key, 2048 bit long modulus (2 primes)
........+++++
........................................................................................................................................................+++++
e is 65537 (0x010001)
writing RSA key
  • 解释: 生成一个 2048 位的 RSA 私钥。
    • e is 65537 (0x010001):RSA 公钥指数(通常为 65537)。
    • writing RSA key:将生成的私钥写入文件。
  • 作用: 生成的 RSA 私钥通常用于加密通信(如 HTTPS)或身份验证。

3. 再次生成 RSA 私钥

Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................................................................................................................................+++++
.................................+++++
e is 65537 (0x010001)
  • 解释: 再次生成一个 2048 位的 RSA 私钥,可能是为另一个用途(如客户端证书)准备的。

4. 签名验证

Signature ok
subject=C = CN, ST = GD, L = SZ, O = Huawei, OU = ops, CN = *.huawei.com
Getting CA Private Key
  • 解释: 对证书的签名进行了验证,并提取了证书的主题信息。
    • Signature ok:签名验证成功。
    • subject=C = CN, ST = GD, L = SZ, O = Huawei, OU = ops, CN = *.huawei.com:证书的主题信息,包括国家(CN)、省份(ST)、城市(L)、组织(O)、部门(OU)和通用名称(CN)。
    • Getting CA Private Key:获取 CA(证书颁发机构)的私钥,可能用于签名或解密。
  • 作用: 这部分通常与 HTTPS 证书的生成和验证有关。

5. Nginx 警告

nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
  • 解释: Nginx 发出警告,表示在 /etc/nginx/nginx.conf 文件的第 1 行,user 指令只有在主进程以超级用户权限运行时才有效,当前被忽略。
  • 原因: 可能是 Nginx 配置文件中的 user 指令设置不当,或者 Nginx 未以超级用户权限运行。

6. Gunicorn 启动日志

[2025-01-16 23:15:05 +0800] [41] [INFO] Starting gunicorn 19.9.0
[2025-01-16 23:15:05 +0800] [41] [INFO] Listening at: http://127.0.0.1:8080 (41)
[2025-01-16 23:15:05 +0800] [41] [INFO] Using worker: sync
[2025-01-16 23:15:05 +0800] [44] [INFO] Booting worker with pid: 44
  • 解释: Gunicorn(一个 Python WSGI HTTP 服务器)正在启动。
    Gunicorn 版本 19.9.0。监听在 127.0.0.1:8080,进程 ID 为 41。
    使用同步工作模式。启动一个工作进程,进程 ID 为 44。
  • 作用: Gunicorn 用于托管 Python Web 应用(如 Flask 或 Django),提供 HTTP 服务。

日志的后半部分与前半部分几乎完全相同,可能是脚本被重复执行或日志被重复输出。

总结

  1. 脚本执行时出现了一个条件判断错误。
  2. 生成了两个 RSA 私钥,可能用于加密通信或身份验证。
  3. 验证了证书的签名,并提取了证书的主题信息。
  4. Nginx 发出了一个关于 user 指令的警告。
  5. Gunicorn 成功启动,监听在 127.0.0.1:8080,并使用了同步工作模式。

下面是执行一次推理预测的日志:

Namespace(model_name='serve', model_path='/home/mind/model/model.pth', pt_server_name='127.0.0.1', service_file='/home/mind/model/customize_service.py')
Cpu is used!!!!!!!!
2025-01-16 23:18:02 CST [MainThread ] - /home/mind/model_service/model_service.py[line:87] - INFO: preprocess time: 19.926071166992188ms [d7500436f82dffed1fb23ba2e2fcaf7c]
2025-01-16 23:18:03 CST [MainThread ] - /home/mind/model_service/model_service.py[line:93] - INFO: infer time: 600.0192165374756ms [d7500436f82dffed1fb23ba2e2fcaf7c]
2025-01-16 23:18:03 CST [MainThread ] - /home/mind/model_service/model_service.py[line:97] - INFO: postprocess time: 0.43773651123046875ms [d7500436f82dffed1fb23ba2e2fcaf7c]
2025-01-16 23:18:03 CST [MainThread ] - /home/mind/model_service/model_service.py[line:99] - INFO: latency: 620.3830242156982ms [d7500436f82dffed1fb23ba2e2fcaf7c]

这段推理日志展示了模型服务的推理过程,包括预处理、推理、后处理以及总延迟时间。

1. Namespace(model_name='serve', model_path='/home/mind/model/model.pth', pt_server_name='127.0.0.1', service_file='/home/mind/model/customize_service.py')

  • 解释: 这是模型服务的配置信息,通过 Namespace 对象传递参数:
    • 模型的名称为 serve
    • 模型文件的路径为 /home/mind/model/model.pth
    • 模型服务运行的服务器地址为 127.0.0.1(本地)。
    • 自定义服务脚本的路径为 /home/mind/model/customize_service.py

2. Cpu is used!!!!!!!!

  • 解释: 模型推理没有使用 GPU,而是完全依赖 CPU。这可能会影响推理速度,尤其是对于计算密集型任务。

3. 2025-01-16 23:18:02 CST [MainThread ] - /home/mind/model_service/model_service.py[line:87] - INFO: preprocess time: 19.926071166992188ms [d7500436f82dffed1fb23ba2e2fcaf7c]

  • 解释: 这是预处理阶段的日志:
    • 日志来自 /home/mind/model_service/model_service.py 文件的第 87 行。
    • preprocess time: 19.926071166992188ms:预处理耗时 19.93 毫秒。
    • [d7500436f82dffed1fb23ba2e2fcaf7c]:请求的唯一标识符(可能是请求 ID 或会话 ID)。
  • 作用: 记录预处理阶段的时间,通常包括数据加载、格式转换、归一化等操作。

4. 2025-01-16 23:18:03 CST [MainThread ] - /home/mind/model_service/model_service.py[line:93] - INFO: infer time: 600.0192165374756ms [d7500436f82dffed1fb23ba2e2fcaf7c]

  • 解释: 这是推理阶段的日志:推理耗时 600.02 毫秒。
  • 作用: 记录模型推理的时间,即模型对输入数据进行预测的时间。

5. 2025-01-16 23:18:03 CST [MainThread ] - /home/mind/model_service/model_service.py[line:97] - INFO: postprocess time: 0.43773651123046875ms [d7500436f82dffed1fb23ba2e2fcaf7c]

  • 解释: 这是后处理阶段的日志:后处理耗时 0.44 毫秒。
  • 作用: 记录后处理阶段的时间,通常包括结果解析、格式转换、输出生成等操作。

6. 2025-01-16 23:18:03 CST [MainThread ] - /home/mind/model_service/model_service.py[line:99] - INFO: latency: 620.3830242156982ms [d7500436f82dffed1fb23ba2e2fcaf7c]

  • 解释: 这是总延迟的日志:总延迟为 620.38 毫秒。
  • 作用: 记录从请求开始到返回结果的总时间,包括预处理、推理和后处理的时间。

总结

这段推理日志展示了模型服务的完整推理过程,包括以下关键信息:

  1. 配置信息:模型名称、路径、服务地址和自定义脚本。
  2. 硬件使用:当前使用的是 CPU 进行计算。
  3. 预处理时间:19.93 毫秒。
  4. 推理时间:600.02 毫秒。
  5. 后处理时间:0.44 毫秒。
  6. 总延迟:620.38 毫秒。

推理服务对外的公网地址是一个 API Gateway(API 网关) 的公网访问地址,用于对外提供推理服务的接口。

地址结构

https://da01f4d98a8f4d08b25933676f8b71f6.apig.cn-north-4.huaweicloudapis.com/v1/infers/ed68bfbe-2845-412d-9bb3-e4b7d5cd4a67

子域名:da01f4d98a8f4d08b25933676f8b71f6.apig.cn-north-4.huaweicloudapis.com

  • 解释: 这是华为云 API 网关(API Gateway)的访问地址。
    • da01f4d98a8f4d08b25933676f8b71f6:API 网关的唯一标识符(可能是 API 分组或实例的 ID)。
    • apig:表示这是 API 网关服务。
    • cn-north-4:表示 API 网关所在的区域为华北-北京四(华为云的某个数据中心区域)。
    • huaweicloudapis.com:华为云的域名。
  • 作用: 通过 API 网关对外暴露服务,提供统一的访问入口。

路径:/v1/infers/ed68bfbe-2845-412d-9bb3-e4b7d5cd4a67

  • 解释: 这是 API 的具体路径,用于标识推理服务的接口。
    • /v1:表示 API 的版本为 v1。
    • /infers:表示这是一个推理服务的接口。
    • /ed68bfbe-2845-412d-9bb3-e4b7d5cd4a67:可能是某个具体的推理任务。
  • 作用: 通过路径区分不同的 API 版本和服务类型。

地址的作用

这个地址是推理服务对外的公网访问地址,用户可以通过该地址发送 HTTP 请求(如 POST 请求)来调用推理服务。具体流程如下:

  1. 用户请求:用户通过 HTTPS 协议向该地址发送请求,通常包含输入数据(如图片、文本等)。
  2. API 网关:API 网关接收请求,并将其转发到后端的推理服务。
  3. 推理服务:推理服务处理请求,执行模型推理,并返回结果。
  4. 返回结果:API 网关将推理结果返回给用户。

示例请求

这是一个图像分类的推理服务,用户可以通过以下方式调用(还需要添加认证信息):

curl -X POST \
  https://da01f4d98a8f4d08b25933676f8b71f6.apig.cn-north-4.huaweicloudapis.com/v1/infers/ed68bfbe-2845-412d-9bb3-e4b7d5cd4a67 \
  -H 'Content-Type: application/json' \
  -d '{
    "image": "base64_encoded_image_data"
  }'
  • 请求方法: POST
  • 请求头: Content-Type: application/json
  • 请求体: 包含输入数据(如图片的 Base64 编码)。

安全性

  1. HTTPS 加密:确保数据传输的安全性。
  2. API 网关的访问控制:华为云 API 网关支持身份验证(如 AK/SK、Token)和流量控制,防止未授权访问和滥用。

总结

这个地址是华为云 API 网关提供的推理服务公网访问地址,具有以下特点:

  • 使用 HTTPS 协议,确保通信安全。
  • 通过 API 网关统一管理访问入口。
  • 支持版本化和路径化的 API 设计。
  • 可以用于调用推理服务,处理用户请求并返回结果。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。