train.py에 있는 parse_config()로 훈련 시 원하는 파라미터 값들을 지정해줄 수 있음
pv-rcnn으로 훈련 실습 중에 model 훈련 시간이 많이 소요됨 (138시간)
Pretrained model로 backbone freeze 학습 진행해보려고 함
train.py
---------------------------------------------------------------------------------------------------------------------------------------
def parse_config():
parser = argparse.ArgumentParser(description='arg parser')
parser.add_argument('--cfg_file', type=str, default=None, help='specify the config for training')
parser.add_argument('--batch_size', type=int, default=None, required=False, help='batch size for training')
parser.add_argument('--epochs', type=int, default=None, required=False, help='number of epochs to train for')
parser.add_argument('--workers', type=int, default=4, help='number of workers for dataloader')
parser.add_argument('--extra_tag', type=str, default='default', help='extra tag for this experiment')
parser.add_argument('--ckpt', type=str, default=None, help='checkpoint to start from')
parser.add_argument('--pretrained_model', type=str, default=None, help='pretrained_model')
parser.add_argument('--launcher', choices=['none', 'pytorch', 'slurm'], default='none')
parser.add_argument('--tcp_port', type=int, default=18888, help='tcp port for distrbuted training')
parser.add_argument('--sync_bn', action='store_true', default=False, help='whether to use sync bn')
parser.add_argument('--fix_random_seed', action='store_true', default=False, help='')
parser.add_argument('--ckpt_save_interval', type=int, default=1, help='number of training epochs')
parser.add_argument('--local_rank', type=int, default=None, help='local rank for distributed training')
parser.add_argument('--max_ckpt_save_num', type=int, default=30, help='max number of saved checkpoint')
parser.add_argument('--merge_all_iters_to_one_epoch', action='store_true', default=False, help='')
parser.add_argument('--set', dest='set_cfgs', default=None, nargs=argparse.REMAINDER,
help='set extra config keys if needed')
parser.add_argument('--max_waiting_mins', type=int, default=0, help='max waiting minutes')
parser.add_argument('--start_epoch', type=int, default=0, help='')
parser.add_argument('--num_epochs_to_eval', type=int, default=0, help='number of checkpoints to be evaluated')
parser.add_argument('--save_to_file', action='store_true', default=False, help='')
parser.add_argument('--use_tqdm_to_record', action='store_true', default=False, help='if True, the intermediate losses will not be logged to file, only tqdm will be used')
parser.add_argument('--logger_iter_interval', type=int, default=50, help='')
parser.add_argument('--ckpt_save_time_interval', type=int, default=300, help='in terms of seconds')
parser.add_argument('--wo_gpu_stat', action='store_true', help='')
parser.add_argument('--use_amp', action='store_true', help='use mix precision training')
args = parser.parse_args()
cfg_from_yaml_file(args.cfg_file, cfg)
cfg.TAG = Path(args.cfg_file).stem
cfg.EXP_GROUP_PATH = '/'.join(args.cfg_file.split('/')[1:-1]) # remove 'cfgs' and 'xxxx.yaml'
args.use_amp = args.use_amp or cfg.OPTIMIZATION.get('USE_AMP', False)
if args.set_cfgs is not None:
cfg_from_list(args.set_cfgs, cfg)
return args, cfg
---------------------------------------------------------------------------------------------------------------------------------------
위 코드가 정의되어 있고 이 중에서 '--pretrained_model' 을 활용
OpenPCDet에서 제공하는 pv-rcnn의 pth를 가지고 훈련 진행함
$ python train.py --cfg_file cfgs/kitti_models/pv_rcnn.yaml --workers 8 --pretrained_model ./pv_rcnn_8369.pth
OpenPCDet에서 backbone freeze 기능 따로 구현하지 않았음
train.py에서 model load 이후 backbone freeze 코드를 추가하면 됨
pv-rcnn 훈련 시 2D backbone과 3D backbone, VFE layer를 고정시켰음
---------------------------------------------------------------------------------------------------------------------------------------
# 추가 #
def freeze_vfe(model):
for param in model.vfe.parameters():
param.requires_grad = False
def freeze_backbone3(model):
for param in model.backbone_3d.parameters():
param.requires_grad = False
def freeze_backbone2(model):
for param in model.backbone_2d.parameters():
param.requires_grad = False
freeze_vfe(model)
freeze_backbone3(model)
freeze_backbone2(model)
optimizer = build_optimizer(model, cfg.OPTIMIZATION)
for name, param in model.named_parameters():
print(name, param.requires_grad)
#####
---------------------------------------------------------------------------------------------------------------------------------------
def main() 함수에서 model 빌드 전에 고정시켜줌
이후 print로 고정되어있는지 확인하면 됨 (고정한 layer는 False로 출력)
훈련 시작 시 이런 식으로 출력됨
시간 줄은 것을 확인할 수 있음
backbone freeze 하기 전
train.py의 각 파라미터 값들 설명
'--cfg_file' : 실험에 사용할 config(.yaml) 파일 경로
'--batch_size' : 배치 크기
'--epochs' : 전체 학습 epoch 수
'--workers' : 한 번에 데이터를 몇 개의 프로세스가 나눠서 읽어올지 지정하는 값
: 값이 클 수록 데이터를 읽어오거나 전처리하는 과정이 빨라짐 (근데 사양에 맞지 않게 크면 오히려 느려짐)
일반적으로 CPU 코어 수의 50~100% 수준으로 사용한다고 한다...
얘를 확인해서 적절히 넣어주면 됨
'--ckpt' : 학습을 이어서 진행할 checkpoint(.pth) 파일 경로 (resume 기능)
관련 함수: detector3d_template.py의 class Detector3DTemplate.load_params_with_optimizer()
'--pretrained_model' : 사전학습된 모델(.pth) 파일 경로
관련 함수: detector3d_template.py의 class Detector3DTemplate.load_params_from_file()
------- 여기서부터는 분산 학습을 진행할 때 사용하는 인자값들인 것 같음 -----------
'--launcher' : 분산 학습을 진행할 때 지정하는 모드
'--tcp_port' : 분산 학습 때 통신에 사용할 포트 번호
'--sync_bn' : 분산 학습 때 BatchNorm 동기화 여부
'--local_rank' : 분산 학습 때 local rank 지정하는 거 (master / worker lank)
'--max_waiting_mins' :
-----------------------------------------------------------------------------------------------------
'--fix_random_seed' : 랜덤시드 고정 (같은 값으로 재현하고 싶을 때 고정)
'--ckpt_save_interval' : 체크 포인트 저장 간격 (에폭 단위로 넣음)
'--max_ckpt_save_num' : 저장할 checkpoint 최대 개수 (오래된 건 삭제되는 이유가 이 인자값의 default = 30)
첨부터 끝까지 저장하고 싶으면 에퍽에 맞게 지정해주면 전부 저장해주는 듯 싶다
'--start_epoch' : 훈련 시작 에폭, resume시에 지정해주면 됨
'--num_epochs_to_eval' : 검증할 체크포인트 에폭 수
'--save_to_file' : 결과를 파일로 저장 여부
'--ckpt_save_time_interval' : checkpoint 저장 주기 (초 단위)
'--extra_tag' :
'--merge_all_iters_to_one_epoch' :
'--set' :
'--use_tqdm_to_record' :
'--logger_iter_interval' :
'--wo_gpu_stat' :
'--use_amp' :
++ 실시간 그래프 확인
OpenPCDet에서는 tensorboard event와 log를 저장해줘서 실시간으로 그래프 확인이 가능함
train.py를 실행시킨 후 tensorboard로 그래프를 확인하면 됨
tensorboard가 install 되어있지 않아서 깔아준 후 실행
$ pip install tensorboard
$ tensorboard --logdir=[event가 저장되어 있는 경로]