[TIPC] Initialize TIPC (#8)
* Init TIPC * Update gitignore * Fix bugs * Add docs and more models * Fix bugsown
parent
4cbee06067
commit
bddddc5164
26 changed files with 1929 additions and 9 deletions
@ -0,0 +1,3 @@ |
|||||||
|
/scripts/ |
||||||
|
/output/ |
||||||
|
/data/ |
@ -0,0 +1,62 @@ |
|||||||
|
# 飞桨训推一体全流程(TIPC) |
||||||
|
|
||||||
|
## 1. 简介 |
||||||
|
|
||||||
|
飞桨除了基本的模型训练和预测,还提供了支持多端多平台的高性能推理部署工具。本文档提供了飞桨训推一体全流程(Training and Inference Pipeline Criterion(TIPC))信息和测试工具,方便用户查阅每种模型的训练推理部署打通情况,并可以进行一键测试。 |
||||||
|
|
||||||
|
<div align="center"> |
||||||
|
<img src="docs/overview.png" width="1000"> |
||||||
|
</div> |
||||||
|
|
||||||
|
## 2. 汇总信息 |
||||||
|
|
||||||
|
打通情况汇总如下,已填写的部分表示可以使用本工具进行一键测试,未填写的表示正在支持中。 |
||||||
|
|
||||||
|
**字段说明:** |
||||||
|
- 基础训练预测:指Linux GPU/CPU环境下的模型训练、Paddle Inference Python预测。 |
||||||
|
- 更多训练方式:包括多机多卡、混合精度训练。 |
||||||
|
- 更多部署方式:包括C++预测、Serving服务化部署、ARM端侧部署等多种部署方式,具体列表见[3.3节](#3.3) |
||||||
|
- Slim训练部署:包括PACT在线量化、离线量化。 |
||||||
|
- 更多训练环境:包括Windows GPU/CPU、Linux NPU、Linux DCU等多种环境。 |
||||||
|
|
||||||
|
|
||||||
|
| 任务类别 | 模型名称 | 基础<br>训练预测 | 更多<br>训练方式 | 更多<br>部署方式 | Slim<br>训练部署 | 更多<br>训练环境 | |
||||||
|
| :--- | :--- | :----: | :--------: | :----: | :----: | :----: | :----: | |
||||||
|
| 变化检测 | BIT | 支持 | - | - | - | - | |
||||||
|
| 场景分类 | HRNet | 支持 | - | - | - | - | |
||||||
|
| 目标检测 | PP-YOLO | 支持 | - | - | - | - | |
||||||
|
| 图像分割 | UNet | 支持 | - | - | - | - | |
||||||
|
|
||||||
|
|
||||||
|
## 3. 测试工具简介 |
||||||
|
|
||||||
|
### 3.1 目录介绍 |
||||||
|
|
||||||
|
``` |
||||||
|
test_tipc |
||||||
|
|--configs # 配置目录 |
||||||
|
| |--task_name # 任务名称 |
||||||
|
| |--model_name # 模型名称 |
||||||
|
| |--train_infer_python.txt # 基础训练推理测试配置文件 |
||||||
|
|--docs # 文档目录 |
||||||
|
| |--test_train_inference_python.md # 基础训练推理测试说明文档 |
||||||
|
|----README.md # TIPC说明文档 |
||||||
|
|----prepare.sh # TIPC基础训练推理测试数据准备脚本 |
||||||
|
|----test_train_inference_python.sh # TIPC基础训练推理测试解析脚本 |
||||||
|
|----common_func.sh # TIPC基础训练推理测试常用函数 |
||||||
|
``` |
||||||
|
|
||||||
|
### 3.2 测试流程概述 |
||||||
|
|
||||||
|
使用本工具,可以测试不同功能的支持情况。测试过程包含: |
||||||
|
|
||||||
|
1. 准备数据与环境 |
||||||
|
2. 运行测试脚本,观察不同配置是否运行成功。 |
||||||
|
|
||||||
|
<a name="3.3"></a> |
||||||
|
### 3.3 开始测试 |
||||||
|
|
||||||
|
请参考相应文档,完成指定功能的测试。 |
||||||
|
|
||||||
|
- 基础训练预测测试: |
||||||
|
- [Linux GPU/CPU 基础训练推理测试](docs/test_train_inference_python.md) |
@ -0,0 +1,131 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
function func_parser_key() { |
||||||
|
strs=$1 |
||||||
|
IFS=":" |
||||||
|
array=(${strs}) |
||||||
|
tmp=${array[0]} |
||||||
|
echo ${tmp} |
||||||
|
} |
||||||
|
|
||||||
|
function func_parser_value() { |
||||||
|
strs=$1 |
||||||
|
IFS=":" |
||||||
|
array=(${strs}) |
||||||
|
tmp=${array[1]} |
||||||
|
echo ${tmp} |
||||||
|
} |
||||||
|
|
||||||
|
function func_parser_value_lite() { |
||||||
|
strs=$1 |
||||||
|
IFS=$2 |
||||||
|
array=(${strs}) |
||||||
|
tmp=${array[1]} |
||||||
|
echo ${tmp} |
||||||
|
} |
||||||
|
|
||||||
|
function func_set_params() { |
||||||
|
key=$1 |
||||||
|
value=$2 |
||||||
|
if [ ${key}x = "null"x ];then |
||||||
|
echo " " |
||||||
|
elif [[ ${value} = "null" ]] || [[ ${value} = " " ]] || [ ${#value} -le 0 ];then |
||||||
|
echo " " |
||||||
|
else |
||||||
|
echo "${key}=${value}" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
function func_parser_params() { |
||||||
|
strs=$1 |
||||||
|
IFS=":" |
||||||
|
array=(${strs}) |
||||||
|
key=${array[0]} |
||||||
|
tmp=${array[1]} |
||||||
|
IFS="|" |
||||||
|
res="" |
||||||
|
for _params in ${tmp[*]}; do |
||||||
|
IFS="=" |
||||||
|
array=(${_params}) |
||||||
|
mode=${array[0]} |
||||||
|
value=${array[1]} |
||||||
|
if [[ ${mode} = ${MODE} ]]; then |
||||||
|
IFS="|" |
||||||
|
#echo $(func_set_params "${mode}" "${value}") |
||||||
|
echo $value |
||||||
|
break |
||||||
|
fi |
||||||
|
IFS="|" |
||||||
|
done |
||||||
|
echo ${res} |
||||||
|
} |
||||||
|
|
||||||
|
function status_check() { |
||||||
|
local last_status=$1 # the exit code |
||||||
|
local run_command=$2 |
||||||
|
local run_log=$3 |
||||||
|
local model_name=$4 |
||||||
|
|
||||||
|
if [ $last_status -eq 0 ]; then |
||||||
|
echo -e "\033[33m Run successfully with command - ${model_name} - ${run_command}! \033[0m" | tee -a ${run_log} |
||||||
|
else |
||||||
|
echo -e "\033[33m Run failed with command - ${model_name} - ${run_command}! \033[0m" | tee -a ${run_log} |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
function download_and_unzip_dataset() { |
||||||
|
local ds_dir="$1" |
||||||
|
local ds_name="$2" |
||||||
|
local url="$3" |
||||||
|
local clear="${4-True}" |
||||||
|
|
||||||
|
local ds_path="${ds_dir}/${ds_name}" |
||||||
|
local zip_name="${url##*/}" |
||||||
|
|
||||||
|
if [ ${clear} = 'True' ]; then |
||||||
|
rm -rf "${ds_path}" |
||||||
|
fi |
||||||
|
|
||||||
|
wget -nc -P "${ds_dir}" "${url}" --no-check-certificate |
||||||
|
cd "${ds_dir}" && unzip "${zip_name}" && cd - \ |
||||||
|
&& echo "Successfully downloaded ${zip_name} from ${url}. File saved in ${ds_path}. " |
||||||
|
} |
||||||
|
|
||||||
|
function parse_extra_args() { |
||||||
|
local lines=("$@") |
||||||
|
local last_idx=$((${#lines[@]}-1)) |
||||||
|
local IFS=';' |
||||||
|
extra_args=(${lines[last_idx]}) |
||||||
|
} |
||||||
|
|
||||||
|
function add_suffix() { |
||||||
|
local ori_path="$1" |
||||||
|
local suffix=$2 |
||||||
|
local ext="${ori_path##*.}" |
||||||
|
echo "${ori_path%.*}${suffix}.${ext}" |
||||||
|
} |
||||||
|
|
||||||
|
function parse_first_value() { |
||||||
|
local key_values=$1 |
||||||
|
local IFS=":" |
||||||
|
local arr=(${key_values}) |
||||||
|
echo ${arr[1]} |
||||||
|
} |
||||||
|
|
||||||
|
function parse_second_value() { |
||||||
|
local key_values=$1 |
||||||
|
local IFS=":" |
||||||
|
local arr=(${key_values}) |
||||||
|
echo ${arr[2]} |
||||||
|
} |
||||||
|
|
||||||
|
function run_command() { |
||||||
|
local cmd="$1" |
||||||
|
local log_path="$2" |
||||||
|
if [ -n "${log_path}" ]; then |
||||||
|
eval ${cmd} | tee "${log_path}" |
||||||
|
test ${PIPESTATUS[0]} -eq 0 |
||||||
|
else |
||||||
|
eval ${cmd} |
||||||
|
fi |
||||||
|
} |
@ -0,0 +1,252 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
|
||||||
|
import argparse |
||||||
|
import os.path as osp |
||||||
|
from collections.abc import Mapping |
||||||
|
|
||||||
|
import yaml |
||||||
|
|
||||||
|
|
||||||
|
def _chain_maps(*maps): |
||||||
|
chained = dict() |
||||||
|
keys = set().union(*maps) |
||||||
|
for key in keys: |
||||||
|
vals = [m[key] for m in maps if key in m] |
||||||
|
if isinstance(vals[0], Mapping): |
||||||
|
chained[key] = _chain_maps(*vals) |
||||||
|
else: |
||||||
|
chained[key] = vals[0] |
||||||
|
return chained |
||||||
|
|
||||||
|
|
||||||
|
def read_config(config_path): |
||||||
|
with open(config_path, 'r', encoding='utf-8') as f: |
||||||
|
cfg = yaml.safe_load(f) |
||||||
|
return cfg or {} |
||||||
|
|
||||||
|
|
||||||
|
def parse_configs(cfg_path, inherit=True): |
||||||
|
if inherit: |
||||||
|
cfgs = [] |
||||||
|
cfgs.append(read_config(cfg_path)) |
||||||
|
while cfgs[-1].get('_base_'): |
||||||
|
base_path = cfgs[-1].pop('_base_') |
||||||
|
curr_dir = osp.dirname(cfg_path) |
||||||
|
cfgs.append( |
||||||
|
read_config(osp.normpath(osp.join(curr_dir, base_path)))) |
||||||
|
return _chain_maps(*cfgs) |
||||||
|
else: |
||||||
|
return read_config(cfg_path) |
||||||
|
|
||||||
|
|
||||||
|
def _cfg2args(cfg, parser, prefix=''): |
||||||
|
node_keys = set() |
||||||
|
for k, v in cfg.items(): |
||||||
|
opt = prefix + k |
||||||
|
if isinstance(v, list): |
||||||
|
if len(v) == 0: |
||||||
|
parser.add_argument( |
||||||
|
'--' + opt, type=object, nargs='*', default=v) |
||||||
|
else: |
||||||
|
# Only apply to homogeneous lists |
||||||
|
if isinstance(v[0], CfgNode): |
||||||
|
node_keys.add(opt) |
||||||
|
parser.add_argument( |
||||||
|
'--' + opt, type=type(v[0]), nargs='*', default=v) |
||||||
|
elif isinstance(v, dict): |
||||||
|
# Recursively parse a dict |
||||||
|
_, new_node_keys = _cfg2args(v, parser, opt + '.') |
||||||
|
node_keys.update(new_node_keys) |
||||||
|
elif isinstance(v, CfgNode): |
||||||
|
node_keys.add(opt) |
||||||
|
_, new_node_keys = _cfg2args(v.to_dict(), parser, opt + '.') |
||||||
|
node_keys.update(new_node_keys) |
||||||
|
elif isinstance(v, bool): |
||||||
|
parser.add_argument('--' + opt, action='store_true', default=v) |
||||||
|
else: |
||||||
|
parser.add_argument('--' + opt, type=type(v), default=v) |
||||||
|
return parser, node_keys |
||||||
|
|
||||||
|
|
||||||
|
def _args2cfg(cfg, args, node_keys): |
||||||
|
args = vars(args) |
||||||
|
for k, v in args.items(): |
||||||
|
pos = k.find('.') |
||||||
|
if pos != -1: |
||||||
|
# Iteratively parse a dict |
||||||
|
dict_ = cfg |
||||||
|
while pos != -1: |
||||||
|
dict_.setdefault(k[:pos], {}) |
||||||
|
dict_ = dict_[k[:pos]] |
||||||
|
k = k[pos + 1:] |
||||||
|
pos = k.find('.') |
||||||
|
dict_[k] = v |
||||||
|
else: |
||||||
|
cfg[k] = v |
||||||
|
|
||||||
|
for k in node_keys: |
||||||
|
pos = k.find('.') |
||||||
|
if pos != -1: |
||||||
|
# Iteratively parse a dict |
||||||
|
dict_ = cfg |
||||||
|
while pos != -1: |
||||||
|
dict_.setdefault(k[:pos], {}) |
||||||
|
dict_ = dict_[k[:pos]] |
||||||
|
k = k[pos + 1:] |
||||||
|
pos = k.find('.') |
||||||
|
v = dict_[k] |
||||||
|
dict_[k] = [CfgNode(v_) for v_ in v] if isinstance( |
||||||
|
v, list) else CfgNode(v) |
||||||
|
else: |
||||||
|
v = cfg[k] |
||||||
|
cfg[k] = [CfgNode(v_) for v_ in v] if isinstance( |
||||||
|
v, list) else CfgNode(v) |
||||||
|
|
||||||
|
return cfg |
||||||
|
|
||||||
|
|
||||||
|
def parse_args(*args, **kwargs): |
||||||
|
cfg_parser = argparse.ArgumentParser(add_help=False) |
||||||
|
cfg_parser.add_argument('--config', type=str, default='') |
||||||
|
cfg_parser.add_argument('--inherit_off', action='store_true') |
||||||
|
cfg_args = cfg_parser.parse_known_args()[0] |
||||||
|
cfg_path = cfg_args.config |
||||||
|
inherit_on = not cfg_args.inherit_off |
||||||
|
|
||||||
|
# Main parser |
||||||
|
parser = argparse.ArgumentParser( |
||||||
|
conflict_handler='resolve', parents=[cfg_parser]) |
||||||
|
# Global settings |
||||||
|
parser.add_argument('cmd', choices=['train', 'eval']) |
||||||
|
parser.add_argument('task', choices=['cd', 'clas', 'det', 'seg']) |
||||||
|
|
||||||
|
# Data |
||||||
|
parser.add_argument('--datasets', type=dict, default={}) |
||||||
|
parser.add_argument('--transforms', type=dict, default={}) |
||||||
|
parser.add_argument('--download_on', action='store_true') |
||||||
|
parser.add_argument('--download_url', type=str, default='') |
||||||
|
parser.add_argument('--download_path', type=str, default='./') |
||||||
|
|
||||||
|
# Optimizer |
||||||
|
parser.add_argument('--optimizer', type=dict, default={}) |
||||||
|
|
||||||
|
# Training related |
||||||
|
parser.add_argument('--num_epochs', type=int, default=100) |
||||||
|
parser.add_argument('--train_batch_size', type=int, default=8) |
||||||
|
parser.add_argument('--save_interval_epochs', type=int, default=1) |
||||||
|
parser.add_argument('--log_interval_steps', type=int, default=1) |
||||||
|
parser.add_argument('--save_dir', default='../exp/') |
||||||
|
parser.add_argument('--learning_rate', type=float, default=0.01) |
||||||
|
parser.add_argument('--early_stop', action='store_true') |
||||||
|
parser.add_argument('--early_stop_patience', type=int, default=5) |
||||||
|
parser.add_argument('--use_vdl', action='store_true') |
||||||
|
parser.add_argument('--resume_checkpoint', type=str) |
||||||
|
parser.add_argument('--train', type=dict, default={}) |
||||||
|
|
||||||
|
# Loss |
||||||
|
parser.add_argument('--losses', type=dict, nargs='+', default={}) |
||||||
|
|
||||||
|
# Model |
||||||
|
parser.add_argument('--model', type=dict, default={}) |
||||||
|
|
||||||
|
if osp.exists(cfg_path): |
||||||
|
cfg = parse_configs(cfg_path, inherit_on) |
||||||
|
parser, node_keys = _cfg2args(cfg, parser, '') |
||||||
|
args = parser.parse_args(*args, **kwargs) |
||||||
|
return _args2cfg(dict(), args, node_keys) |
||||||
|
elif cfg_path != '': |
||||||
|
raise FileNotFoundError |
||||||
|
else: |
||||||
|
args = parser.parse_args() |
||||||
|
return _args2cfg(dict(), args, set()) |
||||||
|
|
||||||
|
|
||||||
|
class _CfgNodeMeta(yaml.YAMLObjectMetaclass): |
||||||
|
def __call__(cls, obj): |
||||||
|
if isinstance(obj, CfgNode): |
||||||
|
return obj |
||||||
|
return super(_CfgNodeMeta, cls).__call__(obj) |
||||||
|
|
||||||
|
|
||||||
|
class CfgNode(yaml.YAMLObject, metaclass=_CfgNodeMeta): |
||||||
|
yaml_tag = u'!Node' |
||||||
|
yaml_loader = yaml.SafeLoader |
||||||
|
# By default use a lexical scope |
||||||
|
ctx = globals() |
||||||
|
|
||||||
|
def __init__(self, dict_): |
||||||
|
super().__init__() |
||||||
|
self.type = dict_['type'] |
||||||
|
self.args = dict_.get('args', []) |
||||||
|
self.module = self._get_module(dict_.get('module', '')) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def set_context(cls, ctx): |
||||||
|
# TODO: Implement dynamic scope with inspect.stack() |
||||||
|
old_ctx = cls.ctx |
||||||
|
cls.ctx = ctx |
||||||
|
return old_ctx |
||||||
|
|
||||||
|
def build_object(self, mod=None): |
||||||
|
if mod is None: |
||||||
|
mod = self.module |
||||||
|
cls = getattr(mod, self.type) |
||||||
|
if isinstance(self.args, list): |
||||||
|
args = build_objects(self.args) |
||||||
|
obj = cls(*args) |
||||||
|
elif isinstance(self.args, dict): |
||||||
|
args = build_objects(self.args) |
||||||
|
obj = cls(**args) |
||||||
|
else: |
||||||
|
raise NotImplementedError |
||||||
|
return obj |
||||||
|
|
||||||
|
def _get_module(self, s): |
||||||
|
mod = None |
||||||
|
while s: |
||||||
|
idx = s.find('.') |
||||||
|
if idx == -1: |
||||||
|
next_ = s |
||||||
|
s = '' |
||||||
|
else: |
||||||
|
next_ = s[:idx] |
||||||
|
s = s[idx + 1:] |
||||||
|
if mod is None: |
||||||
|
mod = self.ctx[next_] |
||||||
|
else: |
||||||
|
mod = getattr(mod, next_) |
||||||
|
return mod |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def build_objects(cfg, mod=None): |
||||||
|
if isinstance(cfg, list): |
||||||
|
return [CfgNode.build_objects(c, mod=mod) for c in cfg] |
||||||
|
elif isinstance(cfg, CfgNode): |
||||||
|
return cfg.build_object(mod=mod) |
||||||
|
elif isinstance(cfg, dict): |
||||||
|
return { |
||||||
|
k: CfgNode.build_objects( |
||||||
|
v, mod=mod) |
||||||
|
for k, v in cfg.items() |
||||||
|
} |
||||||
|
else: |
||||||
|
return cfg |
||||||
|
|
||||||
|
def __repr__(self): |
||||||
|
return f"(type={self.type}, args={self.args}, module={self.module or ' '})" |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def from_yaml(cls, loader, node): |
||||||
|
map_ = loader.construct_mapping(node) |
||||||
|
return cls(map_) |
||||||
|
|
||||||
|
def items(self): |
||||||
|
yield from [('type', self.type), ('args', self.args), ('module', |
||||||
|
self.module)] |
||||||
|
|
||||||
|
def to_dict(self): |
||||||
|
return dict(self.items()) |
||||||
|
|
||||||
|
|
||||||
|
def build_objects(cfg, mod=None): |
||||||
|
return CfgNode.build_objects(cfg, mod=mod) |
@ -0,0 +1,70 @@ |
|||||||
|
# Basic configurations of AirChange dataset |
||||||
|
|
||||||
|
datasets: |
||||||
|
train: !Node |
||||||
|
type: CDDataset |
||||||
|
args: |
||||||
|
data_dir: ./test_tipc/data/airchange/ |
||||||
|
file_list: ./test_tipc/data/airchange/train.txt |
||||||
|
label_list: null |
||||||
|
num_workers: 0 |
||||||
|
shuffle: True |
||||||
|
with_seg_labels: False |
||||||
|
binarize_labels: True |
||||||
|
eval: !Node |
||||||
|
type: CDDataset |
||||||
|
args: |
||||||
|
data_dir: ./test_tipc/data/airchange/ |
||||||
|
file_list: ./test_tipc/data/airchange/eval.txt |
||||||
|
label_list: null |
||||||
|
num_workers: 0 |
||||||
|
shuffle: False |
||||||
|
with_seg_labels: False |
||||||
|
binarize_labels: True |
||||||
|
transforms: |
||||||
|
train: |
||||||
|
- !Node |
||||||
|
type: DecodeImg |
||||||
|
- !Node |
||||||
|
type: RandomCrop |
||||||
|
args: |
||||||
|
crop_size: 256 |
||||||
|
aspect_ratio: [0.5, 2.0] |
||||||
|
scaling: [0.2, 1.0] |
||||||
|
- !Node |
||||||
|
type: RandomHorizontalFlip |
||||||
|
args: |
||||||
|
prob: 0.5 |
||||||
|
- !Node |
||||||
|
type: Normalize |
||||||
|
args: |
||||||
|
mean: [0.5, 0.5, 0.5] |
||||||
|
std: [0.5, 0.5, 0.5] |
||||||
|
- !Node |
||||||
|
type: ArrangeChangeDetector |
||||||
|
args: ['train'] |
||||||
|
eval: |
||||||
|
- !Node |
||||||
|
type: DecodeImg |
||||||
|
- !Node |
||||||
|
type: Normalize |
||||||
|
args: |
||||||
|
mean: [0.5, 0.5, 0.5] |
||||||
|
std: [0.5, 0.5, 0.5] |
||||||
|
- !Node |
||||||
|
type: ArrangeChangeDetector |
||||||
|
args: ['eval'] |
||||||
|
download_on: False |
||||||
|
download_url: https://paddlers.bj.bcebos.com/datasets/airchange.zip |
||||||
|
download_path: ./test_tipc/data/ |
||||||
|
|
||||||
|
num_epochs: 5 |
||||||
|
train_batch_size: 4 |
||||||
|
save_interval_epochs: 3 |
||||||
|
log_interval_steps: 50 |
||||||
|
save_dir: ./test_tipc/output/cd/ |
||||||
|
learning_rate: 0.01 |
||||||
|
early_stop: False |
||||||
|
early_stop_patience: 5 |
||||||
|
use_vdl: False |
||||||
|
resume_checkpoint: '' |
@ -0,0 +1,8 @@ |
|||||||
|
# Basic configurations of BIT |
||||||
|
|
||||||
|
_base_: ../_base_/airchange.yaml |
||||||
|
|
||||||
|
save_dir: ./test_tipc/output/cd/bit/ |
||||||
|
|
||||||
|
model: !Node |
||||||
|
type: BIT |
@ -0,0 +1,53 @@ |
|||||||
|
===========================train_params=========================== |
||||||
|
model_name:cd:bit |
||||||
|
python:python |
||||||
|
gpu_list:0|0,1 |
||||||
|
use_gpu:null|null |
||||||
|
--precision:null |
||||||
|
--num_epochs:lite_train_lite_infer=5|lite_train_whole_infer=5|whole_train_whole_infer=10 |
||||||
|
--save_dir:adaptive |
||||||
|
--train_batch_size:lite_train_lite_infer=4|lite_train_whole_infer=4|whole_train_whole_infer=4 |
||||||
|
--model_path:null |
||||||
|
train_model_name:best_model |
||||||
|
train_infer_file_list:./test_tipc/data/airchange/:./test_tipc/data/airchange/eval.txt |
||||||
|
null:null |
||||||
|
## |
||||||
|
trainer:norm |
||||||
|
norm_train:test_tipc/run_task.py train cd --config ./test_tipc/configs/cd/bit/bit.yaml |
||||||
|
pact_train:null |
||||||
|
fpgm_train:null |
||||||
|
distill_train:null |
||||||
|
null:null |
||||||
|
null:null |
||||||
|
## |
||||||
|
===========================eval_params=========================== |
||||||
|
eval:null |
||||||
|
null:null |
||||||
|
## |
||||||
|
===========================export_params=========================== |
||||||
|
--save_dir:adaptive |
||||||
|
--model_dir:adaptive |
||||||
|
--fixed_input_shape:[-1,3,256,256] |
||||||
|
norm_export:deploy/export/export_model.py |
||||||
|
quant_export:null |
||||||
|
fpgm_export:null |
||||||
|
distill_export:null |
||||||
|
export1:null |
||||||
|
export2:null |
||||||
|
===========================infer_params=========================== |
||||||
|
infer_model:null |
||||||
|
infer_export:null |
||||||
|
infer_quant:False |
||||||
|
inference:test_tipc/infer.py |
||||||
|
--device:cpu|gpu |
||||||
|
--enable_mkldnn:True |
||||||
|
--cpu_threads:6 |
||||||
|
--batch_size:1 |
||||||
|
--use_trt:False |
||||||
|
--precision:fp32 |
||||||
|
--model_dir:null |
||||||
|
--file_list:null:null |
||||||
|
--save_log_path:null |
||||||
|
--benchmark:True |
||||||
|
--model_name:bit |
||||||
|
null:null |
@ -0,0 +1,72 @@ |
|||||||
|
# Basic configurations of UCMerced dataset |
||||||
|
|
||||||
|
datasets: |
||||||
|
train: !Node |
||||||
|
type: ClasDataset |
||||||
|
args: |
||||||
|
data_dir: ./test_tipc/data/ucmerced/ |
||||||
|
file_list: ./test_tipc/data/ucmerced/train.txt |
||||||
|
label_list: ./test_tipc/data/ucmerced/labels.txt |
||||||
|
num_workers: 0 |
||||||
|
shuffle: True |
||||||
|
eval: !Node |
||||||
|
type: ClasDataset |
||||||
|
args: |
||||||
|
data_dir: ./test_tipc/data/ucmerced/ |
||||||
|
file_list: ./test_tipc/data/ucmerced/val.txt |
||||||
|
label_list: ./test_tipc/data/ucmerced/labels.txt |
||||||
|
num_workers: 0 |
||||||
|
shuffle: False |
||||||
|
transforms: |
||||||
|
train: |
||||||
|
- !Node |
||||||
|
type: DecodeImg |
||||||
|
- !Node |
||||||
|
type: Resize |
||||||
|
args: |
||||||
|
target_size: 256 |
||||||
|
- !Node |
||||||
|
type: RandomHorizontalFlip |
||||||
|
args: |
||||||
|
prob: 0.5 |
||||||
|
- !Node |
||||||
|
type: RandomVerticalFlip |
||||||
|
args: |
||||||
|
prob: 0.5 |
||||||
|
- !Node |
||||||
|
type: Normalize |
||||||
|
args: |
||||||
|
mean: [0.5, 0.5, 0.5] |
||||||
|
std: [0.5, 0.5, 0.5] |
||||||
|
- !Node |
||||||
|
type: ArrangeClassifier |
||||||
|
args: ['train'] |
||||||
|
eval: |
||||||
|
- !Node |
||||||
|
type: DecodeImg |
||||||
|
- !Node |
||||||
|
type: Resize |
||||||
|
args: |
||||||
|
target_size: 256 |
||||||
|
- !Node |
||||||
|
type: Normalize |
||||||
|
args: |
||||||
|
mean: [0.5, 0.5, 0.5] |
||||||
|
std: [0.5, 0.5, 0.5] |
||||||
|
- !Node |
||||||
|
type: ArrangeClassifier |
||||||
|
args: ['eval'] |
||||||
|
download_on: False |
||||||
|
download_url: https://paddlers.bj.bcebos.com/datasets/ucmerced.zip |
||||||
|
download_path: ./test_tipc/data/ |
||||||
|
|
||||||
|
num_epochs: 2 |
||||||
|
train_batch_size: 16 |
||||||
|
save_interval_epochs: 5 |
||||||
|
log_interval_steps: 50 |
||||||
|
save_dir: e./test_tipc/output/clas/ |
||||||
|
learning_rate: 0.01 |
||||||
|
early_stop: False |
||||||
|
early_stop_patience: 5 |
||||||
|
use_vdl: False |
||||||
|
resume_checkpoint: '' |
@ -0,0 +1,10 @@ |
|||||||
|
# Basic configurations of HRNet |
||||||
|
|
||||||
|
_base_: ../_base_/ucmerced.yaml |
||||||
|
|
||||||
|
save_dir: ./test_tipc/output/clas/hrnet/ |
||||||
|
|
||||||
|
model: !Node |
||||||
|
type: HRNet_W18_C |
||||||
|
args: |
||||||
|
num_classes: 21 |
@ -0,0 +1,53 @@ |
|||||||
|
===========================train_params=========================== |
||||||
|
model_name:clas:hrnet |
||||||
|
python:python |
||||||
|
gpu_list:0|0,1 |
||||||
|
use_gpu:null|null |
||||||
|
--precision:null |
||||||
|
--num_epochs:lite_train_lite_infer=3|lite_train_whole_infer=3|whole_train_whole_infer=10 |
||||||
|
--save_dir:adaptive |
||||||
|
--train_batch_size:lite_train_lite_infer=16|lite_train_whole_infer=16|whole_train_whole_infer=16 |
||||||
|
--model_path:null |
||||||
|
train_model_name:best_model |
||||||
|
train_infer_file_list:./test_tipc/data/ucmerced/:./test_tipc/data/ucmerced/val.txt |
||||||
|
null:null |
||||||
|
## |
||||||
|
trainer:norm |
||||||
|
norm_train:test_tipc/run_task.py train clas --config ./test_tipc/configs/clas/hrnet/hrnet.yaml |
||||||
|
pact_train:null |
||||||
|
fpgm_train:null |
||||||
|
distill_train:null |
||||||
|
null:null |
||||||
|
null:null |
||||||
|
## |
||||||
|
===========================eval_params=========================== |
||||||
|
eval:null |
||||||
|
null:null |
||||||
|
## |
||||||
|
===========================export_params=========================== |
||||||
|
--save_dir:adaptive |
||||||
|
--model_dir:adaptive |
||||||
|
--fixed_input_shape:[-1,3,256,256] |
||||||
|
norm_export:deploy/export/export_model.py |
||||||
|
quant_export:null |
||||||
|
fpgm_export:null |
||||||
|
distill_export:null |
||||||
|
export1:null |
||||||
|
export2:null |
||||||
|
===========================infer_params=========================== |
||||||
|
infer_model:null |
||||||
|
infer_export:null |
||||||
|
infer_quant:False |
||||||
|
inference:test_tipc/infer.py |
||||||
|
--device:cpu|gpu |
||||||
|
--enable_mkldnn:True |
||||||
|
--cpu_threads:6 |
||||||
|
--batch_size:1 |
||||||
|
--use_trt:False |
||||||
|
--precision:fp32 |
||||||
|
--model_dir:null |
||||||
|
--file_list:null:null |
||||||
|
--save_log_path:null |
||||||
|
--benchmark:True |
||||||
|
--model_name:hrnet |
||||||
|
null:null |
@ -0,0 +1,74 @@ |
|||||||
|
# Basic configurations of SARShip dataset |
||||||
|
|
||||||
|
datasets: |
||||||
|
train: !Node |
||||||
|
type: VOCDetDataset |
||||||
|
args: |
||||||
|
data_dir: ./test_tipc/data/sarship/ |
||||||
|
file_list: ./test_tipc/data/sarship/train.txt |
||||||
|
label_list: ./test_tipc/data/sarship/labels.txt |
||||||
|
shuffle: True |
||||||
|
eval: !Node |
||||||
|
type: VOCDetDataset |
||||||
|
args: |
||||||
|
data_dir: ./test_tipc/data/sarship/ |
||||||
|
file_list: ./test_tipc/data/sarship/eval.txt |
||||||
|
label_list: ./test_tipc/data/sarship/labels.txt |
||||||
|
shuffle: False |
||||||
|
transforms: |
||||||
|
train: |
||||||
|
- !Node |
||||||
|
type: DecodeImg |
||||||
|
- !Node |
||||||
|
type: RandomDistort |
||||||
|
- !Node |
||||||
|
type: RandomExpand |
||||||
|
- !Node |
||||||
|
type: RandomCrop |
||||||
|
- !Node |
||||||
|
type: RandomHorizontalFlip |
||||||
|
- !Node |
||||||
|
type: BatchRandomResize |
||||||
|
args: |
||||||
|
target_sizes: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608] |
||||||
|
interp: RANDOM |
||||||
|
- !Node |
||||||
|
type: Normalize |
||||||
|
args: |
||||||
|
mean: [0.485, 0.456, 0.406] |
||||||
|
std: [0.229, 0.224, 0.225] |
||||||
|
- !Node |
||||||
|
type: ArrangeDetector |
||||||
|
args: ['train'] |
||||||
|
eval: |
||||||
|
- !Node |
||||||
|
type: DecodeImg |
||||||
|
- !Node |
||||||
|
type: Resize |
||||||
|
args: |
||||||
|
target_size: 608 |
||||||
|
interp: CUBIC |
||||||
|
- !Node |
||||||
|
type: Normalize |
||||||
|
args: |
||||||
|
mean: [0.485, 0.456, 0.406] |
||||||
|
std: [0.229, 0.224, 0.225] |
||||||
|
- !Node |
||||||
|
type: ArrangeDetector |
||||||
|
args: ['eval'] |
||||||
|
download_on: False |
||||||
|
download_url: https://paddlers.bj.bcebos.com/datasets/sarship.zip |
||||||
|
download_path: ./test_tipc/data/ |
||||||
|
|
||||||
|
num_epochs: 10 |
||||||
|
train_batch_size: 4 |
||||||
|
save_interval_epochs: 5 |
||||||
|
log_interval_steps: 4 |
||||||
|
save_dir: ./test_tipc/output/det/ |
||||||
|
learning_rate: 0.0005 |
||||||
|
use_vdl: False |
||||||
|
resume_checkpoint: '' |
||||||
|
train: |
||||||
|
pretrain_weights: COCO |
||||||
|
warmup_steps: 0 |
||||||
|
warmup_start_lr: 0.0 |
@ -0,0 +1,10 @@ |
|||||||
|
# Basic configurations of PP-YOLO |
||||||
|
|
||||||
|
_base_: ../_base_/sarship.yaml |
||||||
|
|
||||||
|
save_dir: ./test_tipc/output/det/ppyolo/ |
||||||
|
|
||||||
|
model: !Node |
||||||
|
type: PPYOLO |
||||||
|
args: |
||||||
|
num_classes: 1 |
@ -0,0 +1,53 @@ |
|||||||
|
===========================train_params=========================== |
||||||
|
model_name:det:ppyolo |
||||||
|
python:python |
||||||
|
gpu_list:0|0,1 |
||||||
|
use_gpu:null|null |
||||||
|
--precision:null |
||||||
|
--num_epochs:lite_train_lite_infer=3|lite_train_whole_infer=3|whole_train_whole_infer=10 |
||||||
|
--save_dir:adaptive |
||||||
|
--train_batch_size:lite_train_lite_infer=4|lite_train_whole_infer=4|whole_train_whole_infer=4 |
||||||
|
--model_path:null |
||||||
|
train_model_name:best_model |
||||||
|
train_infer_file_list:./test_tipc/data/sarship/:./test_tipc/data/sarship/eval.txt |
||||||
|
null:null |
||||||
|
## |
||||||
|
trainer:norm |
||||||
|
norm_train:test_tipc/run_task.py train det --config ./test_tipc/configs/det/ppyolo/ppyolo.yaml |
||||||
|
pact_train:null |
||||||
|
fpgm_train:null |
||||||
|
distill_train:null |
||||||
|
null:null |
||||||
|
null:null |
||||||
|
## |
||||||
|
===========================eval_params=========================== |
||||||
|
eval:null |
||||||
|
null:null |
||||||
|
## |
||||||
|
===========================export_params=========================== |
||||||
|
--save_dir:adaptive |
||||||
|
--model_dir:adaptive |
||||||
|
--fixed_input_shape:[-1,3,608,608] |
||||||
|
norm_export:deploy/export/export_model.py |
||||||
|
quant_export:null |
||||||
|
fpgm_export:null |
||||||
|
distill_export:null |
||||||
|
export1:null |
||||||
|
export2:null |
||||||
|
===========================infer_params=========================== |
||||||
|
infer_model:null |
||||||
|
infer_export:null |
||||||
|
infer_quant:False |
||||||
|
inference:test_tipc/infer.py |
||||||
|
--device:cpu|gpu |
||||||
|
--enable_mkldnn:True |
||||||
|
--cpu_threads:6 |
||||||
|
--batch_size:1 |
||||||
|
--use_trt:False |
||||||
|
--precision:fp32 |
||||||
|
--model_dir:null |
||||||
|
--file_list:null:null |
||||||
|
--save_log_path:null |
||||||
|
--benchmark:True |
||||||
|
--model_name:ppyolo |
||||||
|
null:null |
@ -0,0 +1,68 @@ |
|||||||
|
# Basic configurations of RSSeg dataset |
||||||
|
|
||||||
|
datasets: |
||||||
|
train: !Node |
||||||
|
type: SegDataset |
||||||
|
args: |
||||||
|
data_dir: ./test_tipc/data/rsseg/ |
||||||
|
file_list: ./test_tipc/data/rsseg/train.txt |
||||||
|
label_list: ./test_tipc/data/rsseg/labels.txt |
||||||
|
num_workers: 0 |
||||||
|
shuffle: True |
||||||
|
eval: !Node |
||||||
|
type: SegDataset |
||||||
|
args: |
||||||
|
data_dir: ./test_tipc/data/rsseg/ |
||||||
|
file_list: ./test_tipc/data/rsseg/val.txt |
||||||
|
label_list: ./test_tipc/data/rsseg/labels.txt |
||||||
|
num_workers: 0 |
||||||
|
shuffle: False |
||||||
|
transforms: |
||||||
|
train: |
||||||
|
- !Node |
||||||
|
type: DecodeImg |
||||||
|
- !Node |
||||||
|
type: Resize |
||||||
|
args: |
||||||
|
target_size: 512 |
||||||
|
- !Node |
||||||
|
type: RandomHorizontalFlip |
||||||
|
args: |
||||||
|
prob: 0.5 |
||||||
|
- !Node |
||||||
|
type: Normalize |
||||||
|
args: |
||||||
|
mean: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5] |
||||||
|
std: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5] |
||||||
|
- !Node |
||||||
|
type: ArrangeSegmenter |
||||||
|
args: ['train'] |
||||||
|
eval: |
||||||
|
- !Node |
||||||
|
type: DecodeImg |
||||||
|
- !Node |
||||||
|
type: Resize |
||||||
|
args: |
||||||
|
target_size: 512 |
||||||
|
- !Node |
||||||
|
type: Normalize |
||||||
|
args: |
||||||
|
mean: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5] |
||||||
|
std: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5] |
||||||
|
- !Node |
||||||
|
type: ArrangeSegmenter |
||||||
|
args: ['eval'] |
||||||
|
download_on: False |
||||||
|
download_url: https://paddlers.bj.bcebos.com/datasets/rsseg.zip |
||||||
|
download_path: ./test_tipc/data/ |
||||||
|
|
||||||
|
num_epochs: 10 |
||||||
|
train_batch_size: 4 |
||||||
|
save_interval_epochs: 5 |
||||||
|
log_interval_steps: 4 |
||||||
|
save_dir: ./test_tipc/output/seg/ |
||||||
|
learning_rate: 0.001 |
||||||
|
early_stop: False |
||||||
|
early_stop_patience: 5 |
||||||
|
use_vdl: False |
||||||
|
resume_checkpoint: '' |
@ -0,0 +1,53 @@ |
|||||||
|
===========================train_params=========================== |
||||||
|
model_name:seg:unet |
||||||
|
python:python |
||||||
|
gpu_list:0|0,1 |
||||||
|
use_gpu:null|null |
||||||
|
--precision:null |
||||||
|
--num_epochs:lite_train_lite_infer=3|lite_train_whole_infer=3|whole_train_whole_infer=10 |
||||||
|
--save_dir:adaptive |
||||||
|
--train_batch_size:lite_train_lite_infer=4|lite_train_whole_infer=4|whole_train_whole_infer=4 |
||||||
|
--model_path:null |
||||||
|
train_model_name:best_model |
||||||
|
train_infer_file_list:./test_tipc/data/rsseg/:./test_tipc/data/rsseg/val.txt |
||||||
|
null:null |
||||||
|
## |
||||||
|
trainer:norm |
||||||
|
norm_train:test_tipc/run_task.py train seg --config ./test_tipc/configs/seg/unet/unet.yaml |
||||||
|
pact_train:null |
||||||
|
fpgm_train:null |
||||||
|
distill_train:null |
||||||
|
null:null |
||||||
|
null:null |
||||||
|
## |
||||||
|
===========================eval_params=========================== |
||||||
|
eval:null |
||||||
|
null:null |
||||||
|
## |
||||||
|
===========================export_params=========================== |
||||||
|
--save_dir:adaptive |
||||||
|
--model_dir:adaptive |
||||||
|
--fixed_input_shape:[-1,10,512,512] |
||||||
|
norm_export:deploy/export/export_model.py |
||||||
|
quant_export:null |
||||||
|
fpgm_export:null |
||||||
|
distill_export:null |
||||||
|
export1:null |
||||||
|
export2:null |
||||||
|
===========================infer_params=========================== |
||||||
|
infer_model:null |
||||||
|
infer_export:null |
||||||
|
infer_quant:False |
||||||
|
inference:test_tipc/infer.py |
||||||
|
--device:cpu|gpu |
||||||
|
--enable_mkldnn:True |
||||||
|
--cpu_threads:6 |
||||||
|
--batch_size:1 |
||||||
|
--use_trt:False |
||||||
|
--precision:fp32 |
||||||
|
--model_dir:null |
||||||
|
--file_list:null:null |
||||||
|
--save_log_path:null |
||||||
|
--benchmark:True |
||||||
|
--model_name:unet |
||||||
|
null:null |
@ -0,0 +1,11 @@ |
|||||||
|
# Basic configurations of UNet |
||||||
|
|
||||||
|
_base_: ../_base_/rsseg.yaml |
||||||
|
|
||||||
|
save_dir: ./test_tipc/output/seg/unet/ |
||||||
|
|
||||||
|
model: !Node |
||||||
|
type: UNet |
||||||
|
args: |
||||||
|
input_channel: 10 |
||||||
|
num_classes: 5 |
After Width: | Height: | Size: 138 KiB |
@ -0,0 +1,89 @@ |
|||||||
|
# Linux GPU/CPU 基础训练推理测试 |
||||||
|
|
||||||
|
Linux GPU/CPU 基础训练推理测试的主程序为`test_train_inference_python.sh`,可以测试基于Python的模型训练、评估、推理等基本功能。 |
||||||
|
|
||||||
|
## 1. 测试结论汇总 |
||||||
|
|
||||||
|
- 训练相关: |
||||||
|
|
||||||
|
| 任务类别 | 模型名称 | 单机单卡 | 单机多卡 | |
||||||
|
| :----: | :----: | :----: | :----: | |
||||||
|
| 变化检测 | BIT | 正常训练 | 正常训练 | |
||||||
|
| 场景分类 | HRNet | 正常训练 | 正常训练 | |
||||||
|
| 目标检测 | PP-YOLO | 正常训练 | 正常训练 | |
||||||
|
| 图像分割 | UNet | 正常训练 | 正常训练 | |
||||||
|
|
||||||
|
- 推理相关: |
||||||
|
|
||||||
|
| 任务类别 | 模型名称 | device_CPU | device_GPU | batchsize | |
||||||
|
| :----: | :----: | :----: | :----: | :----: | |
||||||
|
| 变化检测 | BIT | 支持 | 支持 | 1 | |
||||||
|
| 场景分类 | HRNet | 支持 | 支持 | 1 | |
||||||
|
| 目标检测 | YOLO | 支持 | 支持 | 1 | |
||||||
|
| 图像分割 | UNet | 支持 | 支持 | 1 | |
||||||
|
|
||||||
|
|
||||||
|
## 2. 测试流程 |
||||||
|
|
||||||
|
### 2.1 环境配置 |
||||||
|
|
||||||
|
除了安装PaddleRS以外,您还需要安装规范化日志输出工具AutoLog: |
||||||
|
``` |
||||||
|
pip install https://paddleocr.bj.bcebos.com/libs/auto_log-1.2.0-py3-none-any.whl |
||||||
|
``` |
||||||
|
|
||||||
|
### 2.2 功能测试 |
||||||
|
|
||||||
|
先运行`test_tipc/prepare.sh`准备数据和模型,然后运行`test_tipc/test_train_inference_python.sh`进行测试。测试过程中生成的日志文件均存储在`test_tipc/output/`目录。 |
||||||
|
|
||||||
|
`test_tipc/test_train_inference_python.sh`支持4种运行模式,分别是: |
||||||
|
|
||||||
|
- 模式1:lite_train_lite_infer,使用少量数据训练,用于快速验证训练到预测的流程是否能走通,不验证精度和速度; |
||||||
|
```shell |
||||||
|
bash ./test_tipc/prepare.sh test_tipc/configs/clas/hrnet/train_infer_python.txt lite_train_lite_infer |
||||||
|
bash ./test_tipc/test_train_inference.sh test_tipc/configs/clas/hrnet/train_infer_python.txt lite_train_lite_infer |
||||||
|
``` |
||||||
|
|
||||||
|
- 模式2:lite_train_whole_infer,使用少量数据训练,全量数据预测,用于验证训练后的模型执行预测时预测速度是否合理; |
||||||
|
```shell |
||||||
|
bash ./test_tipc/prepare.sh test_tipc/configs/clas/hrnet/train_infer_python.txt lite_train_whole_infer |
||||||
|
bash ./test_tipc/test_train_inference.sh test_tipc/configs/clas/hrnet/train_infer_python.txt lite_train_whole_infer |
||||||
|
``` |
||||||
|
|
||||||
|
- 模式3:whole_infer,不训练,使用全量数据预测,验证模型动转静是否正常,检查模型的预测时间和精度; |
||||||
|
```shell |
||||||
|
bash ./test_tipc/prepare.sh test_tipc/configs/clas/hrnet/train_infer_python.txt whole_infer |
||||||
|
# 用法1: |
||||||
|
bash ./test_tipc/test_train_inference.sh test_tipc/configs/clas/hrnet/train_infer_python.txt whole_infer |
||||||
|
# 用法2: 在指定GPU上执行预测,第三个传入参数为GPU编号 |
||||||
|
bash ./test_tipc/test_train_inference.sh test_tipc/configs/clas/hrnet/train_infer_python.txt whole_infer '1' |
||||||
|
``` |
||||||
|
|
||||||
|
- 模式4:whole_train_whole_infer,CE: 全量数据训练,全量数据预测,验证模型训练精度、预测精度、预测速度; |
||||||
|
```shell |
||||||
|
bash ./test_tipc/prepare.sh test_tipc/configs/clas/hrnet/train_infer_python.txt whole_train_whole_infer |
||||||
|
bash ./test_tipc/test_train_inference.sh test_tipc/configs/clas/hrnet/train_infer_python.txt whole_train_whole_infer |
||||||
|
``` |
||||||
|
|
||||||
|
运行相应指令后,在`test_tipc/output`目录中会自动保存运行日志。如lite_train_lite_infer模式下,该目录中可能存在以下文件: |
||||||
|
``` |
||||||
|
test_tipc/output/[task name]/[model name]/ |
||||||
|
|- results_python.log # 存储指令执行状态的日志 |
||||||
|
|- norm_gpus_0_autocast_null/ # GPU 0号卡上的训练日志和模型保存目录 |
||||||
|
...... |
||||||
|
|- python_infer_cpu_usemkldnn_True_threads_6_precision_fp32_batchsize_1.log # CPU上开启mkldnn,线程数设置为6,测试batch_size=1条件下的预测运行日志 |
||||||
|
|- python_infer_gpu_usetrt_True_precision_fp16_batchsize_1.log # GPU上开启TensorRT,测试batch_size=1的半精度预测运行日志 |
||||||
|
...... |
||||||
|
``` |
||||||
|
|
||||||
|
其中`results_python.log`中保存了每条指令的执行状态。如果指令运行成功,输出信息如下所示: |
||||||
|
``` |
||||||
|
Run successfully with command - hrnet - python test_tipc/infer.py --file_list ./test_tipc/data/ucmerced/ ./test_tipc/data/ucmerced/val.txt --device=gpu --use_trt=False --precision=fp32 --model_dir=./test_tipc/output/clas/hrnet/lite_train_lite_infer/norm_gpus_0,1_autocast_null/static/ --batch_size=1 --benchmark=True ! |
||||||
|
...... |
||||||
|
``` |
||||||
|
|
||||||
|
如果运行失败,输出信息如下所示: |
||||||
|
``` |
||||||
|
Run failed with command - hrnet - python test_tipc/infer.py --file_list ./test_tipc/data/ucmerced/ ./test_tipc/data/ucmerced/val.txt --device=gpu --use_trt=False --precision=fp32 --model_dir=./test_tipc/output/clas/hrnet/lite_train_lite_infer/norm_gpus_0,1_autocast_null/static/ --batch_size=1 --benchmark=True ! |
||||||
|
...... |
||||||
|
``` |
@ -0,0 +1,316 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
|
||||||
|
import os |
||||||
|
import os.path as osp |
||||||
|
import argparse |
||||||
|
from operator import itemgetter |
||||||
|
|
||||||
|
import numpy as np |
||||||
|
import paddle |
||||||
|
from paddle.inference import Config |
||||||
|
from paddle.inference import create_predictor |
||||||
|
from paddle.inference import PrecisionType |
||||||
|
from paddlers.tasks import load_model |
||||||
|
from paddlers.utils import logging |
||||||
|
|
||||||
|
|
||||||
|
class _bool(object): |
||||||
|
def __new__(cls, x): |
||||||
|
if isinstance(x, str): |
||||||
|
if x.lower() == 'false': |
||||||
|
return False |
||||||
|
elif x.lower() == 'true': |
||||||
|
return True |
||||||
|
return bool.__new__(x) |
||||||
|
|
||||||
|
|
||||||
|
class TIPCPredictor(object): |
||||||
|
def __init__(self, |
||||||
|
model_dir, |
||||||
|
device='cpu', |
||||||
|
gpu_id=0, |
||||||
|
cpu_thread_num=1, |
||||||
|
use_mkl=True, |
||||||
|
mkl_thread_num=4, |
||||||
|
use_trt=False, |
||||||
|
memory_optimize=True, |
||||||
|
trt_precision_mode='fp32', |
||||||
|
benchmark=False, |
||||||
|
model_name='', |
||||||
|
batch_size=1): |
||||||
|
self.model_dir = model_dir |
||||||
|
self._model = load_model(model_dir, with_net=False) |
||||||
|
|
||||||
|
if trt_precision_mode.lower() == 'fp32': |
||||||
|
trt_precision_mode = PrecisionType.Float32 |
||||||
|
elif trt_precision_mode.lower() == 'fp16': |
||||||
|
trt_precision_mode = PrecisionType.Float16 |
||||||
|
else: |
||||||
|
logging.error( |
||||||
|
"TensorRT precision mode {} is invalid. Supported modes are fp32 and fp16." |
||||||
|
.format(trt_precision_mode), |
||||||
|
exit=True) |
||||||
|
|
||||||
|
self.config = self.get_config( |
||||||
|
device=device, |
||||||
|
gpu_id=gpu_id, |
||||||
|
cpu_thread_num=cpu_thread_num, |
||||||
|
use_mkl=use_mkl, |
||||||
|
mkl_thread_num=mkl_thread_num, |
||||||
|
use_trt=use_trt, |
||||||
|
use_glog=False, |
||||||
|
memory_optimize=memory_optimize, |
||||||
|
max_trt_batch_size=1, |
||||||
|
trt_precision_mode=trt_precision_mode) |
||||||
|
self.predictor = create_predictor(self.config) |
||||||
|
|
||||||
|
self.batch_size = batch_size |
||||||
|
|
||||||
|
if benchmark: |
||||||
|
import auto_log |
||||||
|
pid = os.getpid() |
||||||
|
self.autolog = auto_log.AutoLogger( |
||||||
|
model_name=model_name, |
||||||
|
model_precision=trt_precision_mode, |
||||||
|
batch_size=batch_size, |
||||||
|
data_shape='dynamic', |
||||||
|
save_path=None, |
||||||
|
inference_config=self.config, |
||||||
|
pids=pid, |
||||||
|
process_name=None, |
||||||
|
gpu_ids=0, |
||||||
|
time_keys=[ |
||||||
|
'preprocess_time', 'inference_time', 'postprocess_time' |
||||||
|
], |
||||||
|
warmup=0, |
||||||
|
logger=logging) |
||||||
|
self.benchmark = benchmark |
||||||
|
|
||||||
|
def get_config(self, device, gpu_id, cpu_thread_num, use_mkl, |
||||||
|
mkl_thread_num, use_trt, use_glog, memory_optimize, |
||||||
|
max_trt_batch_size, trt_precision_mode): |
||||||
|
config = Config( |
||||||
|
osp.join(self.model_dir, 'model.pdmodel'), |
||||||
|
osp.join(self.model_dir, 'model.pdiparams')) |
||||||
|
|
||||||
|
if device == 'gpu': |
||||||
|
config.enable_use_gpu(200, gpu_id) |
||||||
|
config.switch_ir_optim(True) |
||||||
|
if use_trt: |
||||||
|
if self._model.model_type == 'segmenter': |
||||||
|
logging.warning( |
||||||
|
"Semantic segmentation models do not support TensorRT acceleration, " |
||||||
|
"TensorRT is forcibly disabled.") |
||||||
|
elif 'RCNN' in self._model.__class__.__name__: |
||||||
|
logging.warning( |
||||||
|
"RCNN models do not support TensorRT acceleration, " |
||||||
|
"TensorRT is forcibly disabled.") |
||||||
|
else: |
||||||
|
config.enable_tensorrt_engine( |
||||||
|
workspace_size=1 << 10, |
||||||
|
max_batch_size=max_trt_batch_size, |
||||||
|
min_subgraph_size=3, |
||||||
|
precision_mode=trt_precision_mode, |
||||||
|
use_static=False, |
||||||
|
use_calib_mode=False) |
||||||
|
else: |
||||||
|
config.disable_gpu() |
||||||
|
config.set_cpu_math_library_num_threads(cpu_thread_num) |
||||||
|
if use_mkl: |
||||||
|
if self._model.__class__.__name__ == 'MaskRCNN': |
||||||
|
logging.warning( |
||||||
|
"MaskRCNN does not support MKL-DNN, MKL-DNN is forcibly disabled" |
||||||
|
) |
||||||
|
else: |
||||||
|
try: |
||||||
|
# Cache 10 different shapes for mkldnn to avoid memory leak |
||||||
|
config.set_mkldnn_cache_capacity(10) |
||||||
|
config.enable_mkldnn() |
||||||
|
config.set_cpu_math_library_num_threads(mkl_thread_num) |
||||||
|
except Exception as e: |
||||||
|
logging.warning( |
||||||
|
"The current environment does not support MKL-DNN, MKL-DNN is disabled." |
||||||
|
) |
||||||
|
pass |
||||||
|
|
||||||
|
if not use_glog: |
||||||
|
config.disable_glog_info() |
||||||
|
if memory_optimize: |
||||||
|
config.enable_memory_optim() |
||||||
|
config.switch_use_feed_fetch_ops(False) |
||||||
|
return config |
||||||
|
|
||||||
|
def preprocess(self, images, transforms): |
||||||
|
preprocessed_samples = self._model._preprocess( |
||||||
|
images, transforms, to_tensor=False) |
||||||
|
if self._model.model_type == 'classifier': |
||||||
|
preprocessed_samples = {'image': preprocessed_samples[0]} |
||||||
|
elif self._model.model_type == 'segmenter': |
||||||
|
preprocessed_samples = { |
||||||
|
'image': preprocessed_samples[0], |
||||||
|
'ori_shape': preprocessed_samples[1] |
||||||
|
} |
||||||
|
elif self._model.model_type == 'detector': |
||||||
|
pass |
||||||
|
elif self._model.model_type == 'change_detector': |
||||||
|
preprocessed_samples = { |
||||||
|
'image': preprocessed_samples[0], |
||||||
|
'image2': preprocessed_samples[1], |
||||||
|
'ori_shape': preprocessed_samples[2] |
||||||
|
} |
||||||
|
else: |
||||||
|
logging.error( |
||||||
|
"Invalid model type {}".format(self._model.model_type), |
||||||
|
exit=True) |
||||||
|
return preprocessed_samples |
||||||
|
|
||||||
|
def postprocess(self, net_outputs, topk=1, ori_shape=None, transforms=None): |
||||||
|
if self._model.model_type == 'classifier': |
||||||
|
true_topk = min(self._model.num_classes, topk) |
||||||
|
if self._model._postprocess is None: |
||||||
|
self._model.build_postprocess_from_labels(topk) |
||||||
|
# XXX: Convert ndarray to tensor as self._model._postprocess requires |
||||||
|
assert len(net_outputs) == 1 |
||||||
|
net_outputs = paddle.to_tensor(net_outputs[0]) |
||||||
|
outputs = self._model._postprocess(net_outputs) |
||||||
|
class_ids = map(itemgetter('class_ids'), outputs) |
||||||
|
scores = map(itemgetter('scores'), outputs) |
||||||
|
label_names = map(itemgetter('label_names'), outputs) |
||||||
|
preds = [{ |
||||||
|
'class_ids_map': l, |
||||||
|
'scores_map': s, |
||||||
|
'label_names_map': n, |
||||||
|
} for l, s, n in zip(class_ids, scores, label_names)] |
||||||
|
elif self._model.model_type in ('segmenter', 'change_detector'): |
||||||
|
label_map, score_map = self._model._postprocess( |
||||||
|
net_outputs, |
||||||
|
batch_origin_shape=ori_shape, |
||||||
|
transforms=transforms.transforms) |
||||||
|
preds = [{ |
||||||
|
'label_map': l, |
||||||
|
'score_map': s |
||||||
|
} for l, s in zip(label_map, score_map)] |
||||||
|
elif self._model.model_type == 'detector': |
||||||
|
net_outputs = { |
||||||
|
k: v |
||||||
|
for k, v in zip(['bbox', 'bbox_num', 'mask'], net_outputs) |
||||||
|
} |
||||||
|
preds = self._model._postprocess(net_outputs) |
||||||
|
else: |
||||||
|
logging.error( |
||||||
|
"Invalid model type {}.".format(self._model.model_type), |
||||||
|
exit=True) |
||||||
|
|
||||||
|
return preds |
||||||
|
|
||||||
|
def _run(self, images, topk=1, transforms=None, time_it=False): |
||||||
|
if self.benchmark and time_it: |
||||||
|
self.autolog.times.start() |
||||||
|
|
||||||
|
preprocessed_input = self.preprocess(images, transforms) |
||||||
|
|
||||||
|
input_names = self.predictor.get_input_names() |
||||||
|
for name in input_names: |
||||||
|
input_tensor = self.predictor.get_input_handle(name) |
||||||
|
input_tensor.copy_from_cpu(preprocessed_input[name]) |
||||||
|
|
||||||
|
if self.benchmark and time_it: |
||||||
|
self.autolog.times.stamp() |
||||||
|
|
||||||
|
self.predictor.run() |
||||||
|
|
||||||
|
output_names = self.predictor.get_output_names() |
||||||
|
net_outputs = [] |
||||||
|
for name in output_names: |
||||||
|
output_tensor = self.predictor.get_output_handle(name) |
||||||
|
net_outputs.append(output_tensor.copy_to_cpu()) |
||||||
|
|
||||||
|
if self.benchmark and time_it: |
||||||
|
self.autolog.times.stamp() |
||||||
|
|
||||||
|
res = self.postprocess( |
||||||
|
net_outputs, |
||||||
|
topk, |
||||||
|
ori_shape=preprocessed_input.get('ori_shape', None), |
||||||
|
transforms=transforms) |
||||||
|
|
||||||
|
if self.benchmark and time_it: |
||||||
|
self.autolog.times.end(stamp=True) |
||||||
|
|
||||||
|
return res |
||||||
|
|
||||||
|
def predict(self, data_dir, file_list, topk=1, warmup_iters=5): |
||||||
|
transforms = self._model.test_transforms |
||||||
|
|
||||||
|
# Warm up |
||||||
|
iters = 0 |
||||||
|
while True: |
||||||
|
for images in self._parse_lines(data_dir, file_list): |
||||||
|
if iters >= warmup_iters: |
||||||
|
break |
||||||
|
self._run( |
||||||
|
images=images, |
||||||
|
topk=topk, |
||||||
|
transforms=transforms, |
||||||
|
time_it=False) |
||||||
|
iters += 1 |
||||||
|
else: |
||||||
|
continue |
||||||
|
break |
||||||
|
|
||||||
|
results = [] |
||||||
|
for images in self._parse_lines(data_dir, file_list): |
||||||
|
res = self._run( |
||||||
|
images=images, topk=topk, transforms=transforms, time_it=True) |
||||||
|
results.append(res) |
||||||
|
return results |
||||||
|
|
||||||
|
def _parse_lines(self, data_dir, file_list): |
||||||
|
with open(file_list, 'r') as f: |
||||||
|
batch = [] |
||||||
|
for line in f: |
||||||
|
items = line.strip().split() |
||||||
|
items = [osp.join(data_dir, item) for item in items] |
||||||
|
if self._model.model_type == 'change_detector': |
||||||
|
batch.append((items[0], items[1])) |
||||||
|
else: |
||||||
|
batch.append(items[0]) |
||||||
|
if len(batch) == self.batch_size: |
||||||
|
yield batch |
||||||
|
batch.clear() |
||||||
|
if 0 < len(batch) < self.batch_size: |
||||||
|
yield batch |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
parser = argparse.ArgumentParser() |
||||||
|
|
||||||
|
parser.add_argument('--file_list', type=str, nargs=2) |
||||||
|
parser.add_argument('--model_dir', type=str, default='./') |
||||||
|
parser.add_argument( |
||||||
|
'--device', type=str, choices=['cpu', 'gpu'], default='cpu') |
||||||
|
parser.add_argument('--enable_mkldnn', type=_bool, default=False) |
||||||
|
parser.add_argument('--cpu_threads', type=int, default=10) |
||||||
|
parser.add_argument('--use_trt', type=_bool, default=False) |
||||||
|
parser.add_argument( |
||||||
|
'--precision', type=str, choices=['fp32', 'fp16'], default='fp16') |
||||||
|
parser.add_argument('--batch_size', type=int, default=1) |
||||||
|
parser.add_argument('--benchmark', type=_bool, default=False) |
||||||
|
parser.add_argument('--model_name', type=str, default='') |
||||||
|
|
||||||
|
args = parser.parse_args() |
||||||
|
|
||||||
|
predictor = TIPCPredictor( |
||||||
|
args.model_dir, |
||||||
|
device=args.device, |
||||||
|
cpu_thread_num=args.cpu_threads, |
||||||
|
use_mkl=args.enable_mkldnn, |
||||||
|
mkl_thread_num=args.cpu_threads, |
||||||
|
use_trt=args.use_trt, |
||||||
|
trt_precision_mode=args.precision, |
||||||
|
benchmark=args.benchmark) |
||||||
|
|
||||||
|
predictor.predict(args.file_list[0], args.file_list[1]) |
||||||
|
|
||||||
|
if args.benchmark: |
||||||
|
predictor.autolog.report() |
@ -0,0 +1,43 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
|
||||||
|
source test_tipc/common_func.sh |
||||||
|
|
||||||
|
set -o errexit |
||||||
|
set -o nounset |
||||||
|
|
||||||
|
FILENAME=$1 |
||||||
|
# $MODE must be one of ('lite_train_lite_infer' 'lite_train_whole_infer' 'whole_train_whole_infer', 'whole_infer') |
||||||
|
MODE=$2 |
||||||
|
|
||||||
|
dataline=$(cat ${FILENAME}) |
||||||
|
|
||||||
|
# Parse params |
||||||
|
IFS=$'\n' |
||||||
|
lines=(${dataline}) |
||||||
|
task_name=$(parse_first_value "${lines[1]}") |
||||||
|
model_name=$(parse_second_value "${lines[1]}") |
||||||
|
|
||||||
|
# Download pretrained weights |
||||||
|
if [ ${MODE} = 'whole_infer' ]; then |
||||||
|
: |
||||||
|
fi |
||||||
|
|
||||||
|
# Download datasets |
||||||
|
DATA_DIR='./test_tipc/data/' |
||||||
|
mkdir -p "${DATA_DIR}" |
||||||
|
if [[ ${MODE} == 'lite_train_lite_infer' \ |
||||||
|
|| ${MODE} == 'lite_train_whole_infer' \ |
||||||
|
|| ${MODE} == 'whole_train_whole_infer' \ |
||||||
|
|| ${MODE} == 'whole_infer' ]]; then |
||||||
|
|
||||||
|
if [[ ${task_name} == 'cd' ]]; then |
||||||
|
download_and_unzip_dataset "${DATA_DIR}" airchange https://paddlers.bj.bcebos.com/datasets/airchange.zip |
||||||
|
elif [[ ${task_name} == 'clas' ]]; then |
||||||
|
download_and_unzip_dataset "${DATA_DIR}" ucmerced https://paddlers.bj.bcebos.com/datasets/ucmerced.zip |
||||||
|
elif [[ ${task_name} == 'det' ]]; then |
||||||
|
download_and_unzip_dataset "${DATA_DIR}" sarship https://paddlers.bj.bcebos.com/datasets/sarship.zip |
||||||
|
elif [[ ${task_name} == 'seg' ]]; then |
||||||
|
download_and_unzip_dataset "${DATA_DIR}" rsseg https://paddlers.bj.bcebos.com/datasets/rsseg_mini.zip |
||||||
|
fi |
||||||
|
|
||||||
|
fi |
@ -0,0 +1,103 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
|
||||||
|
import os |
||||||
|
|
||||||
|
# Import cv2 and sklearn before paddlers to solve the |
||||||
|
# "ImportError: dlopen: cannot load any more object with static TLS" issue. |
||||||
|
import cv2 |
||||||
|
import sklearn |
||||||
|
import paddle |
||||||
|
import paddlers |
||||||
|
from paddlers import transforms as T |
||||||
|
|
||||||
|
from config_utils import parse_args, build_objects, CfgNode |
||||||
|
|
||||||
|
|
||||||
|
def format_cfg(cfg, indent=0): |
||||||
|
s = '' |
||||||
|
if isinstance(cfg, dict): |
||||||
|
for i, (k, v) in enumerate(sorted(cfg.items())): |
||||||
|
s += ' ' * indent + str(k) + ': ' |
||||||
|
if isinstance(v, (dict, list, CfgNode)): |
||||||
|
s += '\n' + format_cfg(v, indent=indent + 1) |
||||||
|
else: |
||||||
|
s += str(v) |
||||||
|
if i != len(cfg) - 1: |
||||||
|
s += '\n' |
||||||
|
elif isinstance(cfg, list): |
||||||
|
for i, v in enumerate(cfg): |
||||||
|
s += ' ' * indent + '- ' |
||||||
|
if isinstance(v, (dict, list, CfgNode)): |
||||||
|
s += '\n' + format_cfg(v, indent=indent + 1) |
||||||
|
else: |
||||||
|
s += str(v) |
||||||
|
if i != len(cfg) - 1: |
||||||
|
s += '\n' |
||||||
|
elif isinstance(cfg, CfgNode): |
||||||
|
s += ' ' * indent + f"type: {cfg.type}" + '\n' |
||||||
|
s += ' ' * indent + f"module: {cfg.module}" + '\n' |
||||||
|
s += ' ' * indent + 'args: \n' + format_cfg(cfg.args, indent + 1) |
||||||
|
return s |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
CfgNode.set_context(globals()) |
||||||
|
|
||||||
|
cfg = parse_args() |
||||||
|
print(format_cfg(cfg)) |
||||||
|
|
||||||
|
# Automatically download data |
||||||
|
if cfg['download_on']: |
||||||
|
paddlers.utils.download_and_decompress( |
||||||
|
cfg['download_url'], path=cfg['download_path']) |
||||||
|
|
||||||
|
if cfg['cmd'] == 'train': |
||||||
|
train_dataset = build_objects( |
||||||
|
cfg['datasets']['train'], mod=paddlers.datasets) |
||||||
|
train_transforms = T.Compose( |
||||||
|
build_objects( |
||||||
|
cfg['transforms']['train'], mod=T)) |
||||||
|
# XXX: Late binding of transforms |
||||||
|
train_dataset.transforms = train_transforms |
||||||
|
eval_dataset = build_objects(cfg['datasets']['eval'], mod=paddlers.datasets) |
||||||
|
eval_transforms = T.Compose(build_objects(cfg['transforms']['eval'], mod=T)) |
||||||
|
# XXX: Late binding of transforms |
||||||
|
eval_dataset.transforms = eval_transforms |
||||||
|
|
||||||
|
model = build_objects( |
||||||
|
cfg['model'], mod=getattr(paddlers.tasks, cfg['task'])) |
||||||
|
|
||||||
|
if cfg['cmd'] == 'train': |
||||||
|
if cfg['optimizer']: |
||||||
|
if len(cfg['optimizer'].args) == 0: |
||||||
|
cfg['optimizer'].args = {} |
||||||
|
if not isinstance(cfg['optimizer'].args, dict): |
||||||
|
raise TypeError |
||||||
|
if cfg['optimizer'].args.get('parameters', None) is not None: |
||||||
|
raise ValueError |
||||||
|
cfg['optimizer'].args['parameters'] = model.net.parameters() |
||||||
|
optimizer = build_objects(cfg['optimizer'], mod=paddle.optimizer) |
||||||
|
else: |
||||||
|
optimizer = None |
||||||
|
|
||||||
|
model.train( |
||||||
|
num_epochs=cfg['num_epochs'], |
||||||
|
train_dataset=train_dataset, |
||||||
|
train_batch_size=cfg['train_batch_size'], |
||||||
|
eval_dataset=eval_dataset, |
||||||
|
optimizer=optimizer, |
||||||
|
save_interval_epochs=cfg['save_interval_epochs'], |
||||||
|
log_interval_steps=cfg['log_interval_steps'], |
||||||
|
save_dir=cfg['save_dir'], |
||||||
|
learning_rate=cfg['learning_rate'], |
||||||
|
early_stop=cfg['early_stop'], |
||||||
|
early_stop_patience=cfg['early_stop_patience'], |
||||||
|
use_vdl=cfg['use_vdl'], |
||||||
|
resume_checkpoint=cfg['resume_checkpoint'] or None, |
||||||
|
**cfg['train']) |
||||||
|
elif cfg['cmd'] == 'eval': |
||||||
|
state_dict = paddle.load( |
||||||
|
os.path.join(cfg['resume_checkpoint'], 'model.pdparams')) |
||||||
|
model.net.set_state_dict(state_dict) |
||||||
|
res = model.evaluate(eval_dataset) |
||||||
|
print(res) |
@ -0,0 +1,369 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
|
||||||
|
source test_tipc/common_func.sh |
||||||
|
|
||||||
|
FILENAME=$1 |
||||||
|
# $MODE be one of {'lite_train_lite_infer' 'lite_train_whole_infer' 'whole_train_whole_infer', 'whole_infer'} |
||||||
|
MODE=$2 |
||||||
|
|
||||||
|
dataline=$(awk 'NR>=1{print}' $FILENAME) |
||||||
|
|
||||||
|
# Parse params |
||||||
|
IFS=$'\n' |
||||||
|
lines=(${dataline}) |
||||||
|
|
||||||
|
# Training params |
||||||
|
task_name=$(parse_first_value "${lines[1]}") |
||||||
|
model_name=$(parse_second_value "${lines[1]}") |
||||||
|
python=$(func_parser_value "${lines[2]}") |
||||||
|
gpu_list=$(func_parser_value "${lines[3]}") |
||||||
|
train_use_gpu_key=$(func_parser_key "${lines[4]}") |
||||||
|
train_use_gpu_value=$(func_parser_value "${lines[4]}") |
||||||
|
autocast_list=$(func_parser_value "${lines[5]}") |
||||||
|
autocast_key=$(func_parser_key "${lines[5]}") |
||||||
|
epoch_key=$(func_parser_key "${lines[6]}") |
||||||
|
epoch_num=$(func_parser_params "${lines[6]}") |
||||||
|
save_model_key=$(func_parser_key "${lines[7]}") |
||||||
|
train_batch_key=$(func_parser_key "${lines[8]}") |
||||||
|
train_batch_value=$(func_parser_params "${lines[8]}") |
||||||
|
pretrain_model_key=$(func_parser_key "${lines[9]}") |
||||||
|
pretrain_model_value=$(func_parser_value "${lines[9]}") |
||||||
|
train_model_name=$(func_parser_value "${lines[10]}") |
||||||
|
train_infer_img_dir=$(parse_first_value "${lines[11]}") |
||||||
|
train_infer_img_file_list=$(parse_second_value "${lines[11]}") |
||||||
|
train_param_key1=$(func_parser_key "${lines[12]}") |
||||||
|
train_param_value1=$(func_parser_value "${lines[12]}") |
||||||
|
|
||||||
|
trainer_list=$(func_parser_value "${lines[14]}") |
||||||
|
trainer_norm=$(func_parser_key "${lines[15]}") |
||||||
|
norm_trainer=$(func_parser_value "${lines[15]}") |
||||||
|
pact_key=$(func_parser_key "${lines[16]}") |
||||||
|
pact_trainer=$(func_parser_value "${lines[16]}") |
||||||
|
fpgm_key=$(func_parser_key "${lines[17]}") |
||||||
|
fpgm_trainer=$(func_parser_value "${lines[17]}") |
||||||
|
distill_key=$(func_parser_key "${lines[18]}") |
||||||
|
distill_trainer=$(func_parser_value "${lines[18]}") |
||||||
|
trainer_key1=$(func_parser_key "${lines[19]}") |
||||||
|
trainer_value1=$(func_parser_value "${lines[19]}") |
||||||
|
trainer_key2=$(func_parser_key "${lines[20]}") |
||||||
|
trainer_value2=$(func_parser_value "${lines[20]}") |
||||||
|
|
||||||
|
eval_py=$(func_parser_value "${lines[23]}") |
||||||
|
eval_key1=$(func_parser_key "${lines[24]}") |
||||||
|
eval_value1=$(func_parser_value "${lines[24]}") |
||||||
|
|
||||||
|
save_infer_key=$(func_parser_key "${lines[27]}") |
||||||
|
export_weight=$(func_parser_key "${lines[28]}") |
||||||
|
export_shape_key=$(func_parser_key "${lines[29]}") |
||||||
|
export_shape_value=$(func_parser_value "${lines[29]}") |
||||||
|
norm_export=$(func_parser_value "${lines[30]}") |
||||||
|
pact_export=$(func_parser_value "${lines[31]}") |
||||||
|
fpgm_export=$(func_parser_value "${lines[32]}") |
||||||
|
distill_export=$(func_parser_value "${lines[33]}") |
||||||
|
export_key1=$(func_parser_key "${lines[34]}") |
||||||
|
export_value1=$(func_parser_value "${lines[34]}") |
||||||
|
export_key2=$(func_parser_key "${lines[35]}") |
||||||
|
export_value2=$(func_parser_value "${lines[35]}") |
||||||
|
inference_dir=$(func_parser_value "${lines[36]}") |
||||||
|
|
||||||
|
# Params of inference model |
||||||
|
infer_model_dir_list=$(func_parser_value "${lines[37]}") |
||||||
|
infer_export_list=$(func_parser_value "${lines[38]}") |
||||||
|
infer_is_quant=$(func_parser_value "${lines[39]}") |
||||||
|
# Inference params |
||||||
|
inference_py=$(func_parser_value "${lines[40]}") |
||||||
|
use_gpu_key=$(func_parser_key "${lines[41]}") |
||||||
|
use_gpu_list=$(func_parser_value "${lines[41]}") |
||||||
|
use_mkldnn_key=$(func_parser_key "${lines[42]}") |
||||||
|
use_mkldnn_list=$(func_parser_value "${lines[42]}") |
||||||
|
cpu_threads_key=$(func_parser_key "${lines[43]}") |
||||||
|
cpu_threads_list=$(func_parser_value "${lines[43]}") |
||||||
|
batch_size_key=$(func_parser_key "${lines[44]}") |
||||||
|
batch_size_list=$(func_parser_value "${lines[44]}") |
||||||
|
use_trt_key=$(func_parser_key "${lines[45]}") |
||||||
|
use_trt_list=$(func_parser_value "${lines[45]}") |
||||||
|
precision_key=$(func_parser_key "${lines[46]}") |
||||||
|
precision_list=$(func_parser_value "${lines[46]}") |
||||||
|
infer_model_key=$(func_parser_key "${lines[47]}") |
||||||
|
file_list_key=$(func_parser_key "${lines[48]}") |
||||||
|
infer_img_dir=$(parse_first_value "${lines[48]}") |
||||||
|
infer_img_file_list=$(parse_second_value "${lines[48]}") |
||||||
|
save_log_key=$(func_parser_key "${lines[49]}") |
||||||
|
benchmark_key=$(func_parser_key "${lines[50]}") |
||||||
|
benchmark_value=$(func_parser_value "${lines[50]}") |
||||||
|
infer_key1=$(func_parser_key "${lines[51]}") |
||||||
|
infer_value1=$(func_parser_value "${lines[51]}") |
||||||
|
infer_key2=$(func_parser_key "${lines[52]}") |
||||||
|
infer_value2=$(func_parser_value "${lines[52]}") |
||||||
|
|
||||||
|
OUT_PATH="./test_tipc/output/${task_name}/${model_name}/${MODE}" |
||||||
|
mkdir -p ${OUT_PATH} |
||||||
|
status_log="${OUT_PATH}/results_python.log" |
||||||
|
echo "------------------------ ${MODE} ------------------------" >> "${status_log}" |
||||||
|
|
||||||
|
# Parse extra args |
||||||
|
parse_extra_args "${lines[@]}" |
||||||
|
for params in ${extra_args[*]}; do |
||||||
|
IFS=':' |
||||||
|
arr=(${params}) |
||||||
|
key=${arr[0]} |
||||||
|
value=${arr[1]} |
||||||
|
: |
||||||
|
done |
||||||
|
|
||||||
|
function func_inference() { |
||||||
|
local IFS='|' |
||||||
|
local _python=$1 |
||||||
|
local _script="$2" |
||||||
|
local _model_dir="$3" |
||||||
|
local _log_path="$4" |
||||||
|
local _img_dir="$5" |
||||||
|
local _file_list="$6" |
||||||
|
|
||||||
|
# Do inference |
||||||
|
for use_gpu in ${use_gpu_list[*]}; do |
||||||
|
if [ ${use_gpu} = 'False' ] || [ ${use_gpu} = 'cpu' ]; then |
||||||
|
for use_mkldnn in ${use_mkldnn_list[*]}; do |
||||||
|
if [ ${use_mkldnn} = 'False' ]; then |
||||||
|
continue |
||||||
|
fi |
||||||
|
for threads in ${cpu_threads_list[*]}; do |
||||||
|
for batch_size in ${batch_size_list[*]}; do |
||||||
|
for precision in ${precision_list[*]}; do |
||||||
|
if [ ${use_mkldnn} = 'False' ] && [ ${precision} = 'fp16' ]; then |
||||||
|
continue |
||||||
|
fi # Skip when enable fp16 but disable mkldnn |
||||||
|
|
||||||
|
set_precision=$(func_set_params "${precision_key}" "${precision}") |
||||||
|
|
||||||
|
_save_log_path="${_log_path}/python_infer_cpu_usemkldnn_${use_mkldnn}_threads_${threads}_precision_${precision}_batchsize_${batch_size}.log" |
||||||
|
infer_value1="${_log_path}/python_infer_cpu_usemkldnn_${use_mkldnn}_threads_${threads}_precision_${precision}_batchsize_${batch_size}_results" |
||||||
|
set_device=$(func_set_params "${use_gpu_key}" "${use_gpu}") |
||||||
|
set_mkldnn=$(func_set_params "${use_mkldnn_key}" "${use_mkldnn}") |
||||||
|
set_benchmark=$(func_set_params "${benchmark_key}" "${benchmark_value}") |
||||||
|
set_batchsize=$(func_set_params "${batch_size_key}" "${batch_size}") |
||||||
|
set_cpu_threads=$(func_set_params "${cpu_threads_key}" "${threads}") |
||||||
|
set_model_dir=$(func_set_params "${infer_model_key}" "${_model_dir}") |
||||||
|
set_infer_params1=$(func_set_params "${infer_key1}" "${infer_value1}") |
||||||
|
set_infer_params2=$(func_set_params "${infer_key2}" "${infer_value2}") |
||||||
|
|
||||||
|
cmd="${_python} ${_script} ${file_list_key} ${_img_dir} ${_file_list} ${set_device} ${set_mkldnn} ${set_cpu_threads} ${set_model_dir} ${set_batchsize} ${set_benchmark} ${set_precision} ${set_infer_params1} ${set_infer_params2}" |
||||||
|
echo ${cmd} |
||||||
|
run_command "${cmd}" "${_save_log_path}" |
||||||
|
|
||||||
|
last_status=${PIPESTATUS[0]} |
||||||
|
status_check ${last_status} "${cmd}" "${status_log}" "${model_name}" |
||||||
|
done |
||||||
|
done |
||||||
|
done |
||||||
|
done |
||||||
|
elif [ ${use_gpu} = 'True' ] || [ ${use_gpu} = 'gpu' ]; then |
||||||
|
for use_trt in ${use_trt_list[*]}; do |
||||||
|
for precision in ${precision_list[*]}; do |
||||||
|
if [ ${precision} = 'fp16' ] && [ ${use_trt} = 'False' ]; then |
||||||
|
continue |
||||||
|
fi # Skip when enable fp16 but disable trt |
||||||
|
|
||||||
|
for batch_size in ${batch_size_list[*]}; do |
||||||
|
_save_log_path="${_log_path}/python_infer_gpu_usetrt_${use_trt}_precision_${precision}_batchsize_${batch_size}.log" |
||||||
|
infer_value1="${_log_path}/python_infer_gpu_usetrt_${use_trt}_precision_${precision}_batchsize_${batch_size}_results" |
||||||
|
set_device=$(func_set_params "${use_gpu_key}" "${use_gpu}") |
||||||
|
set_benchmark=$(func_set_params "${benchmark_key}" "${benchmark_value}") |
||||||
|
set_batchsize=$(func_set_params "${batch_size_key}" "${batch_size}") |
||||||
|
set_tensorrt=$(func_set_params "${use_trt_key}" "${use_trt}") |
||||||
|
set_precision=$(func_set_params "${precision_key}" "${precision}") |
||||||
|
set_model_dir=$(func_set_params "${infer_model_key}" "${_model_dir}") |
||||||
|
set_infer_params1=$(func_set_params "${infer_key1}" "${infer_value1}") |
||||||
|
set_infer_params2=$(func_set_params "${infer_key2}" "${infer_value2}") |
||||||
|
|
||||||
|
cmd="${_python} ${_script} ${file_list_key} ${_img_dir} ${_file_list} ${set_device} ${set_tensorrt} ${set_precision} ${set_model_dir} ${set_batchsize} ${set_benchmark} ${set_infer_params2}" |
||||||
|
echo ${cmd} |
||||||
|
run_command "${cmd}" "${_save_log_path}" |
||||||
|
|
||||||
|
last_status=${PIPESTATUS[0]} |
||||||
|
status_check $last_status "${cmd}" "${status_log}" "${model_name}" |
||||||
|
|
||||||
|
done |
||||||
|
done |
||||||
|
done |
||||||
|
else |
||||||
|
echo "Currently, hardwares other than CPU and GPU are not supported!" |
||||||
|
fi |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
if [ ${MODE} = 'whole_infer' ]; then |
||||||
|
GPUID=$3 |
||||||
|
if [ ${#GPUID} -le 0 ]; then |
||||||
|
env="" |
||||||
|
else |
||||||
|
env="export CUDA_VISIBLE_DEVICES=${GPUID}" |
||||||
|
fi |
||||||
|
if [ ${infer_model_dir_list} == 'null' ]; then |
||||||
|
echo -e "\033[33m No inference model is specified! \033[0m" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
# Set CUDA_VISIBLE_DEVICES |
||||||
|
eval ${env} |
||||||
|
export count=0 |
||||||
|
IFS='|' |
||||||
|
infer_run_exports=(${infer_export_list}) |
||||||
|
for infer_model in ${infer_model_dir_list[*]}; do |
||||||
|
# Run export |
||||||
|
if [ ${infer_run_exports[count]} != 'null' ]; then |
||||||
|
save_infer_dir="${infer_model}/static" |
||||||
|
set_export_weight=$(func_set_params "${export_weight}" "${infer_model}") |
||||||
|
set_export_shape=$(func_set_params "${export_shape_key}" "${export_shape_value}") |
||||||
|
set_save_infer_key=$(func_set_params "${save_infer_key}" "${save_infer_dir}") |
||||||
|
|
||||||
|
export_cmd="${python} ${infer_run_exports[count]} ${set_export_weight} ${set_save_infer_key} ${set_export_shape}" |
||||||
|
echo ${infer_run_exports[count]} |
||||||
|
eval ${export_cmd} |
||||||
|
|
||||||
|
status_export=$? |
||||||
|
status_check ${status_export} "${export_cmd}" "${status_log}" "${model_name}" |
||||||
|
else |
||||||
|
save_infer_dir=${infer_model} |
||||||
|
fi |
||||||
|
# Run inference |
||||||
|
func_inference "${python}" "${inference_py}" "${save_infer_dir}" "${OUT_PATH}" "${infer_img_dir}" "${infer_img_file_list}" |
||||||
|
count=$((${count} + 1)) |
||||||
|
done |
||||||
|
else |
||||||
|
IFS='|' |
||||||
|
export count=0 |
||||||
|
USE_GPU_KEY=(${train_use_gpu_value}) |
||||||
|
for gpu in ${gpu_list[*]}; do |
||||||
|
train_use_gpu=${USE_GPU_KEY[count]} |
||||||
|
count=$((${count} + 1)) |
||||||
|
ips="" |
||||||
|
if [ ${gpu} = '-1' ]; then |
||||||
|
env="" |
||||||
|
elif [ ${#gpu} -le 1 ]; then |
||||||
|
env="export CUDA_VISIBLE_DEVICES=${gpu}" |
||||||
|
eval ${env} |
||||||
|
elif [ ${#gpu} -le 15 ]; then |
||||||
|
IFS=',' |
||||||
|
array=(${gpu}) |
||||||
|
env="export CUDA_VISIBLE_DEVICES=${array[0]}" |
||||||
|
IFS='|' |
||||||
|
else |
||||||
|
IFS=';' |
||||||
|
array=(${gpu}) |
||||||
|
ips=${array[0]} |
||||||
|
gpu=${array[1]} |
||||||
|
IFS='|' |
||||||
|
env="" |
||||||
|
fi |
||||||
|
for autocast in ${autocast_list[*]}; do |
||||||
|
if [ ${autocast} = 'amp' ]; then |
||||||
|
set_amp_config="Global.use_amp=True Global.scale_loss=1024.0 Global.use_dynamic_loss_scaling=True" |
||||||
|
else |
||||||
|
set_amp_config="" |
||||||
|
fi |
||||||
|
for trainer in ${trainer_list[*]}; do |
||||||
|
if [ ${trainer} = ${pact_key} ]; then |
||||||
|
run_train=${pact_trainer} |
||||||
|
run_export=${pact_export} |
||||||
|
elif [ ${trainer} = "${fpgm_key}" ]; then |
||||||
|
run_train=${fpgm_trainer} |
||||||
|
run_export=${fpgm_export} |
||||||
|
elif [ ${trainer} = "${distill_key}" ]; then |
||||||
|
run_train=${distill_trainer} |
||||||
|
run_export=${distill_export} |
||||||
|
elif [ ${trainer} = ${trainer_key1} ]; then |
||||||
|
run_train=${trainer_value1} |
||||||
|
run_export=${export_value1} |
||||||
|
elif [[ ${trainer} = ${trainer_key2} ]]; then |
||||||
|
run_train=${trainer_value2} |
||||||
|
run_export=${export_value2} |
||||||
|
else |
||||||
|
run_train=${norm_trainer} |
||||||
|
run_export=${norm_export} |
||||||
|
fi |
||||||
|
|
||||||
|
if [ ${run_train} = 'null' ]; then |
||||||
|
continue |
||||||
|
fi |
||||||
|
set_autocast=$(func_set_params "${autocast_key}" "${autocast}") |
||||||
|
set_epoch=$(func_set_params "${epoch_key}" "${epoch_num}") |
||||||
|
set_pretrain=$(func_set_params "${pretrain_model_key}" "${pretrain_model_value}") |
||||||
|
set_batchsize=$(func_set_params "${train_batch_key}" "${train_batch_value}") |
||||||
|
set_train_params1=$(func_set_params "${train_param_key1}" "${train_param_value1}") |
||||||
|
set_use_gpu=$(func_set_params "${train_use_gpu_key}" "${train_use_gpu}") |
||||||
|
# If length of ips >= 15, then it is seen as multi-machine. |
||||||
|
# 15 is the min length of ips info for multi-machine: 0.0.0.0,0.0.0.0 |
||||||
|
if [ ${#ips} -le 15 ]; then |
||||||
|
save_dir="${OUT_PATH}/${trainer}_gpus_${gpu}_autocast_${autocast}" |
||||||
|
nodes=1 |
||||||
|
else |
||||||
|
IFS=',' |
||||||
|
ips_array=(${ips}) |
||||||
|
IFS='|' |
||||||
|
nodes=${#ips_array[@]} |
||||||
|
save_dir="${OUT_PATH}/${trainer}_gpus_${gpu}_autocast_${autocast}_nodes_${nodes}" |
||||||
|
fi |
||||||
|
log_path="${OUT_PATH}/${trainer}_gpus_${gpu}_autocast_${autocast}_nodes_${nodes}.log" |
||||||
|
|
||||||
|
# Load pretrained model from norm training if current trainer is pact or fpgm trainer. |
||||||
|
if ([ ${trainer} = ${pact_key} ] || [ ${trainer} = ${fpgm_key} ]) && [ ${nodes} -le 1 ]; then |
||||||
|
set_pretrain="${load_norm_train_model}" |
||||||
|
fi |
||||||
|
|
||||||
|
set_save_model=$(func_set_params "${save_model_key}" "${save_dir}") |
||||||
|
if [ ${#gpu} -le 2 ]; then # Train with cpu or single gpu |
||||||
|
cmd="${python} ${run_train} ${set_use_gpu} ${set_save_model} ${set_epoch} ${set_pretrain} ${set_autocast} ${set_batchsize} ${set_train_params1} ${set_amp_config}" |
||||||
|
elif [ ${#ips} -le 15 ]; then # Train with multi-gpu |
||||||
|
cmd="${python} -m paddle.distributed.launch --gpus=${gpu} ${run_train} ${set_use_gpu} ${set_save_model} ${set_epoch} ${set_pretrain} ${set_autocast} ${set_batchsize} ${set_train_params1} ${set_amp_config}" |
||||||
|
else # Train with multi-machine |
||||||
|
cmd="${python} -m paddle.distributed.launch --ips=${ips} --gpus=${gpu} ${run_train} ${set_use_gpu} ${set_save_model} ${set_pretrain} ${set_epoch} ${set_autocast} ${set_batchsize} ${set_train_params1} ${set_amp_config}" |
||||||
|
fi |
||||||
|
|
||||||
|
echo ${cmd} |
||||||
|
# Run train |
||||||
|
run_command "${cmd}" "${log_path}" |
||||||
|
status_check $? "${cmd}" "${status_log}" "${model_name}" |
||||||
|
|
||||||
|
if [[ "${cmd}" == *'paddle.distributed.launch'* ]]; then |
||||||
|
cat log/workerlog.0 >> ${log_path} |
||||||
|
fi |
||||||
|
|
||||||
|
set_eval_pretrain=$(func_set_params "${pretrain_model_key}" "${save_dir}/${train_model_name}/model.pdparams") |
||||||
|
# Save norm trained models to set pretrain for pact training and fpgm training |
||||||
|
if [ ${trainer} = ${trainer_norm} ] && [ ${nodes} -le 1 ]; then |
||||||
|
load_norm_train_model=${set_eval_pretrain} |
||||||
|
fi |
||||||
|
# Run evaluation |
||||||
|
if [ ${eval_py} != 'null' ]; then |
||||||
|
log_path="${OUT_PATH}/${trainer}_gpus_${gpu}_autocast_${autocast}_nodes_${nodes}_eval.log" |
||||||
|
set_eval_params1=$(func_set_params "${eval_key1}" "${eval_value1}") |
||||||
|
eval_cmd="${python} ${eval_py} ${set_eval_pretrain} ${set_use_gpu} ${set_eval_params1}" |
||||||
|
run_command "${eval_cmd}" "${log_path}" |
||||||
|
status_check $? "${eval_cmd}" "${status_log}" "${model_name}" |
||||||
|
fi |
||||||
|
# Run export model |
||||||
|
if [ ${run_export} != 'null' ]; then |
||||||
|
log_path="${OUT_PATH}/${trainer}_gpus_${gpu}_autocast_${autocast}_nodes_${nodes}_export.log" |
||||||
|
save_infer_path="${save_dir}/static" |
||||||
|
set_export_weight=$(func_set_params "${export_weight}" "${save_dir}/${train_model_name}") |
||||||
|
set_export_shape=$(func_set_params "${export_shape_key}" "${export_shape_value}") |
||||||
|
set_save_infer_key=$(func_set_params "${save_infer_key}" "${save_infer_path}") |
||||||
|
export_cmd="${python} ${run_export} ${set_export_weight} ${set_save_infer_key} ${set_export_shape}" |
||||||
|
run_command "${export_cmd}" "${log_path}" |
||||||
|
status_check $? "${export_cmd}" "${status_log}" "${model_name}" |
||||||
|
|
||||||
|
# Run inference |
||||||
|
eval ${env} |
||||||
|
if [[ ${inference_dir} != 'null' ]] && [[ ${inference_dir} != '##' ]]; then |
||||||
|
infer_model_dir="${save_infer_path}/${inference_dir}" |
||||||
|
else |
||||||
|
infer_model_dir=${save_infer_path} |
||||||
|
fi |
||||||
|
func_inference "${python}" "${inference_py}" "${infer_model_dir}" "${OUT_PATH}" "${train_infer_img_dir}" "${train_infer_img_file_list}" |
||||||
|
|
||||||
|
eval "unset CUDA_VISIBLE_DEVICES" |
||||||
|
fi |
||||||
|
done # Done with: for trainer in ${trainer_list[*]}; do |
||||||
|
done # Done with: for autocast in ${autocast_list[*]}; do |
||||||
|
done # Done with: for gpu in ${gpu_list[*]}; do |
||||||
|
fi # End if [ ${MODE} = 'infer' ]; then |
Loading…
Reference in new issue