开发者模式
开发者模式介绍
1. 开发者模式
PaddleX开发者模式,如下图所示界面:
开发者模式主体是一个VSCode集成开发环境,搭载了飞桨统一模型开发 API——UAPI,可以使用统一的 API 接口进行开发,仅需 5 行命令即可完成模型训练、推理、评估导出以及多模型组合预测。同时,在开发者模式中可以编辑工具箱模式的源码,以实现工具箱模式 DIY。
2. 基于UAPI的模型开发
2.1 开发者模式文件结构
这里主要介绍在开发者模式下可以查看和编辑的文件及其作用,关于VSCode本身的使用,请参考官方文档。
下面详细说明「支持模型训练」的模型产线workspace中的文件。对于「不支持模型训练」的模型产线,文件内容相对简单,这里不再赘述。
文件夹/文件 | 内容及作用 |
---|---|
base | 控制工具箱模式的底层通用核心代码集合,如果对工具箱DIY有较深层次的需求,可以阅读这部分代码并自行改造。建议改造之前做好备份哦~ |
config | 配置文件目录,包括控制工具箱模式的ui_config.yaml 、记录模型训练全量配置项的model_config.yaml 、示例数据集相关的example_data.yaml 等 |
data | 数据目录。get_example_data.sh/get_example_data.bat 脚本将下载示例数据集至data/example_data。特别注意❗:在AI Studio云端,本目录下的内容不会持久化存储,重新启动环境后将丢失新增的文件!如果有数据持久化需求,建议手动将数据集复制到外层目录! |
impl | 控制工具箱模式的高层具体实现代码集合,如果对工具箱DIY有需求,可以阅读这部分代码并自行改造。建议改造之前做好备份哦~ |
tmp | 存放临时文件,一般不必关注 |
work | AI Studio云端特有的目录,可以选择将工作文件放在此处统一管理 |
run_paddlex.py | 使用UAPI执行数据准备、模型训练、模型评估等环节。这个脚本是工具箱模式的后台执行脚本,在开发者模式下也可以通过传入--exec_train 等参数直接运行。不建议对该脚本进行修改,否则可能导致工具箱模式出错。 |
run_demo.py | 使用UAPI执行数据校验、模型训练、模型评估等环节。与工具箱模式无关,仅需指定数据集位置即可全流程运行。 |
main.webui.gradio.py | 工具箱模式的gradio服务启动入口。通过将dataset、train、evaluate、deploy等环节解耦,灵活地搭建前端gradio UI界面。您在必要时可以在开发者模式下修改此文件及其所引用的base、impl目录中的代码文件,保存后切换到工具箱模式,点击右上角的重新加载,即可将修改生效。 |
logger.webui.gradio.py | 实现工具箱模式下底部的日志输出模块的gradio代码,请不要随意修改此文件,以免影响工具箱模式的正常运行❗ |
background_task.ipynb | 在AI Studio云端,提交后台任务时所用的脚本,成功提交后台训练任务后,可关闭PaddleX项目环境,告别值守项目监控训练进度的烦恼。 |
main.ipynb | 本PaddleX产线的具体介绍内容,也是您在PaddleX产线详情页所看到的介绍内容。 |
2.2 基于预置脚本的模型开发
开发者模式下,对于「支持模型训练」的模型产线,PaddleX提供了两个基于UAPI的预置脚本:run_paddlex.py
与run_demo.py
。
2.2.1 基于run_paddlex.py
开发
run_paddlex.py
是工具箱模式的底层核心脚本,接受--exec_dataset_check
、--exec_train
、--exec_evaluate
等参数,分别执行数据校验、模型训练、模型评估等对应的任务。
使用run_paddlex.py
脚本进行开发时,参数调整需要同时关注config/ui_config.yaml
和config/model_config.yaml
两个配置文件,其中配置项优先级ui_config.yaml
> model_config.yaml
,即ui_config.yaml
中设置的参数会覆盖model_config.yaml
中设置的同名参数,这一点需要特别注意。
另外,如果您想修改run_paddlex.py,请先复制备份,再基于备份文件修改,否则可能导致工具箱模式出错。
2.2.2 基于run_demo.py
开发(推荐)
在开发者模式下,推荐您使用run_demo.py
脚本进行模型开发,此脚本与工具箱模式解耦,直接使用便捷的UAPI完成模型开发全流程,更加轻量。下面详细介绍run_demo.py
脚本的用法。
首先,调出开发者模式下的终端,如下图所示。
然后,在终端执行python run_demo.py
,即可执行针对示例数据集的数据校验、模型训练、模型评估、模型部署等操作,您可根据实际需求注释掉不相关的执行步骤。关于UAPI的使用细节,请点击这里。
如果您需要使用自己的数据集,修改run_demo.py
中的数据集路径即可。
请注意:在AI Studio云端,如果您需要长时间训练模型,强烈建议您使用后台任务功能。如果不使用后台任务,请不要关闭PaddleX开发环境页面,且保证机器不进入休眠状态,否则开发环境将在10分钟后自动关闭,训练过程将终止。
2.3 手动修改高级参数
如果您需要修改一些高级参数,而UAPI目前没有给出统一的参数更新接口,比如数据增强相关的设置,您可以按照如下方式进行修改。
2.3.1 针对工具箱模式
如果想修改UAPI未暴露的高级参数,使之对工具箱模式生效,需要您切换到开发者模式,打开config/model_config.yaml
文件,找到对应的高级参数字段,修改完成并保存文件。
然后切换回工具箱模式,即可自动生效(无需重新加载)。这种修改方式同样适用于开发者模式下基于run_paddlex.py
脚本的模型开发。
2.3.2 针对开发者模式
如果您在开发者模式下使用run_demo.py
脚本进行开发,同时需要修改UAPI未暴露的高级参数,您可以参考下面的方法。
首先,修改run_demo.py中的UAPI config对象初始化代码,使之绑定一个具体的模型配置yaml文件。
然后,就可以手动修改绑定的yaml文件中的各种参数了,修改完成后保存yaml文件并重新执行run_demo.py
脚本,即可使设置生效。
3.工具箱模式UI代码理解与DIY
Gradio 是一个基于 Python 的开源框架,可以快速构建响应式的机器学习 Web 应用程序。PaddleX工具箱模式的主体功能便是基于gradio实现的。
开发者模式中包含实现工具箱模式的所有gradio相关代码,方便开发者根据自己需要(譬如暴露必要的参数、隐藏不需要的参数等),修改代码,创建新的工具箱模式的UI界面。 想了解gradio的相关能力,可前往https://gradio.app/quickstart/ 进行初步学习。
3.1 工具箱模式UI界面代码逻辑
PaddleX工具箱模式的运行逻辑如下:
1.启动main.webui.gradio.py
脚本,该脚本会渲染出前端UI主界面,共有数据准备、模型训练、模型评估、模型压缩(暂未上线)和模型部署五个主要功能模块,每个功能模块由不同的UI组件构成;
2.每个功能模块的UI组件主要支持显示和交互功能,其中交互功能包括:
- 调整参数
调整参数交互操作主要通过输入框组件(
gr.Textbox
)完成:用户根据需求在功能模块内完成参数设置后,对应UI组件的回调函数会将参数更新到配置文件config/ui_config.yaml
中。 - 启动功能
启动各模块对应功能主要通过按钮组件(
gr.Button
)完成:用户设置完参数后,点击启动按钮,该按钮的回调函数会启动子进程运行run_paddlex.py脚本,run_paddlex.py脚本中调用RunPaddleX类对应接口。RunPaddleX类主要完成:1.解析配置文件,更新参数;2.调用UAPI对应接口。
3.2 工具箱模式UI界面DIY示例
下面以图像分割模型PP-LiteSeg-Tiny为例,说明如何在工具箱模式UI界面增加或删除功能。
示例1:UI界面增加功能
假设我们希望在工具箱模式的模型训练环节,能够调整权重衰减系数weight_decay
的值。
整体包括下面几个步骤:
- 修改
config/ui_config.yaml
文件,添加对应的key-value对 - 修改
impl/train_ui.py
文件,新增UI组件和事件函数 - 修改
run_paddlex.py
文件,使配置生效
第一步:修改yaml文件
- 修改
config/ui_config.yaml
,添加对应的key-value
对。
train:
advance:
weight_decay: '3e-05'
第二步:新增UI组件和事件函数
打开impl/train_ui.py
,主要是一个类的实现代码——SegTrainUI
,其继承自base/train_ui
中实现的类TrainUI
,主要负责模型训练环节的UI组件构建。这个类有三个主要的函数,其作用分别如下:
ui_framework
:定义UI组件,weight_decay的组件应在这里添加。register_ui_events
:注册事件函数,weight_decay组件的事件函数要在这里注册。get_ui_mapping_dict
:注册UI组件和config/ui_config.yaml
中相关字段的映射表,用于在刷新页面时保持正确的组件更新。
那么,我们首先需要在ui_framework
中添加weight_decay组件,如下所示:
def ui_framework(self):
with gr.Tab('高级设置', id=1):
with gr.Row():
self.weight_decay = gr.Number(
label="权重衰减系数",
info="值越大,模型泛化性越好,越不易陷入过拟合,但同时也越难拟合训练数据",
value=self.ui_config["train"]["advance"]["weight_decay"],
interactive=True)
接下来,需要在register_ui_events
中注册事件函数,如下所示:
def register_ui_events(self):
self.weight_decay.blur(
self.update_ui_config("train.advance.weight_decay"),
inputs=self.weight_decay)
blur
函数表示当鼠标离开组件编辑区域(失焦)时,触发相应的事件。
然后,在get_ui_mapping_dict
中注册映射关系,如下所示:
def get_ui_mapping_dict(self):
...
self.weight_decay:
self.ui_config["train"]["advance"]["weight_decay"],
...
第三步:修改run_paddlex.py
文件
上面的步骤实现了新增配置项的UI组件和实时保存到yaml文件的逻辑,但是要想对应的配置在运行时生效,还需要修改run_paddlex.py
文件,这里通过覆写reset_uapi_config()
来实现。
def reset_uapi_config(self, config):
"""Update UAPI config"""
if self.ui_config['train']['base'].get('num_classes'):
config.update_num_classes(self.ui_config['train']['base'][
'num_classes'])
if self.ui_config['train'].get('crop_size'):
config.update_train_crop_size(self.ui_config['train']['crop_size'])
if self.ui_config['train']['advance'].get('weight_decay'):
config.update({'train':{'advance':{'weight_decay': float(self.ui_config['train']['advance']['weight_decay'])}}})
config.update_dataset(self.ui_config['dataset']['user_set_path'],
self.ui_config['dataset']['default_type'])
return config
到此为止,我们就完成了UI界面增加功能的全部步骤,保存所有修改后的文件,切换到工具箱模式,点击右上角的「重新加载」,即可完成验证。
示例2:UI界面删除功能
目前提供的工具箱模式UI模板,主要在impl
中各个环节对应的*_ui.py
实现。如果要删除某个组件,在对应的代码文件中,找到相应组件,将其visible属性设置为false即可。例如,要将模型训练环节中的【高级配置-> 混合精度训练模式】去掉,可以在impl/train_ui.py
中找到相关的组件代码,将其visible
属性修改即可,如下所示。
def ui_framework(self):
self.amp = gr.Radio(
label="混合精度训练模式(AMP)",
choices=["O1", "O2", "不开启"],
value=amp_value,
interactive=True,
visible=False)
注意,此时将使用该组件的默认值执行后续操作,如需修改请到开发者模式修改config/ui_config.yaml
中的对应字段。