Model.fit 후에 세션이 종료되고 램을 놔주지 않는 현상이 있다.

* 케라스 내부적으로 해결이 되지 않은 이슈라는 글을 본적이 있다. 


1. del model    * 해결되지 않음

2. gc.collect() + gc.collect() 여러번    * 해결되지 않음

3. tf.as_default_graph() 안에서 처리    * 해결되지 않음

4. K.clear_session()    * Case by Case

* 사용은 하고 있지만 죽는 경우도 있고, 안죽는 경우도 있었습니다. jupyter notebook의 경우 같은 cell 안에서 fit과 함께 실행시킨 경우에 될지도 모르겠네요. 

5. 확실한 방법. + 이 방법과 비슷하게 프로세스를 죽이는 방법도 있음. nvidia-smi를 통해 PID를 확인한 후 kill

from numba import cuda
cuda.select_device(num)
cuda.close()

 

사용가능한 gpu의 list를 보려면 다음과 같이 입력해서 확인합니다.

후에 출력되는 name부분을 보시면 됩니다.

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())


현재 2개의 gpu를 가지고 있다고 생각하면 cpu:0, gpu:0, gpu:1로 나타낼 수 있습니다.

os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID";
# 1번째 gpu를 사용하고 싶다면, 
os.environ["CUDA_VISIBLE_DEVICES"]="1";  

더해서

with K.tf.device('/gpu:1'):
	~
    model.fit(~)
    ~

의 방법도 있습니다.

 

Ndivia driver 삭제

sudo apt-get remove --purge '^nvidia-.*' 

 

CUDA 삭제

sudo apt-get --purge remove 'cuda*'
sudo apt-get autoremove --purge 'cuda*'

CUDA 파일 삭제

sudo rm -rf /usr/local/cuda
or
sudo rm -rf /usr/local/cuda-10.0

 

machine learning 분야에서 성능에 가장 중요한 영향을 끼치는 요소 중 하나가 데이터인 것에는 틀림이 없습니다. 

train시에 input을 어떤 데이터로 구성하느냐에 따라 성능이 향상할지 감소할지가 결정되죠.

이때 주로 사용하게 되는 것이 CV(cross-validation)방법입니다. 

test set을 제외하고 모든 데이터를 사용하여 학습을 시키게 되며 이 중 어느 부분은 validation set(Dev-set)으로 쪼개지게되어 성능을 검증하는데 사용하게 됩니다. 

train_idx, val_idx = train_test_split(its, train_size = 0.8, random_state = 80)

하지만 여러가지 이유(시간 부족, 학습 환경 부실)로 인해 CV를 사용하기가 힘든 경우라면?

신경망을 한번 학습시키는데만 해도 엄청난 시간이 필요하며 한 cycle(큰 수의 epoch)을 돌리는데 시간 뿐만 아니라 학습 환경또한 벅찬 경우가 있습니다. 


train set으로 학습시키고 validation set으로 검증한 뒤, test set을 사용하여 최종 결과물을 낸 model이 있습니다.

하지만 이 모델은 validation set으로 사용한 데이터를 한번도 보지 못했기때문에 아마(100% 확실하지 않기 떄문) 성능이 떨어질거라고 예상됩니다. 모델은 데이터를 많이 보면 볼수록 견고(robust)해지고, 최종적으로 일반적이게 되니까요.

그럼 우리는 최종 모델을 어떻게든 저장을 했을 겁니다. hdf5든 h5든 어떠한 형식으로든요. 다시 로드해서 이번엔 split 과정을 거치지 않습니다. 모델을 더욱 강화시키기 위해서 entire set으로 retrain시킵니다. 이때 당연한 사실이지만 반드시 test set은 건들지 말아야합니다.

이렇게 해서 새롭게 얻어진 모델로 inference를 하여 최종 성능을 얻을 수 있습니다. 

이상적으로 CV를 통해 score를 얻을 수 있다면, 이를 이용해서 비교헀을때 성능이 유사함을 알 수 있습니다.

  • Glorot(Xavier) = None, Tanh, Logistic, Softmax

  • He = ReLU 

  • LeCun = SELU