최근에 급하게 프로젝트 하나에 조인해서 일주일 정도 급하게 실험을 왕창 돌렸습니다. 저는 보통 학습과 관련된 정보들을 텐서보드를 통해서 기록해두는 편입니다. 텐서보드를 사용하는 이유로는 역시 학습중에 학습이 어떻게 되고 있는지 시각화도 잘 해주고 같은 metric에 대해서 다른 세팅을 한 실험들간 직관적인 비교가 가능한 것도 좋은 것 같습니다 WandB같은 다른 우수한 MLOps 툴들이 있지만 공부를 시작하던 당시에 텐서보드로 시작했기에 역시 익숙한 텐서보드에 손이 가는 것 같습니다.
아무튼 저렇게 많은 수의 실험을 돌리다 보니 나중에 실험 결과를 정리할 때 하나하나 수작업으로 처리하는 것은 절대로 불가능해 보였고, 이걸 .csv로 떨어뜨려서 작업을 해야겠다고 생각했는데, 텐서보드에서 csv를 다운 받으려니 각 metric별 그리고 실험별 csv를 다 하나하나 받아야 했다. 사용한 모델이 5개 나뉘어진 데이터셋이 20개 metric이 8개이니 800개의 파일을 다운해야 했다. 바로 포기했다.
그래서 생각한 것이 어차피 텐서보드 로그는 텐서보드 이벤트에 적혀서 시각화 되는 것일테니 그 로그 자체를 읽어오면 쉽게 자동화 할 수 있을 거라고 생각했다.
역시 뒤져보니 똑똑한 사람들이 필요한 feature를 구현 해뒀더라. 그래서 해당 코드를 적당히 뜯어서 내가 필요한 상황에 맞게 수정하여서 repo를 하나 파뒀으니 필요하신 분들은 확인하시라.
https://github.com/leekichang/tb2csv
GitHub - leekichang/tb2csv: Extract Experiment result from Tensorboard event!
Extract Experiment result from Tensorboard event! Contribute to leekichang/tb2csv development by creating an account on GitHub.
github.com
이제 직접 코드를 뜯어보자. 디테일은 기술하지 않겠다.
"""
code reference
https://github.com/theRealSuperMario/supermariopy/blob/master/scripts/tflogs2pandas.py
"""
def tflog2pandas(path: str) -> pd.DataFrame:
"""convert single tensorflow log file to pandas DataFrame
Parameters
----------
path : str
path to tensorflow log file
Returns
-------
pd.DataFrame
converted dataframe
"""
DEFAULT_SIZE_GUIDANCE = {
"compressedHistograms": 1,
"images": 1,
"scalars": 0, # 0 means load all
"histograms": 1,
}
runlog_data = pd.DataFrame({"metric": [], "value": [], "step": []})
try:
event_acc = EventAccumulator(path, DEFAULT_SIZE_GUIDANCE)
event_acc.Reload()
tags = event_acc.Tags()["scalars"]
for tag in tags:
event_list = event_acc.Scalars(tag)
values = list(map(lambda x: x.value, event_list))
step = list(map(lambda x: x.step, event_list))
r = {"metric": [tag] * len(step), "value": values, "step": step}
r = pd.DataFrame(r)
runlog_data = pd.concat([runlog_data, r])
# Dirty catch of DataLossError
except Exception:
print("Event file possibly corrupt: {}".format(path))
traceback.print_exc()
return runlog_data
결국 EventAccumulator라는 함수에 읽고자 하는 텐서보드 로그 파일을 집어넣으면 log를 쌓아서 돌려준다. 거기서 내가 기록한 tag들에 대해서 값을 단순히 쌓아서 pandas DataFrame에 때려박아주는 것이 다다. 조금 코드를 예쁘게 수정하실 분은 수정하시는 것이 좋아보인다. 본인은 시간도 없고 열정도 없어서 그냥 그대로 사용했다... 나중에 기회가 되면 예쁘게 수정해봐야겠다.
뭐 이런식으로 dataframe을 만들어준다. 사실이제 적당히 metric 별로 잘라서 csv에 넣으면 끝이고 그 부분은 github 레포를 확인하시라. 또한 기본적으로 나는 YYYY-MM-DD_HHMMSS_{keyword}_{data} 뭐 이런식으로 정리하는데, keyword에는 model specification을 뭐 {model_batchsize_lr} 이런식으로 넣어두고 dataset 별로 결과를 확인하는 방식이기 때문에 정리가 저런식으로 되어 있는 경우에만 잘 동작하는 코드이니 나머지 코드는 진짜 참고만 하시라.
또 기록할거리 생기면 오겠다...
'삽질 노트' 카테고리의 다른 글
CT image의 Axial, Coronal axis 분류하기 (1) | 2023.08.08 |
---|---|
TCP, HTTP, etc 터널링 with ngrok (3) | 2023.06.23 |
박사학위과정 전문연구요원 준비 (1) - 한국사능력검정시험 준비 후기 (4) | 2023.04.17 |
윈도우 caps lock -> 한/영 키로 만들기 (1) | 2023.01.04 |
윈도우 Terminal 꾸미기 (Windows terminal theme 설정, Oh-My-Posh, 배경이미지 넣기) (2) | 2023.01.04 |