Tistory에서 글을 썼는데 velog가 더 좋다고 많이 추천받아 일로 넘어왔다. 티스토리에 작성된 글을 옮기고 있으니 같은 글이라고 생각하면 된다 :).
Time Series 관련 연구를 하는데 OmniAnomaly라는 논문이 꽤나 많은 인용수가 있어 한번 구현해보려고 해봤지만 2019년 논문이라서 그런지 구현이 쉽게 되지 않았다.
KDD2019 에서 발표한 논문인데 github가 꽤나 불친절하다고 생각한다. 특히 TensorFlow1 버전을 사용하고 있어 현재 Tensorflow 2가 나온 시점부터 많은 에러가 계속 발생되었다.
https://github.com/NetManAIOps/OmniAnomaly
Pytorch로 익숙하지만 구현하고 싶어 2~3시간 끝에 구현에 성공하였다. 하지만 GPU를 사용하지 않아 난감하였고 GPU를 사용하게 이것저것 세팅값을 건들어보니 대략 6시간만에 돌아갔다.
이 밑에는 기억나는 순으로 한번 구현해본걸 다시 끄적여본다. (한국어가 부족해도 이해하길 바란다.. 필자는 외국에서 오래 살아서 한국어 문법이 익숙하지 않다.)
일단 github에 있는 requirements.txt를 깔고 python main.py를 실행해봐도 어림도없다. 여태 마주친 에러를 나열해보고 어떻게 고쳤는지도 작성한다.
컴퓨터 스펙은 RTX3090, Intel I7-11세대 CPU, RAM 256GB 이며 CUDA 11.3 version이다.
이 때문인지 처음 발생한 에러는
이 에러는 tensorflow 1.12.0 (requirements.txt에 있는 초기 값)이 cuda 9.0을 못 찾을때 나타나는 에러인거 같다. 현재 필자가 사용하는 GPU가 11.0이상이므로 이 에러는 tensorflow 버전을 올리도록 노력해봤다
pip install tensorflow==1.14.0
pip install tensorflow-gpu==1.14.0
pip install tensorflow==1.15.0
pip install tensorflow-gpu==1.15.0
pip install tensorflow==1.4.0
pip install tensorflow-gpu==1.4.0
이렇게 설정하였더니 돌아는 갔는데 GPU를 인식을 못했다. 참고로 tensorflow가 gpu를 잘 인식했는지 확인하는 방법은 아래와 같다.
>>> import tensorflow as tf
>>> tf.__version__
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
만약에 name:/device:'GPU:0' 이 보이면 GPU가 잘 인식된거므로 계속 학습을 하면 된다. 하지만 필자는 CPU만 인식이 되어서 구글링 결과 tensorflow 2.5.1로 올리기로 했다.
위에있는 github pull request에 가보면 dependabot이라는 어떤 봇이 2.5.1로 bump했다고 보인다. 사실 이게 정확히 어떤 뜻인지는 모르지만 무작정 tensorflow 버전을 2.5.1로 올려봤다.
pip install tensorflow==2.5.1
pip install tensorflow-gpu==2.5.1
# 가끔 tensorflow만 인식되는 경우가 있어
# tensorflow는 지워버리고 tensorflow-gpu만 남기려고 CPU버전의 tensorflow는 uninstall 해버린다
pip uninstall tensorflow
이렇게 설정하였더니 학습은 되지만 당.연.히 tensorflow v1 로 작성되있는 코드기 떄문에 tensorflow v2 랑 안맞는게 수두룩 나왔다. 그중 필자를 매우 화나게 했던 에러 몇개를 나열해 본다.
이 에러는 tensorflow.contrib가 tensorflow v2에서 삭제되어서 없는 모듈이어서 그렇다. 이럴땐 에러가 위치한 .py 파일명을 들어가서
import tensorflow as tf --> import tensorflow.compat.v1 as tf
# 로 바꿔주면된다.
그러면 안에 모든 tf.xxxx (ex. tf.placeholder()) 이런것이 자동으로 tf.compat.v1 으로 인식하는거다. 즉 v2에서 v1 모듈을 쓰고싶을때 특정한 부분만 v1으로 인식하여라~ 하는 부분인거 같다.
하지만 이런게 JOOOOOOOOOOONA 많기 떄문에 일일히 짜증나게 고쳤다. 더 쉬운 방법이 있을 수는 있겠지만 막 대학원1학년을 진입하는 학생으로써는 이게 더 시간적으로 효율이 있을거 같아 그냥 노가다로 하나씩 파이썬 파일 뜯어가며 일일히 고쳤다. 특히 tfsnippet 이랑 zhushuan 이라는 썩을놈의 모듈을 쓰는데 얘내들이 tensorflow 1 으로 만들어져있어 고치는데 시간투자를 많이했다.
이런 error들은 import tensorflow.compat.v1 as tf 로 첫줄을 바꿔주던가 tf.variable_scope을 tf.compat.v1.variable_scope 등 이렇게 바꾸면 된다.
log는 tf.log --> tf.math.log
#으로 바꾸면 된다.
Tensorflow-probability도 문제가 생길 수 있는데 tensorflow 2.5.1 버전에 맞게 다운그레이드/업그레이드 해주면 된다.
현재 Omnianomaly는 잘 학습되고 있으며 batch size를 256 / 512 로 해보니 VRAM도 22GB 정도 먹으면서 GPU를 활용중이다.