ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ML] Catboost wandb에 로그 올리기
    인공지능 2022. 5. 22. 03:09
    728x90

    Wandb(Weights & Biases) 란?

    Wandb 는 인공지능 실험(ML, DL)을 웹에서 학습과정을 모니터링 하고, 비교분석할 수 있는 Experiment Toolkit이다.

    함께 언급되는 것은 Tensorboard등이 존재한다.


    Wandb는 Pytorch에서 사용시, 매 epoch을 반복할때마다 wandb.log를 사용하여 서버에 결과물을 업로드를 하는 형태를 취한다.

    import wandb
    wandb.init(config=args)
    
    model = ... # set up your model
    
    # Magic
    wandb.watch(model, log_freq=100)
    
    model.train()
    
    for batch_idx, (data, target) in enumerate(train_loader): 
        output = model(data)
        loss = F.nll_loss(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % args.log_interval == 0: 
            wandb.log({"loss": loss}) # for문을 돌면서 학습시, 일정 조건이 있을때만 업로드

    위와 같이 train_loader의 enmerate를 돌면서 반복문이 돌때, wandb.log를 사용한다.

    하지만 ML, Sklearn에서는 for문을 사용해서 iteration을 돌지 않으므로 따로 반복문을 작성하여 매 iteration 정보를 wandb 서버에 올려주는 방법을 사용하기로 하였다. 


    앞서 Catboost의 다양한 metric을 구하기 위해 작업을 했고, 이를 wandb 서버에 올리는것이 최종 목표였다.

    우선적으로 wandb를 catboost에 올려보자.

    import wandb
    
    # project는 어떤 프로젝트에 속하는지, entity는 팀명
    wandb.init(project="movierec_train", entity="egsbj") 
    wandb.run.name = args.wandb_name # 내가 작업할 실험의 이름을 넣어준다. 없을 경우 wandb에서 정해준다
    wandb.config.update(args)

    wandb를 올릴 py파일에 해당코드를 작성해주고, catboost에서 metric을 가져오자.

    custom_loss = ["AUC" , "Accuracy", "Recall", "Precision"]
    list_run = ['learn', 'validation']
    
    model = CatBoostClassifier(iterations=args.iterations,
                           loss_function=args.loss,
                           random_seed=args.seed,
                           custom_loss = custom_loss
                           )
    fit_model = model.fit(X_train,
          y_train,
          cat_features = cat_features,
          eval_set =(X_test, y_test),
          verbose=True)
    
    eval_result = model.get_evals_result() # metric들 모두 받아오기

    eval_result는 이전 포스팅에서 활용했던 것으로, train, validation의 metric들이 모두 저장되어 있다.

    eval_result의 총길이는 iteration의 숫자와 같으므로, 반복문의 길이를 iteration 숫자와 같이 하여 log를 쌓아보자.

    from tqdm import tqdm
    for i in tqdm(range(0,args.iterations)):
        wandb.log({
            "train_Logloss" : eval_result[list_run[0]]['Logloss'][i],
            "train_Accuracy" : eval_result[list_run[0]][custom_loss[1]][i],
            "train_Recall" : eval_result[list_run[0]][custom_loss[2]][i],
            "train_precision " : eval_result[list_run[0]][custom_loss[3]][i],
            "eval_Logloss" : eval_result[list_run[1]]['Logloss'][i],
            "eval_Accuracy" : eval_result[list_run[1]][custom_loss[1]][i],
            "eval_Recall" : eval_result[list_run[1]][custom_loss[2]][i],
            "eval_precision " : eval_result[list_run[1]][custom_loss[3]][i],
            "eval_AUC score " : eval_result[list_run[1]][custom_loss[0]][i]
        })

    그 결과 위와 같이 Wandb에 로그가 잘 올라가게 된다!

    '인공지능' 카테고리의 다른 글

    [ML] Catboost train & valid metric  (0) 2022.04.15

    댓글

Designed by Tistory.