ModelArts训练脚本和推理日志解析
以订阅的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 服务。
日志的后半部分与前半部分几乎完全相同,可能是脚本被重复执行或日志被重复输出。
总结
- 脚本执行时出现了一个条件判断错误。
- 生成了两个 RSA 私钥,可能用于加密通信或身份验证。
- 验证了证书的签名,并提取了证书的主题信息。
- Nginx 发出了一个关于
user
指令的警告。 - 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 毫秒。
- 作用: 记录从请求开始到返回结果的总时间,包括预处理、推理和后处理的时间。
总结
这段推理日志展示了模型服务的完整推理过程,包括以下关键信息:
- 配置信息:模型名称、路径、服务地址和自定义脚本。
- 硬件使用:当前使用的是 CPU 进行计算。
- 预处理时间:19.93 毫秒。
- 推理时间:600.02 毫秒。
- 后处理时间:0.44 毫秒。
- 总延迟: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 请求)来调用推理服务。具体流程如下:
- 用户请求:用户通过 HTTPS 协议向该地址发送请求,通常包含输入数据(如图片、文本等)。
- API 网关:API 网关接收请求,并将其转发到后端的推理服务。
- 推理服务:推理服务处理请求,执行模型推理,并返回结果。
- 返回结果: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 编码)。
安全性
- HTTPS 加密:确保数据传输的安全性。
- API 网关的访问控制:华为云 API 网关支持身份验证(如 AK/SK、Token)和流量控制,防止未授权访问和滥用。
总结
这个地址是华为云 API 网关提供的推理服务公网访问地址,具有以下特点:
- 使用 HTTPS 协议,确保通信安全。
- 通过 API 网关统一管理访问入口。
- 支持版本化和路径化的 API 设计。
- 可以用于调用推理服务,处理用户请求并返回结果。
- 点赞
- 收藏
- 关注作者
评论(0)